python - Tkinter 在不同的小部件之间生成和调用虚拟事件

标签 python events tkinter virtual

在用 tkinter 编写一些简单的 gui 应用程序时,我遇到了一些小问题。假设我有自定义菜单小部件(派生自 tk.Menu)和自定义 Canvas 小部件(派生自 tk.Canvas)。

我想从菜单回调函数生成事件并在 Canvas 小部件中调用它。我需要这样做,因为将来我想添加更多的小部件,这些小部件应该对菜单中的点击位置使用react。

我试过这样做:

自定义菜单:

class MainMenu(tk.Menu):

    def __init__(self, parent):
       tk.Menu.__init__(self, parent)
       self.add_comand(label='foo', self._handler)
       return

    def _handler(self, *args):
        print('handling menu')       
        self.event_generate('<<abc>>')
        return

自定义 Canvas :

class CustomCanvas(tk.Canvas): 
    def __init__(self, parent, name=''):
        tk.Canvas.__init__(self, parent)
        self.bind('<<abc>>', self.on_event)
        return

    def on_event(self, event):
       print(event)
       return

当我单击菜单中的位置时,会正确调用_handler 回调并生成事件<>,但不会调用on_event 回调。我尝试添加 when='tail' 参数,添加 self.update() 等,但没有任何结果。有人知道怎么做吗?

最佳答案

您需要将绑定(bind)添加到获取事件的小部件。在您的情况下,您正在菜单上生成事件,因此您需要绑定(bind)到菜单。

您还可以在 Canvas 上生成事件,并在 Canvas 上保留绑定(bind)。或者,将事件关联到根窗口,并绑定(bind)到根窗口。

一种常见的技术——在某些情况下由 tkinter 本身采用——是在根窗口上生成事件,然后在根窗口上有一个单一的绑定(bind)(或者对于所有带有 bind_all 的窗口) >) 为那个事件。然后,单一绑定(bind)必须通过某种方式确定要影响哪个窗口(通常,例如,通过获取具有键盘焦点的窗口)。

当然,如果您有确定哪个小部件获得绑定(bind)的方法,则可以在生成事件时使用该方法直接在适当的小部件上生成事件。

有关详细信息,请参阅 Events and Bindings ,特别是该文档中标题为“实例和类绑定(bind)”的部分。

关于python - Tkinter 在不同的小部件之间生成和调用虚拟事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31798723/

相关文章:

python - 如何在 App Engine 和 Python 上使用 Bigquery streaming insertall

python - 函数在Python Tkinter中不起作用吗?

python - 将 print() 的输出发送到 tkinter Text 小部件

wpf - 带有嵌套 ListView 双击事件的 ListView 会触发两次

events - 将事件处理程序绑定(bind)到多个元素 jQuery?

python - 如何在 macOS Sierra 上使用 tkinter 模块

python - 如何关闭tempfile.mkstemp的句柄?

python - 遍历 pandas DataFrame 中的每个元素

python - 将 C 数组转换为 Python 字节

javascript - 动态生成页面中的事件处理