2016-08-14 131 views
3

开关的一些问题,这是我在这里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中的其余部分,只问了他们,​​但我不认为他们会帮...)

+0

每次切换开关时都会调用您的Hi事件处理程序。由于您正在切换事件处理程序中的切换器,因此显然最终会出现无限循环。 –

+0

有没有一种安全的方法来实现我的主要目标? 激活它 - > *发现错误 - > *取消激活它 编辑:你是说“switchie.connect()”还链接“switchie.set_active()”调用? – PythonNoob

+1

是的,无论_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)它。 –

回答

1

你要挂钩这样的开关:

switchie.connect("""activate""", Hi)

这只会被调用一次每被点击一次。你所做的就是在信号发生变化后连接信号,所以它一直在变化,而且从不追赶。你也想改变

def Hi(switch, active):

def Hi(switch, active = None):

支持键盘。

+0

哇。我稍凹陷两两件事: *这是一个很长的时间,因为我问这个 *我alredy甩了我的这个小proyect XDDD 不管怎么说,谢谢。我会尝试重新创建我的情况,并尝试这个答案。顺便说一句: 在我最近的项目中,事实上,我一直在使用“激活”信号与其他一些小部件(因为我遗忘了我的老项目,我没有注意到它可以解决我的问题问题......)但我有一个问题: *除了第一个创建的“无限”循环之外,“notify :: active”和“activate”之间是否还有其他区别? – PythonNoob

+0

而且几乎忘了提及: *你对“键盘支持”部分有什么意思? 支持“what”? 键盘绑定?快捷方式?关注交换机?加速器? – PythonNoob

+0

是的,在**开关处于激活/不活动状态后,“notify :: active”会被调用**,从而产生一个循环。当用户响应交换机时会调用“activate”,因此每次用户/交换机交互只调用一次,并且在交换机处于活动状态之前,信号被称为**。键盘支持意味着如果开关具有焦点,您可以按下键盘上的确认键来激活/禁用它。 – theGtknerd