Skip to main content
 首页 » 编程设计

python之Tkinter:避免事件和值更新之间竞争条件的简单方法

2025年05月04日12开发

问题

我的问题非常简单,但即使在谷歌搜索之后我也无法弄清楚如何轻松解决它。

所以我有一个复选按钮:

self.but_val = IntVar() 
self.but = Checkbutton(frame, text="text", variable=self.but_val) 

此复选按钮会触发 GUI 上某些文件路径的更新:

self.but.bind('<ButtonRelease-1>',  
        lambda e: self.update_files_path(e), add='+') 

在update_files_path(event)中,我需要获取checkbutton的值来选择要显示的文件路径:

if self.but_val.get() == 0: 
    [...] 
else: 
    [...] 

我遇到的问题是我在点击之前获得了按钮的值。 由于文件路径的处理取决于不同的按钮值,我不能只使用相反的值。

我目前的工作

目前我有一个在点击之前触发并保存 GUI 状态的函数:

self.but.bind('<ButtonPress-1>', lambda e, 
    self.save_design_opts_state(self.buttons_to_backup, 
        self.before_clic_vars_state), add='+') 

然后在 update_files_path(event) 中,我调用了一个函数来推断 clic 之后的 GUI 状态:

gui_state = self.get_gui_state(event) 

这个函数实现起来很烦人,因为我需要做很多事情: 1- 检查 clic 是否真的是在按钮上制作的(以避免 clic 从按钮开始并在其他地方结束!) 2- 根据类型获取所有必需按钮的值

有没有更简单的方法来处理这个问题?

感谢您的帮助!

请您参考如下方法:

不要设置自己的绑定(bind)。使用复选按钮的 command 选项。此选项允许您指定在值更改后要运行的命令。还有其他方法,但这是迄今为止解决问题最简单、最常用的方法。