【问题标题】:GTK: Destroy window and run an external script on button clickedGTK:销毁窗口并在单击按钮时运行外部脚本
【发布时间】:2011-04-06 01:44:47
【问题描述】:

这几乎就是问题的标题。我一定在这里遗漏了一些信号解释......

在 PyGTK 上,我正在做:

class Foo:

    def __init__(self):
        self.gladefile = gladefile
        self.wTree = gtk.glade.XML(self.gladefile, 'some_window')
        self.window = self.wTree.get_widget('some_window')
        events = { 'on_code_submit_clicked' : self.submit }
        self.wTree.signal_autoconnect(events)

    def submit(self):
        self.window.destroy()
        os.system('external_script')
        code = Foo()

发生了什么,当按钮被点击时,它保持按下状态,然后脚本运行,在外部程序关闭后,窗口“闪烁”,被销毁并再次重新创建。

我还尝试了“按下”和“释放”信号。

我需要的行为:

  1. 点击按钮
  2. 销毁当前窗口
  3. 运行外部脚本(这将打开另一个程序的窗口)
  4. 关闭外部应用程序后重新创建 Foo() 窗口。

我能想象的是,该事件是在 clicked 事件期间运行的,而不是之后。这就是为什么窗口保持打开状态。 PyGTK 文档在glade page 上没有提及gtk_signal_connect_after 之类的内容,这让我完全迷失了方向。

【问题讨论】:

    标签: gtk pygtk signals


    【解决方案1】:

    为什么不隐藏窗口并在外部脚本之后显示呢?

    self.window.hide()
    os.system('external_script')
    self.window.show()
    

    【讨论】:

    • 因为这给了我同样的行为。对不起,我没有写,我也试过了。谢谢。
    【解决方案2】:

    看来您必须从线程调用外部脚本。

    我没有使用 python 处理线程,但看起来threading module 可以完成这项工作(至少我会尝试这样做)。 Glib 也有线程支持,但我找不到它的 pygtk 文档。

    外部脚本完成后,不要从线程重新创建Foo,而是使用gobject.idle_add 安排一个回调函数来执行此操作。这是因为所有的 GUI 工作都应该在 gtk 事件线程上完成,否则你的程序可能会崩溃。

    【讨论】:

      【解决方案3】:

      发布我的解决方案...很简单。

          self.window.hide()
          glib.idle_add(subprocess.call, ['external_script', 'param'])
          glib.idle_add(self.window.show)
      

      【讨论】:

        猜你喜欢
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多