vol*_*ldi 7 python events virtual tkinter
在 tkinter 中编写一些简单的 gui 应用程序时,我遇到了一些小问题。假设我有自定义菜单小部件(源自 tk.Menu)和自定义画布小部件(源自 tk.Canvas)。
我想从菜单回调函数生成事件并在画布小部件中调用它。我需要这样做,因为将来我想添加更多小部件,这些小部件应该对菜单中的单击位置做出反应。
我试图这样做:
自定义菜单:
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
Run Code Online (Sandbox Code Playgroud)
自定义画布:
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
Run Code Online (Sandbox Code Playgroud)
当我单击菜单中的位置时,_handler 回调被正确调用并生成事件 <>,但没有调用 on_event 回调。我尝试添加 when='tail' 参数,添加 self.update() 等,但没有任何结果。有人知道怎么做吗?
您需要将绑定添加到获取事件的小部件。在您的情况下,您正在菜单上生成事件,因此您需要绑定到菜单。
您还可以在画布上生成事件,并将绑定保留在画布上。或者,将事件与根窗口关联,并绑定到根窗口。
一种常见的技术(在某些情况下由 tkinter 本身使用)是在根窗口上生成事件,然后在根窗口(或所有具有 的窗口bind_all)上对该事件进行单个绑定。然后,单个绑定必须通过某种方式确定要影响哪个窗口(通常,例如,通过获取具有键盘焦点的窗口)。
当然,如果您有办法确定哪个小部件获得绑定,则可以在生成事件时使用该方法直接在相应的小部件上生成事件。
有关详细信息,请参阅事件和绑定,特别是该文档中标题为“实例和类绑定”的部分。
| 归档时间: |
|
| 查看次数: |
9913 次 |
| 最近记录: |