【问题标题】:Simple bind function doesn't work in python简单的绑定函数在 python 中不起作用
【发布时间】:2016-04-15 16:32:13
【问题描述】:

我目前正在创建一个冒险游戏,我想将 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()

这是完整的代码。

【问题讨论】:

标签: python python-3.x tkinter bind


【解决方案1】:

是否也可以将函数绑定到标签?

您可以绑定到任何您想要的小部件。但是,如果您绑定键事件,则绑定仅在小部件具有焦点时才有效。默认情况下,除EntryText 之外的大多数小部件都不会获得焦点,除非您明确将焦点设置给它们。

注意:一次只能有一个小部件具有键盘焦点。

您还可以设置与根窗口的绑定,无论哪个小部件具有焦点,它都会触发它。

有关如何处理键绑定的更详尽说明,请参阅此答案:https://stackoverflow.com/a/11542200/7432

为什么这个(简化的)代码不起作用?

它没有按您期望的方式工作,因为绑定在 Frame 小部件上,但该小部件没有键盘焦点。你可以通过这样的方式来关注它:

areal.focus_set()

或者,您只能在单击框架后通过在鼠标单击上创建绑定来使其获得焦点:

areal.bind("<1>", lambda event: areal.focus_set())

注意:您绑定的是大写“A”,因此请确保在测试时您按下的是 control-alt-a

【讨论】:

    【解决方案2】:

    您需要绑定到dw 而不是您的框架。

    所以,你可以dw.bind("&lt;Alt-A&gt;", play)

    一个小提示,Alt-A 将按预期绑定到 大写 A,因此您必须单击键盘上的 Alt+Shift+A。在键盘上执行Alt+A 将不起作用,您必须绑定到Alt-a 才能使其起作用。

    主窗口具有键盘焦点。或者,您也可以将绑定保留在框架上,然后执行areal.focus_set() 将焦点设置到框架。

    【讨论】:

    • 但是为什么左键可以正常工作而不是alt+a
    • @ErichSchmidt:关键事件转到具有焦点的小部件。按钮事件转到光标下的小部件。这就是为什么按钮绑定的行为似乎与键绑定不同的原因。
    • @BryanOakley:如何使用按键执行回调?
    • @ErichSchmidt:按照此答案中的说明进行操作。要么将焦点赋予具有绑定的小部件,要么将绑定放在具有焦点的小部件上。默认情况下,单击一个框架不会为其提供焦点,因此第三种解决方案是向框架添加另一个绑定,以便在单击时设置焦点。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多