介绍
我是 Python 的绝对初学者,我正在编写一个程序来读取刻度的输出并在小部件中实时显示它。我将 QTextStream 与 PySide 和 Python 2.7.14 一起使用。
问题描述
基本程序以 9600 的波特率监听 USB 端口 /dev/ttyUSB0,并显示从刻度 KERN PCB 100-3 读取的值。秤通过 RS232/USB 转换器连接到 PC 并设置为 AU PC,因此称重值会自动连续发送。到目前为止,该程序仅在控制台中显示值。编码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import serial
# define variables
global valueScale, unitScale, replyScale
# open scale port
scale_port = serial.Serial("/dev/ttyUSB0", 9600)
# read usb port
while True:
if (scale_port.inWaiting() > 0):
replyScale = scale_port.read(18)
valueScale = float(replyScale[3:12])
unitScale = replyScale[13]
print valueScale, unitScale
我发现了一个关于使用QTextStream 和标准输入的类似线程,并根据我的需要进行了修改。编码:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from PySide.QtGui import *
from PySide.QtCore import *
import sys
import serial
# open scale port
scale_port = serial.Serial("/dev/ttyUSB0", 9600)
class Widget(QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.setupUi()
self.setupButtonSlots()
self.setupStreams()
def setupUi(self):
self.setLayout(QVBoxLayout())
self.pbReadQt = QPushButton("Read console (using QTextstream)", self)
self.labelReadQt = QLabel('Console output: ', self)
self.layout().addWidget(self.pbReadQt)
self.layout().addWidget(self.labelReadQt)
def setupButtonSlots(self):
self.pbReadQt.clicked.connect(self.readQt)
def setupStreams(self):
self.stdin = QFile()
self.stdin.open(0, QIODevice.OpenMode(QIODevice.OpenModeFlag.ReadOnly))
self.stdout = QFile()
self.stdout.open(1, QIODevice.OpenMode(QIODevice.OpenModeFlag.WriteOnly)) # orginal WriteOnly
self.inStream = QTextStream(self.stdin)
self.outStream = QTextStream(self.stdout)
def readQt(self):
global valueScale, unitScale, replyScale
while True:
if (scale_port.inWaiting() > 0):
replyScale = scale_port.read(18)
valueScale = float(replyScale[3:12])
unitScale = replyScale[13]
print valueScale
txt = self.outStream.readLine()
self.labelReadQt.setText('Scale output: %s' % txt)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
运行程序,控制台会显示实时print()
语句以及消息QIODevice::read: WriteOnly device
,并将其更改OpenModeFlag
为ReadOnly
仅给出第一次读数。
问题
它根本不显示控制台输出的小部件。问题出在哪里?