如何使用Python使用QT Creator for GUI使用来自USB串行(来自Arduino)的数据刷新/更新QLabel?

时间:2018-01-20 18:34:20

标签: python arduino pyqt pyqt4 pyserial

我知道这是一个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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#e9e9e9;&quot;&gt;Lane 1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>

1 个答案:

答案 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