gpt4 book ai didi

python - 当 ttk.Checkbutton 小部件的状态发生变化时,如何编写后续操作?

转载 作者:行者123 更新时间:2023-12-04 14:01:32 26 4
gpt4 key购买 nike

我注意到 ttk.Checkbuttons 中的行为小部件。也就是说,对此小部件应用的任何绑定(bind)或事件处理程序始终发生在小部件的 command 之前。执行选项方法/功能。

意义:

  1. 鉴于 ttk.Checkbuttons 的状态发生变化由 command 执行选项方法/函数,ttk.Checkbuttons['variable'] 的值通过事件处理程序访问的将始终是旧状态,而不是小部件的 command 定义的新状态。选项方法/功能。

  2. 更改 ttk.Checkbuttons['variable'] 的值在事件处理程序中会搞乱小部件的性能 command选项方法/功能。因此,ttk.Checkbuttons['variable']应该在小部件的 command 中设置选项方法/功能。

问题:

鉴于上述情况,那么将事件处理程序绑定(bind)到 ttk.Checkbuttons 的目的是什么?小部件?

事件处理程序在事件发生时执行,例如什么时候<ButtonRelease-1>发生在 ttk.Checkbutton小部件。如果我想根据小部件的状态设计后续操作,我不能通过作为小部件的事件处理程序来实现 instate尚未更新。解决方法是假定小部件 instatevariable在事件处理程序中获得的与报告的相反 instate或 variable.get() 值。然而,这种做法似乎很冒昧。

我应该如何为 ttk.Checkbutton 使用事件处理程序?在状态发生变化时编写后续操作?或者我不应该使用它而只使用小部件 command option方法/函数根据widget的状态设计后续 Action ?

最佳答案

Given the above, so what is the purpose of binding event handlers to a ttk.Checkbuttons widget?

这样您就可以定义自己的行为来覆盖默认行为。

How do should I use event handlers for a ttk.Checkbutton to program follow-up actions when there is a state change?

一个解决方案是使用事件处理程序。相反,在关联变量上设置跟踪。使用变量跟踪,您的回调函数将在设置变量后调用,并且每次值更改时都会被调用,即使更改是由事件以外的其他因素完成的。

cb_var = tk.StringVar(value="off")
cb = ttk.Checkbutton(root, variable=cb_var, onvalue="on", offvalue="off", text="Ready?")
cb_var.trace_add('write', callback)

另一种解决方案是在类的绑定(bind)标签之后创建一个自定义绑定(bind)标签。

例子:

cb_var = tk.StringVar(value="off")
cb = ttk.Checkbutton(root, variable=cb_var, onvalue="on", offvalue="off", text="Ready?")
tag = f'custom_{cb}'
cb.bindtags((cb, 'TCheckbutton', '.', tag, 'all'))
cb.bind_class(tag, "<ButtonRelease-1>", callback)

通过上述,回调将在 <ButtonRelease-1> 上被调用在该事件已由小部件类上的默认绑定(bind)处理后的按钮。如果这样做,您还应该以类似的方式向空格键添加绑定(bind),因为您还可以使用空格键设置复选按钮的值。

关于 bindtags 的另一个例子以及更多关于它们如何工作的讨论,请参见 this answer问题How to bind self events in Tkinter Text widget after it will binded by Text widget? .另请参阅 this answer问题Basic query regarding bindtags in tkinter .

关于python - 当 ttk.Checkbutton 小部件的状态发生变化时,如何编写后续操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69930614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com