简单绑定功能在 python 中不起作用
Simple bind function doesn't work in python
我目前正在制作一款冒险游戏,我想将 alt+a 绑定到我的回调。它不符合我的要求,所以我有两个问题:
- 是否也可以将函数绑定到标签?
- 为什么这个(简化的)代码不起作用?
代码如下:
import tkinter as tk
dw = tk.Tk()
dw.title('Hearts')
def play(event):
print('This is the test.')
areal = tk.Frame(master=dw, width=1200, height=600, bg='blue')
areal.pack_propagate(0)
areal.pack(fill=tk.BOTH, expand=bool(dw))
areal.bind("<Alt-A>", play)
dw.mainloop()
它没有给我一个错误,但是当我单击框架然后按 alt+a 时它没有做任何事情。这里有什么问题?
编辑:
import tkinter as tk
def go_fwd(event):
areal.focus_set()
print(event.x, event.y)
dw = tk.Tk()
dw.title('Adventure')
areal = tk.Frame(master=dw, width=20000, height=600, bg='blue')
areal.pack_propagate(0)
areal.pack(fill=tk.BOTH, expand=bool(dw)-100)
areal.focus_set()
dw.bind("<Alt-A>", go_fwd)
enter = tk.Frame(master=dw, width=20000, height=100, bg='cyan')
enter.pack(fill=tk.X)
enterentry = tk.Text(master=enter, width=100, height=4, bg='white')
enterentry.pack()
enterbutton = tk.Button(master=enter, text='Senden', bg='red')
enterbutton.pack()
dw.mainloop()
这是完整的代码。
您需要绑定到 dw
而不是您的框架。
所以,你可以做到 dw.bind("<Alt-A>", play)
。
小注,Alt-A
将按预期绑定到 大写字母 A,因此您必须单击键盘上的 Alt+Shift+A
。在键盘上执行 Alt+A
将不起作用,您必须绑定到 Alt-a
才能起作用。
主要 window 有键盘焦点。或者,您也可以将绑定留在框架上,只需执行 areal.focus_set()
即可将焦点设置到框架上。
Is it possible to bind a function to a Label, too?
您可以绑定到任何您想要的小部件。但是,如果您绑定键事件,则绑定仅在小部件具有焦点时才有效。默认情况下,除 Entry
和 Text
之外的大多数小部件都不会获得焦点,除非您明确地将焦点设置给它们。
注意:一次只能有一个小部件获得键盘焦点。
您还可以设置到根的绑定 window,无论哪个小部件获得焦点,它都会触发。
有关如何处理键绑定的更详尽的解释,请参阅此答案:
Why does this (simplyfied) code doesn't work?
它没有按您预期的方式工作,因为绑定是在框架小部件上,但该小部件没有键盘焦点。你可以像这样给它焦点:
areal.focus_set()
或者,您只能在单击框架后通过在鼠标单击时创建绑定来为其提供焦点:
areal.bind("<1>", lambda event: areal.focus_set())
注意: 您绑定的是大写字母 "A",因此请确保在测试时您按下的是 control-alt-a
我目前正在制作一款冒险游戏,我想将 alt+a 绑定到我的回调。它不符合我的要求,所以我有两个问题:
- 是否也可以将函数绑定到标签?
- 为什么这个(简化的)代码不起作用?
代码如下:
import tkinter as tk
dw = tk.Tk()
dw.title('Hearts')
def play(event):
print('This is the test.')
areal = tk.Frame(master=dw, width=1200, height=600, bg='blue')
areal.pack_propagate(0)
areal.pack(fill=tk.BOTH, expand=bool(dw))
areal.bind("<Alt-A>", play)
dw.mainloop()
它没有给我一个错误,但是当我单击框架然后按 alt+a 时它没有做任何事情。这里有什么问题?
编辑:
import tkinter as tk
def go_fwd(event):
areal.focus_set()
print(event.x, event.y)
dw = tk.Tk()
dw.title('Adventure')
areal = tk.Frame(master=dw, width=20000, height=600, bg='blue')
areal.pack_propagate(0)
areal.pack(fill=tk.BOTH, expand=bool(dw)-100)
areal.focus_set()
dw.bind("<Alt-A>", go_fwd)
enter = tk.Frame(master=dw, width=20000, height=100, bg='cyan')
enter.pack(fill=tk.X)
enterentry = tk.Text(master=enter, width=100, height=4, bg='white')
enterentry.pack()
enterbutton = tk.Button(master=enter, text='Senden', bg='red')
enterbutton.pack()
dw.mainloop()
这是完整的代码。
您需要绑定到 dw
而不是您的框架。
所以,你可以做到 dw.bind("<Alt-A>", play)
。
小注,Alt-A
将按预期绑定到 大写字母 A,因此您必须单击键盘上的 Alt+Shift+A
。在键盘上执行 Alt+A
将不起作用,您必须绑定到 Alt-a
才能起作用。
主要 window 有键盘焦点。或者,您也可以将绑定留在框架上,只需执行 areal.focus_set()
即可将焦点设置到框架上。
Is it possible to bind a function to a Label, too?
您可以绑定到任何您想要的小部件。但是,如果您绑定键事件,则绑定仅在小部件具有焦点时才有效。默认情况下,除 Entry
和 Text
之外的大多数小部件都不会获得焦点,除非您明确地将焦点设置给它们。
注意:一次只能有一个小部件获得键盘焦点。
您还可以设置到根的绑定 window,无论哪个小部件获得焦点,它都会触发。
有关如何处理键绑定的更详尽的解释,请参阅此答案:
Why does this (simplyfied) code doesn't work?
它没有按您预期的方式工作,因为绑定是在框架小部件上,但该小部件没有键盘焦点。你可以像这样给它焦点:
areal.focus_set()
或者,您只能在单击框架后通过在鼠标单击时创建绑定来为其提供焦点:
areal.bind("<1>", lambda event: areal.focus_set())
注意: 您绑定的是大写字母 "A",因此请确保在测试时您按下的是 control-alt-a