【问题标题】:Have textbox update every 5 seconds PyQt让文本框每 5 秒更新一次 PyQt
【发布时间】:2015-10-02 17:31:22
【问题描述】:

所以这是我的问题,我有来自串行电缆的数据每 5 秒读取一次并存储在 CSV 文件中。我也将这些数据放入列表中。我想做的是获取变量 5、7 和 9,并将它们显示在我有 Qtextboxes 的 GUI 中......我该怎么做?

变量列表将位于一个称为 listvalues 的值中。我想调用 5、7 和 9,并让它们显示在我的 PyQt 窗口中各自的文本框中。

这是我的代码:

from PyQt4 import QtGui
import sys
import masimo
import csv
import time
import datetime as DT
import threading
from threading import Thread
import serial
import os

os.chdir(r"C:\Users\SpO2\Desktop\Data")
time = time.strftime("%d %b %Y %H%M%S")
location = r'%s.csv' % time
outputfile = open(location, mode='x', newline='')
outputWriter = csv.writer(outputfile)
outputWriter.writerow(["start"])
outputfile.close()
port = "COM4"


class ExampleApp(QtGui.QMainWindow, masimo.Ui_MainWindow):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__()
        self.setupUi(self)

def SerialRead():
    delay1 = DT.datetime.now()                
    ser = serial.Serial(port, baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)   
    out = ser.read(167)
    reading = str(out)
    plaintext1 = reading.replace(' ', ', ')
    plaintext = plaintext1.replace('=', ', ')
    listvalue = plaintext.split(", ")
    ser.close()

    outputfile = open(location, mode='a', newline='')
    outputWriter = csv.writer(outputfile)
    outputWriter.writerow([plaintext])
    outputfile.close()

    delay2 = DT.datetime.now()
    differencetime = (delay2 - delay1).total_seconds()
    writedelay = int(5)
    restart = (writedelay - differencetime)
    threading.Timer(restart, SerialRead).start() 

def main():
    app = QtGui.QApplication(sys.argv)
    form = ExampleApp()
    QtGui.QApplication.processEvents()
    form.show()
    app.exec_()    

if __name__ == '__main__':
    Thread(target = SerialRead).start()
    Thread(target = main).start()

【问题讨论】:

    标签: python pyqt pyqt4 qtgui qtcore


    【解决方案1】:

    我认为你可以做以下两件事之一:

    1. 在您的窗口中使用 QTimer,将其间隔设置为 5 秒,并将一个方法连接到其超时信号,然后更新该方法中的文本字段。
    2. 使用在您的窗口和读取进程之间共享的threading event,并在您的窗口类中使用 QTimer,它更频繁地检查事件是否已设置并在设置时进行更新。

    我可能会使用一个事件,以便您知道线程正在休眠,并且您不会在线程正在写入值时尝试读取值。

    在您的 ExampleApp 类中,您需要存储事件并处理超时:

    class ExampleApp(QtGui.QMainWindow, masimo.Ui_MainWindow):
        def __init__(self, event, parent=None):
            super(self.__class__, self).__init__()
            self.setupUi(self) 
            self.dataWasReadEvent = event
    
            self.checkThreadTimer = QtCore.QTimer(self)
            self.checkThreadTimer.setInterval(500) #.5 seconds
    
            self.checkThreadTimer.timeout.connect(self.readListValues)
    
        def readListValues(self):
            if self.dataWasReadEvent.is_set():
                #Read your events from the list and update your fields
    
                self.dataWasReadEvent.clear() #Clear the event set flag so that nothing happens the next time the timer times out
    

    您的SerialRead 函数需要接受一个作为线程事件的参数,并且需要在串行读取之后但重新启动之前设置该事件:

    def SerialRead(dataReadEvent):
        ...
        dataReadEvent.set()
        threading.Timer(restart, SerialRead, args=(dataReadEvent,)).start()
    

    您的main 函数还需要接受要传递给 ExampleApp 的初始化程序的事件参数:

    def main(dataReadEvent):
        ...
        form = ExampleApp(dataReadEvent)
    

    最后,在您的if __name__ == '__main__': 部分中,需要创建线程事件并将其传递给线程调用:

    if __name__ == '__main__':
        dataReadEvent = threading.Event()
        Thread(target = SerialRead, args=(dataReadEvent,) ).start()
        Thread(target = main, args=(dataReadEvent,) ).start()
    

    【讨论】:

    • OK...我有点遵循...如果我的文本框对象名称是“SPO2text”并且我要在此框中打印的值是“Listvalues”中的变量#5,我该如何整合它
    • 你的文本框是QLineEdit吗? QLineEdit 有一个方法setText 用于设置框中的文本。您可以通过如下调用将文本设置为第五个变量(索引 4):self.SPO2text.setText(str(Listvalues[4]))
    • 他们是 QLineEdits。惊人的。我会在测试时报告!
    • 当我尝试运行脚本时收到此回调:TypeError: __init__() missing 1 required positional argument: 'event' ... 想法? @sid16rgt
    • 我的错误。您将需要更改 main() 函数的签名以获取线程事件的位置参数,并更改 form = ExampleApp 调用以将事件传递给初始化程序。当我上电脑时,我会更新我的答案。
    猜你喜欢
    • 2015-02-10
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多