开关的一些问题,这是我在这里StackOverflow的第一个问题,所以请耐心等待与我,如果一些信息不存在,或者我错过了一些重要的,但不管怎样,我会尽我所能:)关于蟒蛇
最近我开始在Python2.7中编写代码,所以我不是很擅长。在玩PyGtk,PyGObject,Glade等的时候,我发现了一些关于开关的东西(没有尝试过任何其他的小部件,所以我不知道它是否发生在别的地方,很可能它不会,我希望... )
我做了一个“窗口”加上一个“开关”一个很基本的GUI使用格莱德
我的目标是要关闭开关后,用户试图激活它,如果一些exeption之前复活了,是这样的:
- 激活它 - > *实测值误差 - > *停用它
我做了一些代码,以及一段时间后,我注意到,这段代码创建了一个圈状块,后来堵GUI窗口:
builder = Gtk.Builder()
window1 = builder.get_object('window')
switchie = builder.get_object('switchie')
switchie.set_active(False)
def Hi(switch, active):
print switchie.get_active()
switchie.set_active(not switchie.get_active())
switchie.connect("""notify::active""", Hi)
window1.set_position(Gtk.WindowPosition.CENTER)
window1.connect("delete-event", Gtk.main_quit)
window1.show_all()
如果我是对的,“switchie.connect”每当“switchie”被点击时,将“switchie”对象与“Hi”func链接起来。
但是,如果我执行此操作并尝试打开开关,GUI挂起。我曾尝试通过脚本&命令行并添加“打印开关状态”来执行这个,从而导致无限循环(真&假)
我试图用我做了很多其他funcs中,但他们都没有能够解决这个问题。事实上,这是我所做的所有其他funcs的“本质”。
为什么会发生这种情况?
循环在哪里?
我在某些行错了吗?
帮助表示赞赏!
(如果你需要看我的错误funcs中的其余部分,只问了他们,但我不认为他们会帮...)
每次切换开关时都会调用您的Hi事件处理程序。由于您正在切换事件处理程序中的切换器,因此显然最终会出现无限循环。 –
有没有一种安全的方法来实现我的主要目标? 激活它 - > *发现错误 - > *取消激活它 编辑:你是说“switchie.connect()”还链接“switchie.set_active()”调用? – PythonNoob
是的,无论_why_开关的状态改变如何,都会调用信号处理程序。如果您必须切换事件处理程序中的开关,则必须暂时[disconnect](https://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-handler-disconnect)或[block](https://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-handler-block)它。 –