PyQt:进度条和标签消失

时间:2016-10-09 17:25:10

标签: python multithreading python-2.7 pyqt

我是Python和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 个答案:

答案 0 :(得分:1)

首先,您不需要单独的类tmp()。删除它,只需在MainWindow类中移动main()函数。执行此名称后,测试变量不应再是全局变量。在 init 中定义它们(例如self.test = 0,self.name ='something'),并在其余代码中将它们称为self.test和self.name。

现在,代码中最重要的错误是您尝试从其他线程更新GUI组件。 GUI组件只能由主线程使用pyqt提供的信号/插槽机制来处理。

在您的情况下执行此操作的步骤是

  1. 在MainWindow类中定义一个新信号
  2. 将此信号连接到update()函数
  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:
                ...
    

    此外,在你的update()函数

     self.prgB.setValue(self.test)
    

    应该是最后一个声明。下面的任何内容都是不必要的。