我是PyQt4的新手,所以也許它是一個小手指。我嘗試在我的GUI中顯示進度,這將由工作線程更新。QProgressBar與QTableWidget中的其他內存有關。如何通過工作線程改變進度
工作線程在我的GUI的init函數中啓動。
self.st = ServerThread()
self.st.start()
這裏是線程類
_exportedMethods = {
'changes': signal_when_changes,
}
class ServerThread(QtCore.QThread):
def __init__(self):
super(ServerThread,self).__init__()
st = self
#threading.Thread.__init__(self)
def run(self):
HOST = '' # local host
PORT = 50000
SERVER_ADDRESS = HOST, PORT
# set up server socket
s = socket.socket()
s.bind(SERVER_ADDRESS)
s.listen(1)
while True:
conn, addr = s.accept()
connFile = conn.makefile()
name = cPickle.load(connFile)
args = cPickle.load(connFile)
kwargs = cPickle.load(connFile)
res = _exportedMethods[name](*args,**kwargs)
cPickle.dump(res,connFile) ; connFile.flush()
conn.close()
如果我的服務器在他會叫下面的方法將與在線程遠程調用prozedure捕獲的數據庫變化值。
def signal_when_changes():
s = Subject()
s.advise()
該模式是一個簡單的觀察者,它更新了我的GUI。在我的gui中更新表格是調用以下方法。
def refresh(self,table):
clients = self.db.get_clients()
if(self.ui.mainTable.rowCount() != len(clients)):
self.search_add_client
allRows = table.rowCount()
for row in xrange(0,allRows):
for c in clients:
if table.item(row,0).text() == c.get_macaddr().text():
self.refresh_line(table,row,c)
如果需要更新,則此方法檢查是否有更改,如果需要更新,則以下方法將執行此操作。
def refresh_line(self,table,rowNumber,client):
table.item(rowNumber, 0).setText(client.get_macaddr().text())
table.item(rowNumber, 1).setText(client.get_product().text())
table.item(rowNumber, 2).setText(client.get_site().text())
table.item(rowNumber, 3).setText(client.get_hostname().text())
table.item(rowNumber, 4).setText(client.get_priv_data().text())
table.cellWidget(rowNumber, 5).setValue(client.get_progress_value())
table.item(rowNumber, 6).setText(client.get_stage().text())
其他存儲的可更新,但沒有取得進展,在這裏,我要更新進度
self.ui.mainTable.setCellWidget(appendRowIndex,5,c.get_progress())
這條線之後,GUI崩潰,我得到以下信息行
的QPixmap:這是不是安全使用GUI線程之外的像素映射
我的猜想是我不能在「Main/Gui」線程之外更改QPixmaps。我不知道如何解決這個問題,所以我歡迎所有的解決方案。
在此先感謝。
我天璣KNW準確,但類似的方法調用或其他人可能會幫助ü,一旦我得到了這個問題,贏形式線程安全的, – Red