<event> 和 <<event>> 之间的 Tkinter 区别

Tkinter difference between <event> and <<event>>

我很难在 Internet 上查找此内容 - 我的搜索技巧还不够好。我可以记住事件名称,但我总是要查找要使用的尖括号类型

一些 tkinter 事件与 <> 中的单词绑定,例如

tab4e.bind("<Button-1>",f_x)

其他在<<>>,例如

nbook.bind('<<NotebookTabChanged>>', handle_tab_changed)

为什么有些绑定在 <> 中,而另一些在 <<>> 中?

尽管 python 中给出了示例,但我添加了 TCL,以防 TCL 编码人员可能知道答案。

具有一组括号的绑定是 built-in 由底层 OS 直接支持的事件。示例包括 <KeyPress><ButtonPress-1><Configure> 等等。大多数 built-in 事件与实际的物理事件直接相关,例如按下鼠标按钮或键盘上的按键。

与 double-brackets 的绑定称为 虚拟事件。它们不一定代表任何类型的物理事件,并且通常(尽管不总是)是特定小部件所独有的。例如,<<ListboxSelect>>仅供列表框使用,<<NotebookTabChanged>>仅供ttk笔记本使用,等等。

虚拟事件可以通过使用 event_add 小部件方法的其他事件的组合来触发,尽管它们也可以通过调用 event_generate.

来生成

tcl/tk 手册页包括 list of predefined virtual events

(保留@Oakley 的回答)

这是自定义事件的示例:

from tkinter import *
import random

def button_click():
    num = random.randint(1,10)  # data to pass, state must be integer
    root.event_generate("<<myevent>>", when="tail", state=num)  # add event to end of event queue, pass state (optional)

def myhandler(evt):  # handle custom event
    print('custom event handled', evt.state)

root = Tk()

button = Button(root, text="Click Me!", command=button_click)
root.bind("<<myevent>>", myhandler)  # create custom event and set handler

button.pack() 
root.mainloop()