这就是问题的标题。我必须在这里错过一些信号解释...
在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()
发生了什么,是当点击按钮时,它保持按下状态,然后脚本运行,在外部程序关闭后,窗口“闪烁”,被破坏并再次重新创建。
我也尝试过“按下”和“释放”信号。
我需要的行为:
我能想象的是,点击事件期间正在运行事件,而不是之后。这就是窗户保持打开的原因。 PyGTK文档没有对gtk_signal_connect_after
上glade page之类的内容说任何话,这让我完全迷失了。
答案 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)