2012-06-25 85 views
1

Hello我有一些命令,平均運行30分鐘,當我點擊GTK3創建的按鈕時,python開始執行命令,但是我的所有應用程序都凍結了。我點擊的按鈕的Python代碼是:點擊python中的按鈕後窗口凍結GTK3

def on_next2_clicked(self,button): 
    cmd = "My Command" 
    proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE) 
    while True: 
      line = proc.stdout.read(2) 
      if not line: 
       break 
      self.fper = float(line)/100.0 
      self.ui.progressbar1.set_fraction(self.fper) 
    print "Done" 

我也必須在我的窗口中設置輸出命令進度條。任何人都可以幫助解決我的問題嗎?我也嘗試在python中使用線程,但它也沒用...

+0

我認爲你需要穿線,也許你做錯了什麼吧。 – Cheezey

回答

2

運行從你的循環內的主循環迭代:

def on_next2_clicked(self,button): 
    cmd = "My Command" 
    proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE) 
    while True: 
     line = proc.stdout.read(2) 
     if not line: 
      break 
     self.fper = float(line)/100.0 
     self.ui.progressbar1.set_fraction(self.fper) 
     while Gtk.events_pending(): 
      Gtk.main_iteration() # runs the GTK main loop as needed 
    print "Done" 
+0

感謝兄弟...它的工作完全正確...謝謝.. – gau1991

1

你正在等待,不讓UI主事件循環運行。把循環放在一個單獨的線程中,這樣主線程可以繼續自己的事件循環。

編輯:添加示例代碼

import threading 

def on_next2_clicked(self,button): 
    def my_thread(obj): 
     cmd = "My Command" 
     proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE) 
     while True: 
       line = proc.stdout.read(2) 
       if not line: 
        break 
       obj.fper = float(line)/100.0 
       obj.ui.progressbar1.set_fraction(obj.fper) 
     print "Done" 

    threading.Thread(target=my_thread, args=(self,)).start() 

上述修改你的函數將啓動一個新的線程將在並行與你的主線程中運行。它會讓主事件循環繼續,而新線程正忙於等待。

+0

我也嘗試過,我把繁忙的循環放在單獨的線程中,但是卻落後了,因爲這個繁忙的線程在執行窗口主循環後運行 – gau1991

+0

@ gau1991在我的答案中添加了對函數的修改。看看它是否有幫助。 –

+1

在GTK中,您必須獲取一個鎖才能在單獨的線程中執行UI調用(我認爲這已被棄用或將會出現),或者只在主線程中執行UI調用。 – ptomato