关于python中开关的几个问题

关于python中开关的几个问题,python,python-2.7,pygtk,glade,pygobject,Python,Python 2.7,Pygtk,Glade,Pygobject,这是我在StackOverflow的第一个问题,所以如果一些信息不存在或者我遗漏了一些重要的信息,请耐心等待,但无论如何我会尽力:) 最近我开始用Python2.7编写代码,所以我不是很擅长。在玩PyGtk、PyGObject、Glade等的时候,我发现了一些关于开关的特别之处(没有尝试过任何其他小部件,所以我不知道它是否发生在其他地方。我希望很可能不会发生…) 我使用Glade制作了一个非常基本的GUI,其中有一个“窗口”和一个“开关” 我的目标是在用户尝试激活开关后,如果之前出现了某些例外情

这是我在StackOverflow的第一个问题,所以如果一些信息不存在或者我遗漏了一些重要的信息,请耐心等待,但无论如何我会尽力:)

最近我开始用Python2.7编写代码,所以我不是很擅长。在玩PyGtk、PyGObject、Glade等的时候,我发现了一些关于开关的特别之处(没有尝试过任何其他小部件,所以我不知道它是否发生在其他地方。我希望很可能不会发生…)

我使用Glade制作了一个非常基本的GUI,其中有一个“窗口”和一个“开关”

我的目标是在用户尝试激活开关后,如果之前出现了某些例外情况,则停用开关,例如:

  • 激活它-->*发现错误-->*停用它
我编写了一些代码,过了一会儿,我注意到这段代码创建了一个类似循环的块,随后阻塞了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”对象与“Hi”func每当“switchie”被点击

但若我执行此操作并尝试打开开关,GUI就会挂断。我确实试图通过脚本和命令行执行此操作,并添加“打印开关状态”,从而产生一个无休止的循环(True和False)

我尝试了许多其他功能,但它们都不能解决这个问题。事实上,这就是我做的所有其他函数的“本质”

为什么会发生这种情况

环路在哪里

我在某些方面错了吗

谢谢你的帮助


(如果您需要查看我的其他故障功能,只需询问它们,但我认为它们不会有帮助…

您想这样连接交换机:

switchie.connect(““激活”,您好)

每次单击时,只会调用一次。你所做的是在信号改变后连接到它,所以它一直在变化,从来没有跟上。你也会想要改变

def Hi(开关,激活):

def Hi(开关,激活=无):


用于键盘支持。

每次切换开关时,都会调用
Hi
事件处理程序。由于在事件处理程序中切换开关,显然最终会出现一个无限循环。有没有安全的方法来实现我的主要目标?激活它-->*发现错误-->*停用它编辑:您是说“switchie.connect()”也会链接“switchie.set_active()”调用?是的,无论交换机的状态如何更改,都会调用信号处理程序。如果必须在事件处理程序中切换开关,则必须临时或禁用它。好吧,经过一段时间的实验,我无法成功完成此任务。你能帮我吗?PD:我尝试使用了您告诉我要使用的两种方法(断开和阻止)。我不确定发生了什么,但由于某种原因,您似乎无法断开或阻止
notify::active
事件。如果您改为连接到
状态集
事件,它就会工作。哇。有两件事给我留下了一点印象:*我很久没有问过这个问题了*不管怎样,我已经把我的这个小项目xDDD甩了,谢谢。我会试着重现我的处境,试着回答这个问题。顺便说一句:在我最近的项目中,事实上,我一直在使用其他一些小部件的“激活”信号(因为我已经忘记了我的旧项目,我没有注意到它可以解决我的问题…),但我有一个问题:*除了“无限”之外,“通知::激活”和“激活”之间还有其他区别吗第一个创建的循环?差点忘了提到:*你说的“键盘支持”部分是什么意思?支持“什么”?键盘绑定?捷径?调焦开关?加速器?是的,在开关处于激活/非激活状态后,会调用“notify::active”,从而创建一个循环。当用户响应开关时,调用“激活”,因此每个用户/开关交互只调用一次,并且在开关变为激活/非激活之前调用信号。键盘支持意味着如果开关有焦点,你可以按键盘上的enter键来激活/禁用它。我很高兴你找到了这个问题。你解决了一些对我来说有点复杂的有用问题。好像你是我的对手(PythonNoob!=Thegtknard)。非常感谢,真的。我会尝试这些答案,这样我就可以接受这个“正确答案”,好吗?当然,很高兴能帮上忙。我现在使用Gtk大约有一年了。我使用Anjuta作为我的IDE。Anjuta是一个很大的帮助,因为它列出了所有不同的信号,并且它有一个非常快的开发周期。不过,这需要一些设置。我想创建一个教程的时候,但没有任何额外的时间现在。