当我通过串行接收值然后尝试使用这些值更新我的Gui时,我遇到了一个问题。不幸的是,即使值正确更新,我也无法进入屏幕刷新,除非我点击它然后再回到它。我尝试过重绘,更新和processEvents(),但一直无法解决问题。
以下是我正在使用的代码:
import sys
import serial
import time
import requests
import PyQt5
from PyQt5.QtWidgets import *
from PyQt5.QtCore import*
from PyQt5.QtGui import *
import mainwindow_auto
CUSTOM_EVENT = 1000
ser = serial.Serial('/dev/ttyACM0', 9600)
class TestThread(QThread):
def __init__(self, target):
QThread.__init__(self)
self.target = target
def run(self):
while True:
QApplication.postEvent(self.target, QEvent(QEvent.Type(CUSTOM_EVENT)))
QApplication.processEvents()
QThread.sleep(15)
class MainWindow(QMainWindow, mainwindow_auto.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)# gets defined in the UI file
self.thread = TestThread(self)
self.thread.start()
def event(s, e):
if(e.type() == CUSTOM_EVENT):
print("Readline: ",int(ser.readline()))
SOC = int(ser.readline())
s.lcdNumber.display(SOC)
s.progressBar.setValue(SOC)
print("SOC: ",SOC)
print(s.lcdNumber.value())
return True
def main():
app = QApplication(sys.argv)
form = MainWindow()
form.lcdNumber.display(30)
form.progressBar.setValue(30)
form.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
提前致谢!
答案 0 :(得分:1)
由于您已经有一个I / O线程,让它处理I / O并通过信号将接收到的值发送到主线程。
不需要自定义事件,主线程上没有I / O. 只需向线程子类添加一个信号,并在启动线程之前将插槽连接到该插槽。
答案 1 :(得分:0)
在更新事件代码中的值之后,我最终通过使用s.hide()和s.show()强制重绘来修复它,而不是重写上面的代码。它迫使重绘,否则拒绝工作。
s.lcdNumber.display(SOC)
s.progressBar.setValue(SOC)
s.hide()
s.show()
答案 2 :(得分:0)
根据@KevinKrammer的建议,使用自定义信号很简单:
class TestThread(QThread):
serialUpdate = pyqtSignal(int)
def run(self):
while True:
QThread.sleep(1)
value = int(ser.readline())
self.serialUpdate.emit(value)
class MainWindow(QMainWindow, mainwindow_auto.Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.thread = TestThread(self)
self.thread.serialUpdate.connect(self.handleSerialUpdate)
self.thread.start()
def handleSerialUpdate(self, value):
print("Readline: ", value)
self.lcdNumber.display(value)
self.progressBar.setValue(value)