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

Gtk_widget.set_sensitive()失效求助:单选按钮无法重复控制Gtk.Box状态

解决单选按钮控制Gtk.Box敏感状态的问题

首先来说你的核心问题:单选按钮的toggled信号会在按钮状态变化时触发——不管是被选中还是取消选中。你当前的代码没有判断按钮是否处于激活状态,所以当你切换到第二个单选按钮时,第一个按钮的toggled信号也会触发(此时它的状态变为未选中),但你的代码仍然会执行set_sensitive(False),这就导致状态被错误覆盖,最终出现无法再次禁用的情况。

修复方法很简单,在回调函数里先判断按钮是否被选中,只有激活时才执行对应的设置:

def on_toggling_hash_tab_radio_button_1(self, widget):
    # 只有当按钮被选中时,禁用Box
    if widget.get_active():
        self.hash_tab_hbox.set_sensitive(False)

def on_toggling_hash_tab_radio_button_2(self, widget):
    # 只有当按钮被选中时,启用Box
    if widget.get_active():
        self.hash_tab_hbox.set_sensitive(True)

这样修改后,每次只有被选中的那个单选按钮会触发对应的状态变更,就能正常切换Box的启用/禁用状态了。


关于Gtk.main()循环的基础知识

Gtk是事件驱动的GUI框架,Gtk.main()就是启动它的核心事件循环,它的作用可以拆解为这几点:

  • 持续监听所有GUI相关事件:比如用户点击按钮、拖动窗口、输入文本,甚至系统的窗口刷新请求。
  • 当事件发生时,自动把事件分发给对应的回调函数(比如你写的单选按钮toggled回调)去处理。
  • 一直处于阻塞运行状态,直到调用Gtk.main_quit()(比如用户关闭主窗口时)才会终止,程序随之退出。

举个直观的例子:如果你的代码只创建窗口并显示,但不调用Gtk.main(),窗口会一闪而过——因为程序没有进入事件循环,无法处理任何用户操作或窗口渲染的事件,直接执行完所有代码就退出了。

另外要注意:Gtk.main()必须在所有GUI元素创建并显示完成后调用,否则后续的界面元素可能无法正常被事件循环处理。

内容的提问来源于stack exchange,提问作者potterhead

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:13:10