gfdncs 2023-11-02 22:30 采纳率: 50%
浏览 14
已结题

PySide6或者QT做界面,while循环下文本框不能设置字符。

我在做串口通讯的界面,通讯是正常的。
在while循环下,为什么print可以正常运行,但文本框的.setText(srt))却无法运行?


import sys
from PySide6.QtWidgets import QApplication,QPushButton,QLineEdit,QVBoxLayout,QHBoxLayout,QWidget
from PySide6.QtCore import QRect
from math import *
import serial
import time

class MyWindow(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.setWindowTitle('圆周间隙测试机控制程序')
        self.resize(600,400)
        self.setupUi()

    def setupUi(self):  #建立界面
        self.vboxLayout=QVBoxLayout(self)
        self.lineText=QLineEdit(self)   #单行文本
        self.lineText.setGeometry(QRect(50,50,200,30))
   
        self.btn_com=QPushButton(self)
        self.btn_com.setText('显示扭矩')
        self.btn_com.setGeometry(QRect(50,150,100,30))

        self.btn_com.clicked.connect(self.sendcode) #按钮信号与槽连接
    
    def sendcode(self): #定义收发字符的槽函数
        temp_send = '01 03 00 08 00 02 45 c9'
        ser = serial.Serial("COM5", 9600)
        temp_send = bytes.fromhex(temp_send)    #将发送的数据变为二进制
        while True:
            if ser.is_open:
                ser.write(temp_send)
                time.sleep(0.5)
                buffer_data = ser.in_waiting
                if buffer_data:
                    return_data = ser.read(buffer_data)                    
                    return_data_hex = str(return_data.hex())    # 二进制转换为16进制
                    toque=((int(return_data_hex[6:10], 16)/1000)-12)*25  
**                    print("当前扭矩为:", toque) # while循环下 可以按时间间隔打印扭矩值
                    self.lineText.setText(str(toque))    #while循环下 ,无法将扭矩值字符填充到文本框**
                    time.sleep(3)

if __name__=='__main__':
    app=QApplication(sys.argv)
    window=MyWindow()
    window.show()
    sys.exit(app.exec())



  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-03 08:09
    关注

    【以下回答由 GPT 生成】

    问题的原因是由于while循环阻塞了主线程,导致界面没有机会响应用户操作,包括更新文本框的内容。可以通过将串口通讯的代码放在新的线程中执行,以避免阻塞主线程。

    下面是修改后的代码,使用了QThread来创建新的线程执行串口通讯的代码:

    import sys
    from PySide6.QtWidgets import QApplication, QPushButton, QLineEdit, QVBoxLayout, QHBoxLayout, QWidget
    from PySide6.QtCore import QRect, QThread, Signal
    from math import *
    import serial
    import time
    
    class CommunicationThread(QThread):
        update_signal = Signal(float)
    
        def __init__(self, parent=None):
            super().__init__(parent)
            self.serial_port = "COM5"
            self.serial_baudrate = 9600
            self.stop_flag = False
    
        def run(self):
            ser = serial.Serial(self.serial_port, self.serial_baudrate)
            temp_send = '01 03 00 08 00 02 45 c9'
            temp_send = bytes.fromhex(temp_send)
            while not self.stop_flag:
                if ser.is_open:
                    ser.write(temp_send)
                    time.sleep(0.5)
                    buffer_data = ser.in_waiting
                    if buffer_data:
                        return_data = ser.read(buffer_data)
                        return_data_hex = str(return_data.hex())
                        torque = ((int(return_data_hex[6:10], 16) / 1000) - 12) * 25
                        self.update_signal.emit(torque)
    
        def stop(self):
            self.stop_flag = True
    
    class MyWindow(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setWindowTitle('圆周间隙测试机控制程序')
            self.resize(600, 400)
            self.setupUi()
    
            self.communication_thread = CommunicationThread()
            self.communication_thread.update_signal.connect(self.update_text)
    
        def setupUi(self):
            self.vboxLayout = QVBoxLayout(self)
            self.lineText = QLineEdit(self)
            self.lineText.setGeometry(QRect(50, 50, 200, 30))
    
            self.btn_com = QPushButton(self)
            self.btn_com.setText('显示扭矩')
            self.btn_com.setGeometry(QRect(50, 150, 100, 30))
    
            self.btn_com.clicked.connect(self.start_communication)
    
        def start_communication(self):
            self.communication_thread.start()
    
        def update_text(self, torque):
            self.lineText.setText(str(torque))
    
        def closeEvent(self, event):
            self.communication_thread.stop()
            self.communication_thread.wait()
            super().closeEvent(event)
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = MyWindow()
        window.show()
        sys.exit(app.exec())
    

    修改后的代码使用了QThread来创建一个新的线程执行串口通讯的代码,通过信号和槽来更新文本框的内容。在窗口关闭时,需要停止线程并等待线程执行完毕。

    希望对你有帮助!


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 修改了问题 11月2日
  • 修改了问题 11月2日
  • 展开全部