Gtk+Python中同步两组单选按钮引发无限循环问题求助
解决Gtk+Python中菜单单选按钮触发无限循环的问题
问题现象
在Python+Gtk应用中同步菜单与工具栏的单选按钮时出现异常:
- 点击工具栏单选按钮时,同步功能正常,控制台输出选中值:
Radio changed to 1 Radio changed to 2 - 点击菜单中的单选按钮时,程序会陷入无限循环并挂起。
问题原因
问题出在单选Action的activate回调函数on_change_radio中:每次触发回调就直接调用action.set_state(value)更新状态。
当点击菜单单选项时,activate信号触发后更新状态,会再次触发菜单控件的状态同步,进而又触发activate信号,形成无限循环。而工具栏的GtkRadioToolButton属于同一单选组,内部已处理状态同步逻辑,不会重复触发信号,因此没有出现循环。
修复方法
在更新状态前,先判断目标值与当前状态是否一致,仅当两者不同时才执行状态更新,避免无意义的重复触发:
修改on_change_radio函数:
def on_change_radio(self, action, value): if action.get_state() != value: action.set_state(value) print(f"Radio changed to {value.get_string()}")
可选优化
菜单XML中target属性使用的是数字(如1),而Action状态是字符串类型(如'1'),虽然Gio会自动完成类型转换,但统一类型更规范,可将菜单中的target改为带引号的字符串:
<attribute name="target">'1'</attribute> <attribute name="target">'2'</attribute> <attribute name="target">'3'</attribute>
内容的提问来源于stack exchange,提问作者DobbyTheElf
相关产品推荐
相关产品推荐

