2016-10-09 6 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()関数を移動してください。この名前を実行した後、テスト変数はもうグローバルではありません。 (たとえば、self.test = 0、self.name = 'something')で定義し、残りのコードでself.testとself.nameを参照してください。

コードで最も重大な間違いは、別のスレッドからGUIコンポーネントを更新しようとしていることです。 GUIコンポーネントは、pyqtが提供するシグナル/スロット機構を使用してメインスレッドによってのみ処理されます。あなたのケースでこれを行うための

手順は

  1. 更新()関数にメイン・ウィンドウクラス
  2. 接続でこの信号を新しい信号を定義
  3. は、main()関数
  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: 
      ... 
のようになります。また、あなたの更新()関数

self.prgB.setValue(self.test) 

は、最後のステートメントでなければなりません。それ以下のものは必要ありません。

+0

ありがとうございました!今それは魅​​力的に働いています:) –

関連する問題