【问题标题】:Some questions about switches in python关于python中开关的一些问题
【发布时间】:2016-08-14 09:22:56
【问题描述】:

这是我在 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”,“switchie.connect”就会将“switchie”对象与“Hi”func 链接起来。

但如果我执行此操作并尝试打开开关,GUI 就会挂起。我确实尝试通过脚本和命令行执行此操作并添加“打印开关状态”,导致无限循环(真假)

我尝试了许多其他我制作的函数,但它们都无法解决这个问题。事实上,这是我制作的所有其他功能的“精髓”。

为什么会这样?

循环在哪里?

我是不是有些地方错了?

感谢您的帮助!

(如果您需要查看我的其他故障功能,请索取它们,但我认为它们不会有帮助...)

【问题讨论】:

  • 每次切换开关时都会调用您的Hi 事件处理程序。由于您在事件处理程序 inside 中切换开关,因此您显然会陷入无限循环。
  • 是否有安全的方法来实现我的主要目标?激活它 --> * 发现错误 --> * 停用它 编辑:你是说“switchie.connect()”还链接“switchie.set_active()”调用吗?
  • 是的,无论为什么开关的状态发生变化,都会调用信号处理程序。如果您必须在事件处理程序内切换开关,您将不得不暂时disconnectblock 它。
  • 好吧,经过一段时间的试验,我无法成功完成这项任务。你可以帮帮我吗? PD:我尝试使用您告诉我使用的两种方法(断开连接并阻止)
  • 我不确定发生了什么,但由于某种原因,您似乎无法断开或阻止 notify::active 事件。如果您改为连接到 state-set 事件,它会起作用。

标签: python python-2.7 pygtk glade pygobject


【解决方案1】:

你想像这样连接开关:

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

这只会在每次被点击时被调用一次。您所做的是在信号更改后连接到信号,因此它一直在变化,并且永远不会赶上。你也会想要改变

def Hi(switch, active):

def Hi(switch, active = None):

用于键盘支持。

【讨论】:

  • 哇。有两件事给我留下了深刻的印象: *自从我问这个问题已经很久了 *我已经抛弃了我的这个小项目 xDDD 无论如何,谢谢。我会尝试重新创建我的情况,并尝试这个答案。顺便说一句:事实上,在我最近的项目中,我一直在将“激活”信号与其他一些小部件一起使用(因为我已经忘记了我的旧项目,我没有注意到它可以解决我的问题。 ..) 但是我有一个问题:*除了第一个创建的“无限”循环之外,“notify::active”和“activate”之间还有其他区别吗?
  • 差点忘了提:*“键盘支持”部分是什么意思?支持“什么”?键盘绑定?捷径?聚焦开关?加速器?
  • 是的,“notify::active”在之后被调用,开关被激活/不活动,这会创建一个循环。 “activate”在用户响应开关时被调用,因此每次用户/开关交互只调用一次,并且信号在开关变为活动/不活动之前被调用。键盘支持意味着如果开关有焦点,您可以按键盘上的 Enter 键来激活/停用它。
  • 很高兴你找到了这个问题。你解决了一些对我来说有点复杂的有用问题。好像你是我的对手(PythonNoob!= theGtknerd)。非常感谢,真的。我会尝试这些答案,这样我才能接受这个作为“正确答案”,好吗?
  • 当然,很高兴能为您提供帮助。我现在使用 Gtk 大约一年了。我将 Anjuta 用于我的 IDE。 Anjuta 是一个很大的帮助,因为它列出了所有不同的信号,并且它的开发周期非常快。不过,这需要一些设置。我想创建一个教程,但现在没有任何“额外”时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 2020-12-26
  • 2018-05-24
  • 2013-07-07
  • 2013-05-10
  • 2012-03-18
  • 2023-03-09
相关资源
最近更新 更多