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
相关产品推荐
相关产品推荐

