2011-04-06 24 views
0

這是相當多的問題的標題。我必須在這裏失去了一些信號解釋...GTK:消滅窗口和按鈕上運行一個外部腳本點擊

在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()窗口關閉外部應用程序。

我可以想像的是,在的事件正在運行點擊事件,而不是之後。這就是爲什麼窗戶仍然開着。 PyGTK文檔在glade page上沒有提及gtk_signal_connect_after這樣的內容,這讓我完全失去了它。

回答

0

爲什麼不隱藏窗口和外部腳本後表現出來?

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

因爲這給了我同樣的行爲。對不起,我沒有寫我也試過。謝謝。 – vmassuchetto 2011-04-06 10:19:06

0

它看起來像你必須從一個線程調用外部腳本。

我還沒有與Python的線程,但它看起來像threading module會做這項工作(至少這是我會嘗試)。 Glib也有線程支持,但我找不到它的pygtk文檔。

當外部腳本完成後,請不要從線程中重新創建Foo,而是使用gobject.idle_add安排回調函數。這是因爲所有的GUI工作都應該在gtk事件線程上完成,否則你的程序可能會崩潰。

0

發佈我的解決方案......這很容易的。

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