2015-12-07 43 views
0

分離UI我缺少的東西在這裏。雖然在兩個獨立的線程中運行,但UI仍未按預期更新。它仍然滯後於dd工作線程。線程在Python不是從工作線程

from ui import Ui_main_window 
from PyQt4 import QtGui, QtCore 

import sys 
import subprocess 
import commands 
import threading 

from time import sleep 

out_int = 0 

def _dd_thread_run(_if, _of, _bs, _size): 
    _dd_subprocess_command_format = "dd if=%s bs=%s | pv -n --size %s | dd of=%s" % (_if, _bs, _size, _of) 
    _dd_subprocess_command = [_dd_subprocess_command_format] 
    _dd_progress = subprocess.Popen(_dd_subprocess_command, shell=True, stderr=subprocess.PIPE) 
    while _dd_progress.poll() is None: 
     out = _dd_progress.stderr.readline().replace("\n", "") 
     global out_int 
     out_int = int (out) 

def _ui_progress_set(): 
    class MainWindow(QtGui.QMainWindow, Ui_main_window): 
     def __init__(self): 
      super(MainWindow, self).__init__() 
      self.setupUi(self) 

    app = QtGui.QApplication(sys.argv) 
    ui = MainWindow() 
    ui.show() 
    while True: 
     for i in range(100): 
      ui.progressBar.setValue(out_int) 
      sleep(.1) 


t1 = threading.Thread(target=_dd_thread_run, args = ["/dev/urandom", "/dev/null", "100K", "100M"]) 
t1.start() 
t2 = threading.Thread(target=_ui_progress_set, args = []) 
t2.start() 

我懷疑Python或PyQt的bug?而且它保持不變,無論UI類是在哪裏定義的。

+0

的可能的複製(http://stackoverflow.com/questions/2482437/label-in-pyqt4-gui-not-updating-with-every-loop [PyQt4中GUI標籤不與FOR循環的每一個循環更新] -of-for-loop) –

+0

請注意,Qt只能從主線程訪問,這也可能解釋了您在其他一些問題中看到的崩潰。您需要重新構建您的程序,以便在主線程中使用Qt,並使用'QThread'將信號發送回主線程以更新GUI。 –

回答

0

您沒有主事件循環運行的任何地方 - 你不會得到一個圖形用戶界面來顯示,而不在於(see doc)。嘗試

app = QtGui.QApplication(sys.argv) 
ui = MainWindow() 
ui.show() 
app.exec_() 

沒有while循環。 如果while循環應該創建一個不確定的進度 - 這很容易被QProgressBar最小值和最大值設置爲零來實現。

+0

我這樣做。我有它在第二個線程,該_ui_progress_set(): 程序工作正常,只有UI正在更新慢,彷彿線程不分離。那就是問題所在。但是,連接兩個線程的唯一事情是進度變量,稱爲out_int,這是從0到100 – Gala

+0

一個整數,我不能找到代碼中任何'exec_'調用!?另外,如果它在那裏,'exec_'會阻止進一步的執行,直到應用程序結束 - 所以你實際上不會到達while循環。 – sebastian

+0

我錯過了抱歉。但後來我有一個新問題,因爲代碼被暫停,我無法更新狀態欄。但是,如果我將狀態欄更新分離爲另一個函數,則它無法到達在第一個函數中聲明的「ui」元素。 我該如何繼續? – Gala