如何在 tkinter 中创建虚拟事件

如何在 tkinter 中创建虚拟事件#

任何图形用户界面应用程序都需要良好的事件系统来检测用户的操作,并据此作出反应(例如:当按钮被点击时显示提示)。Tkinter 为我们内部处理了大部分这些功能,我们所要做的就是告诉 tkinter 调用哪个函数(就像按钮中的命令参数那样)。

Tkinter 还允许我们直接将这些事件与自己定义的函数“绑定”,如下面的例子所示。

root.bind('<Enter>', FunctionCall)

上面使用的事件是 '<Enter>',它在键盘上的“Enter”键被按下时触发。

这是非常棒的系统,但有时可能希望有“自定义事件”,它代表与应用程序相关的一些重要事项。例如,绘图应用程序可能想要像“图表已更新”、“图表已清除”、“图表已绘制”等事件。

创建自定义事件涉及三个步骤。

  1. 首先,将事件“添加”到特定的小部件(例如,一个按钮、一个框架甚至是根应用程序)。在这里,我们定义事件名称以及触发它的“事件”。

  2. 定义函数来“处理”事件。

  3. 将新事件绑定到新定义的函数上。

  4. 要创建事件,将使用 event_add() 方法。第一个参数是事件名称。如下面所示,需要将名称用双鳄鱼括号括起来。

root.event_add('<<custom-event>>', '<Button-3>')

从第二个参数开始,你可以传递“序列”或“事件”,这些定义了哪些事件将触发你的事件(比如鼠标按键点击,或者特定键的按下)。这些都是由 Tkinter 本身定义和处理的事件。

在上述代码中,我们将事件绑定到“Button-3”,这代表鼠标右键点击。

接下来,定义简单的函数。重要的是要记住,任何你计划用于事件的函数都必须有事件参数。这将由Tkinter自动传入,并将包含有关触发该函数的事件的信息。

def hello(event):
    print(event)

接下来,使用 bind() 函数将这个函数绑定到事件上。

root.bind('<<custom-event>>', hello)

完整代码:

from tkinter import Tk

def hello(event):
    print(event)
 
root = Tk()
 
root.event_add('<<custom-event>>', '<Button-3>')
root.bind('<<custom-event>>', hello)
 
root.mainloop()

尝试运行这段代码,并点击鼠标最右边的按钮。你应该会得到如下输出:

<ButtonPress event num=3 x=159 y=69>

tkinter 中删除虚拟事件#

你还可以通过添加额外的参数来为自定义事件选择添加“触发器”。你可以传递的额外参数数量没有限制。

root.event_add('<<custom-event>>', '<Button-3>', '<KeyPress>')

现在,如果点击了 Button-3 或按下键盘上的任何键,我们的事件将被触发。

要删除事件,我们只需调用 event_delete() 并传入事件名称即可。

def remove_event(event):
    root.event_delete('<<custom-event>>')
 
root = tk.Tk()
 
root.event_add('<<custom-event>>', '<Button-3>', '<KeyPress>')
root.bind('<<custom-event>>', remove_event)
 
root.mainloop()

您也可以选择仅移除特定的触发因素。

def remove_event(event):
    root.event_delete('<<custom-event>>', '<Button-3>')

上述代码阻止 custom-eventButton-3 上触发,但对于按键操作仍然有效。