You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:33:19