GTK:销毁窗口并在单击按钮上运行外部脚本

时间:2011-04-06 01:44:47

标签: gtk pygtk signals

这就是问题的标题。我必须在这里错过一些信号解释...

在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()窗口。
  5. 我能想象的是,点击事件期间正在运行事件,而不是之后。这就是窗户保持打开的原因。 PyGTK文档没有对gtk_signal_connect_afterglade page之类的内容说任何话,这让我完全迷失了。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

看起来你必须从一个线程调用外部脚本。

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

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

答案 2 :(得分:0)

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

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