如何添加键绑定?

时间:2018-05-23 18:09:17

标签: python python-3.x tkinter

没有其他stackoverflow建议,也没有任何其他外部文档向我展示如何成功地将键绑定到函数。以下是我尝试过的链接(代码复制和粘贴),没有运气。我看到很多人认为焦点是失败的原因,好像包含按钮的框架不是用户的目标,因此不活跃;然而,没有任何东西来自于此。以下是我尝试过的链接:

http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

https://softwareengineering.stackexchange.com/questions/213935/why-use-classes-when-programming-a-tkinter-gui-in-python

python tkinter how to bind key to a button

http://www.java2s.com/Code/Python/GUI-Tk/SetButtontogetfocus.htm

How to bind a keypress to a button in Tkinter

我在PyCharm 5.0.4中运行Python 3.6。

上面链接中的代码是我一直在使用/修改以查看它是如何工作的,但是没有一次尝试以正在执行的操作结束。我得到的最远的是一条错误信息。

感谢。

编辑:我在下面使用的代码(来自最近的链接)

from tkinter import *
root = Tk()

def LeftTurn(event):
    print('left')
frame=Frame(root, width=100, height=100)
frame.bind("<Left>", LeftTurn)   #Binds the "left" key to the frame and exexutes yourFunction if "left" key was pressed
frame.pack()


root.geometry("640x480")
root.title("Rover ")


root.mainloop()

我也试过这个(下面)

from tkinter import *

root = Tk()

def yourFunction(event):
    print('left')

frame = Frame(root, width=100, height=100)

frame.bind("<Left>",yourFunction)   #Binds the "left" key to the frame and exexutes yourFunction if "left" key was pressed
frame.pack()

root.mainloop()

2 个答案:

答案 0 :(得分:1)

你是对的,这是一个焦点问题。用户无法专注于Frame,因此您必须通过添加

来为它们做到这一点。
frame.focus()

或者你可以绑定到不会失焦的东西,比如根窗口:

root.bind("<Left>", LeftTurn) 

答案 1 :(得分:1)

所以你的框架需要以某种方式获得焦点才能使你的绑定工作。

请参阅下面的示例代码。如果单击测试按钮,焦点将设置为框架,您可以按左箭头键,您的功能将打印到控制台。如果然后在输入字段内单击,焦点将移动到输入字段,并且在框架再次获得焦点之前,绑定将不再有效。

所以这对某些东西很有用,但我从来没有真正需要绑定到“框架”,而是根目录或顶层窗口或可以直接与键盘或鼠标交互的特定小部件,如Entry或Text。 / p>

from tkinter import *


root = Tk()

def LeftTurn(event):
    print('left')

frame=Frame(root)
Button(frame, text="test", command= frame.focus).pack()
Entry(frame).pack()

frame.bind('<Left>', LeftTurn)
frame.pack()

root.mainloop()

您可能希望绑定到root而不是此代码。这将始终不会触发根窗口中的哪个小部件被点击或在哪个框架中。

from tkinter import *


root = Tk()

def LeftTurn(event):
    print('left')

frame=Frame(root)
Button(frame, text="Button").pack()

root.bind('<Left>', LeftTurn)
frame.pack()

root.mainloop()