以下是我使用 .trace_add() 方法和使用 @987654321 共享的类的绑定标签之后的自定义绑定标签的发现和结论@。希望能给 tkinter 用户带来好处。
相反,在关联变量上设置跟踪。有一个变量
跟踪,你的回调函数将在变量有后被调用
已设置,并且每次值更改时都会调用,即使
更改不是由事件完成的。
我发现了以下内容:
.trace_add() 方法执行的回调将始终在ttk.Checkbutton 小部件的命令选项方法/函数之前。
- 另外,如果
ttk.Checkbutton的变量值在ttk.Checkbutton小部件的命令选项方法/函数执行期间发生变化,.trace_add()方法的回调将在小部件的命令选项方法的中途执行/功能。意思是,.trace_add() 方法的回调可以在一个完整的事件流中多次执行。
为了说明以上几点,下面是我编写的测试代码的打印输出语句。测试代码包含 4 个 ttk.Checkbutton 小部件,在打开时分别具有控制变量值 B1、B2、B3、B4,在关闭时分别具有“0”值。单击时,ttk.Checkbutton 将在开启和关闭状态之间切换。但是,必须始终打开至少一个ttk.Checkbutton。最初,这些按钮都是打开的。接下来,依次单击这些按钮以关闭。语句### Callback #### 是从.trace_add() 方法的回调中打印出来的。从### Command Trigger 0 ### 到### Command Trigger 1 ### 的打印输出发生在ttk.Checkbutton 小部件的command 选项的方法/函数的开头和结尾。
打印报表:
# B1 ttk.Checkbutton clicked on
#++ Callback ++++ Button variable values = ['0', 'B2', 'B3', 'B4'] 3
### Command Trigger 0 ### Button variable values = ('0', 'B2', 'B3', 'B4') 3
cb=.!App.!checkbutton text=B1 variable=B1 Checkbutton variable
nchosen != 0
### Command Trigger 1 ### Button variable values = ('0', 'B2', 'B3', 'B4') 3
# B2 ttk.Checkbutton clicked on
#++ Callback ++++ Button variable values = ['0', '0', 'B3', 'B4'] 2
### Command Trigger 0 ### Button variable values = ('0', '0', 'B3', 'B4') 2
cb=.!App.!checkbutton2 text=B2 variable=B2 Checkbutton variable
nchosen != 0
### Command Trigger 1 ### Button variable values = ('0', '0', 'B3', 'B4') 2
# B3 ttk.Checkbutton clicked on
#++ Callback ++++ Button variable values = ['0', '0', '0', 'B4'] 1
### Command Trigger 0 ### Button variable values = ('0', '0', '0', 'B4') 1
cb=.!App.!checkbutton3 text=B3 variable=B3 Checkbutton variable
nchosen != 0
### Command Trigger 1 ### Button variable values = ('0', '0', '0', 'B4') 1
# B4 ttk.Checkbutton clicked on
#++ Callback ++++ Button variable values = ['0', '0', '0', '0'] 0
### Command Trigger 0 ### Button variable values = ('0', '0', '0', '0') 0
cb=.!App.!checkbutton4 text=B4 variable=B4 Checkbutton variable
nchosen == 0
#++ Callback ++++ Button variable values = ['0', '0', '0', 'B4'] 1
### Command Trigger 1 ### Button variable values = ('0', '0', '0', 'B4') 1
意义:
由于.trace_add() 方法的回调总是先于ttk.Checkbutton 小部件的command 选项的方法/函数的执行,并且可以在ttk.Checkbutton 小部件的@987654347 的方法/函数执行期间发生@选项在每个事件流期间,.trace_add()方法的回调内容必须预见到这种情况。
另一种解决方案是创建一个自定义绑定标签
类的绑定标签。
...,回调将在
该事件被默认绑定处理后的按钮
小部件类。
我相信术语回调 应该被称为事件处理程序。在任何情况下,这种安排的打印输出声明如下所示。 证明事件处理程序将始终在ttk.Checkbutton 小部件的命令选项方法/功能完全执行后执行。 与使用.trace_add() 方法的流程不同,@987654351 的执行@widget 的命令选项方法/功能永远不会中断。
打印报表:
# B1 ttk.Checkbutton clicked on
### Command Trigger 0 ### Button variable values = ('0', 'B2', 'B3', 'B4') 3
cb=.!App.!checkbutton text=B1 variable=jpg variable
nchosen != 0
### Command Trigger 1 ### Button variable values = ('0', 'B2', 'B3', 'B4') 3
#&& run_event_handler &&&& Button variable values = ('0', 'B2', 'B3', 'B4') 3
# B2 ttk.Checkbutton clicked on
### Command Trigger 0 ### Button variable values = ('0', '0', 'B3', 'B4') 2
cb=.!App.!checkbutton2 text=B2 variable=B2 variable
nchosen != 0
### Command Trigger 1 ### Button variable values = ('0', '0', 'B3', 'B4') 2
#&& run_event_handler &&&& Button variable values = ('0', '0', 'B3', 'B4') 2
# B3 ttk.Checkbutton clicked on
### Command Trigger 0 ### Button variable values = ('0', '0', '0', 'B4') 1
cb=.!App.!checkbutton3 text=B3 variable=B3 variable
nchosen != 0
### Command Trigger 1 ### Button variable values = ('0', '0', '0', 'B4') 1
#&& run_event_handler &&&& Button variable values = ('0', '0', '0', 'B4') 1
# B4 ttk.Checkbutton clicked on
### Command Trigger 0 ### Button variable values = ('0', '0', '0', '0') 0
cb=.!App.!checkbutton4 text=B4 variable=tif variable
nchosen == 0
### Command Trigger 1 ### Button variable values = ('0', '0', '0', 'B4') 1
#&& run_event_handler &&&& Button variable values = ('0', '0', '0', 'B4') 1
结论:
- 我需要在执行后续流程之前完全配置
ttk.Checkbutton 小部件。因此,使用小部件的command 选项方法/函数首先配置小部件并使用小部件类的绑定标签之后的自定义绑定标签来执行后续过程被认为是最好的方法。
- 在小部件上发生事件后,观察以下方法和处理程序的执行顺序:
-
.bind() 方法的事件处理程序
- 小部件的
command 选项的方法/功能
-
.bind_class() 方法的事件处理程序,该方法具有自定义绑定标记,位于小部件类的绑定标记之后。
-
.trace_add() 方法的回调总是发生在第 2 项执行之前。此外,它也可能发生在第 2 项和第 3 项执行过程中。