2016-10-09 59 views
0

我是Python和PyQt的新手。當我開始我的程序時,幾秒鐘後,進度條和標籤消失。當鼠標懸停在進度條上時,進度條開始出現並消失(標籤消失),消失後再次出現。但是,如果我在設置進度欄值的行註釋,標籤不會消失。PyQt:進度條和標籤消失

下面是代碼:

from PyQt4 import QtCore, QtGui, Qt 
from PyQt4.Qt import QDialog, QApplication 
import sys 
import sensors 
from sensors import * 
import threading 

class tmp(): 
    def main(self): 
     global test 
     global name 
     sensors.init() 
     try: 
      for chip in sensors.iter_detected_chips(): 
       #print (chip) 
       #print('Adapter:', chip.adapter_name) 
       for feature in chip: 
        if feature.label == 'Physical id 0': 
         test = feature.get_value() 
         name = feature.label 
         #print ('%s (%r): %.1f' % (feature.name, feature.label, feature.get_value())) 
         threading.Timer(5.0, self.main).start() 
         return test 
       print 
     finally: 
      sensors.cleanup() 

zz = tmp() 
zz.main() 

class MainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.setGeometry(50, 50, 250, 150) 
     self.setWindowTitle("Title here") 

     #lay = QtGui.QVBoxLayout() 
     #lay.addWidget(self.prgB) 
     #lay.addWidget(self.lbl) 
     #self.setLayout(lay) 

     self.home() 

    def home(self): 
     self.prgB = QtGui.QProgressBar(self) 
     self.prgB.setGeometry(20, 20, 210, 20) 

     self.lbl = QtGui.QLabel(self) 
     self.lbl.setGeometry(20, 40, 210, 20) 

     lay = QtGui.QVBoxLayout() 
     lay.addWidget(self.prgB) 
     lay.addWidget(self.lbl) 
     self.setLayout(lay) 
     self.update() 

    def update(self): 
     textas = ('%s : %.1f' % (name, test)) 
     self.lbl.setText(str(textas)) 
     self.prgB.setValue(test) 
     threading.Timer(5.0, self.update).start() 

     QtGui.QApplication.processEvents() 

     self.show() 

def run():  
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)  
    app = QtGui.QApplication(sys.argv) 
    GUI = MainWindow()   
    sys.exit(app.exec_()) 

run() 

我所試圖做的是剛剛獲得臨時值(pysensors),並把它傳遞給標籤的文本和進度條的值。正如我所說,它正在工作,但幾秒鐘後標籤消失,進度條消失。 我知道(或者我猜)更新函數有問題。我只是無法找出什麼是錯的。

回答

1

首先你不需要單獨的類tmp()。刪除它,只需在MainWindow類中移動main()函數。做這個名字後,測試變量不應該是全局的。在init(例如self.test = 0,self.name ='something')中定義它們,並在代碼的其餘部分將它們引用爲self.test和self.name。

現在,代碼中最重要的錯誤是您嘗試從其他線程更新GUI組件。 GUI組件只能由主線程使用pyqt提供的信號/插槽機制來處理。

針對你的情況做這個步驟是

  1. 定義在MainWindow類這個信號到update()函數
  2. 從main()函數
  3. 散發出這種信號
  4. 連接一個新的信號

到底你的代碼看起來應該是這樣

class MainWindow(QtGui.QWidget): 
    signalUpdateBar = QtCore.pyqtSignal() 
    def __init__(self): 
     ... 
     self.test = 0 
     self.name = "0" 
     ... 
    def home(self): 
     ... 
     self.signalUpdateBar.connect(self.update) 
     self.main() 
     self.show() 

    def main(): 
     try: 
      ... 
      self.test = feature.get_value() 
      self.name = feature.label 
      threading.Timer(5.0, self.main).start() 
      self.signalUpdateBar.emit() 
     finally: 
      ... 

而且在你的update()函數

self.prgB.setValue(self.test) 

應該是最後一條語句。下面的任何東西都是沒有必要的。

+0

非常感謝!現在它像一個魅力:) –