我知道这是一个NOOB问题;原谅我。我使用Arduino控制计时和RasPi的组合为Cub Scouts建立了Pinewood Derby比赛计时器(小型车道),用于显示车道位置(第1,第2,第3等)的GUI显示和运行时间(例如& #34; 2.1234&#34)。我在QT Creator中有基本的shell GUI设置,并成功连接了Arduino& RasPi通过USB。我也成功地将Arduino串行数据拉入RasPi(使用单独的小型Python代码进行测试)。
我遇到的问题是,一旦Arduino通过USB激活竞赛结果字符串,就会动态更新GUI中的QLabel。换句话说,当比赛开始时,Arduino发送" B"开始(需要GUI来清空以前的结果);比赛结束后,Arduino发送" F"然后发送地点" 1"随着时间的推移" 2.1234"我需要Python来更新/更改每个车道位置和车道时间的相应QLabel。我相信有一个简单的方法可以做到这一点,但我无法找到如何通过搜索这个很棒的网站和其他人。
非常感谢,我为随后可能的FUBAR编码道歉!下面的示例仅显示一条车道与我将使用的4x车道,一旦我弄清楚如何执行此操作。
我正在使用两个Python代码:
与QT Creator生成的XML代码接口的Python代码:
import sys
import time
import serial
from PyQt4 import QtCore, QtGui, uic
global ser
ser=serial.Serial("/dev/ttyUSB1",115200)
ser.flushInput()
qtCreatorFile = "PinewoodDisplay.ui" # Enter file here.
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
class MyApp(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setupUi(self)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
while True:
if ser.inWaiting()>0:
inputValue = (ser.readline().strip())
self.Lane1_Place.setText(inputValue)
从QT Creator生成的XML(不确定我是否正确发布) - 文件名为" PinewoodDisplay.ui":
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>619</width>
<height>1051</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(102, 102, 108)</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QGroupBox" name="Lane1_Group">
<property name="geometry">
<rect>
<x>50</x>
<y>20</y>
<width>481</width>
<height>741</height>
</rect>
</property>
<property name="cursor">
<cursorShape>CrossCursor</cursorShape>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color : rgb(0, 75, 0)</string>
</property>
<property name="title">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QLabel" name="Lane1_Place">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Button">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Text">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="ButtonText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Button">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Text">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="ButtonText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Button">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Text">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="ButtonText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
<colorrole role="Base">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
<colorrole role="Window">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>75</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="font">
<font>
<family>Gentium Book Basic</family>
<pointsize>350</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(255, 255, 255)</string>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="text">
<string>4</string>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="Lane1_Time">
<property name="font">
<font>
<pointsize>90</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(255, 255, 255)</string>
</property>
<property name="text">
<string>4.5678</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lblLane1">
<property name="font">
<font>
<pointsize>36</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(255, 255, 255)</string>
</property>
<property name="text">
<string><html><head/><body><p><span style=" color:#e9e9e9;">Lane 1</span></p></body></html></string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>619</width>
<height>27</height>
</rect>
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="actionTest">
<property name="text">
<string>test</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
答案 0 :(得分:0)
阻止诸如while之类的任务您需要读取串行数据是不友好的GUI,因此您不应该在同一个线程上运行,相应的选项是在另一个线程上执行它们,并发送必要的信息通过信号到主线程。
Logger.getLogger("org.hibernate").setLevel(Level.WARNING);
可以使用import sys
import serial
from PyQt4 import QtCore, QtGui, uic
qtCreatorFile = "PinewoodDisplay.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
class SerialThread(QtCore.QThread):
dataChanged = QtCore.pyqtSignal(str)
def __init__(self, *args, **kwargs):
QtCore.QThread.__init__(self, *args, **kwargs)
self.ser = serial.Serial("/dev/ttyUSB1",115200)
def run(self):
while True:
if self.ser.inWaiting()>0:
inputValue = self.ser.readline().strip()
self.dataChanged.emit(inputValue)
class MyApp(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
thread = SerialThread(self)
thread.dataChanged.connect(self.Lane1_Place.setText, QtCore.Qt.QueuedConnection)
thread.start()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
和QRunnable
执行相同的任务,也可以发送您可以使用的数据QThreadPool