我是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)并将其传递给标签文本和进度条值。正如我所说,它正在工作,但几秒钟后标签消失了,进度条消失了。 我知道(或者我猜)更新功能有问题。我只是不知道什么是错的。
答案 0 :(得分:1)
首先,您不需要单独的类tmp()。删除它,只需在MainWindow类中移动main()函数。执行此名称后,测试变量不应再是全局变量。在 init 中定义它们(例如self.test = 0,self.name ='something'),并在其余代码中将它们称为self.test和self.name。
现在,代码中最重要的错误是您尝试从其他线程更新GUI组件。 GUI组件只能由主线程使用pyqt提供的信号/插槽机制来处理。
在您的情况下执行此操作的步骤是
最后,您的代码应如下所示
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)
应该是最后一个声明。下面的任何内容都是不必要的。