2017-11-11 6 views
0

ボタンをクリックせずにシリアル接続を自動化しようとしています。 GUIロード時には、マウスを使用せずに任意のボタン(自動読み込みと更新)を使わずに、直ちにシリアルを読み込み、間隔を空けてリフレッシュする必要があります。PyQt5 - 自動化シリアルモジュール

これはどのように可能ですか? ...スクリプトと以下のGUIを参照してください

import schedule 
import serial 
import sys 
from PyQt5 import uic, QtWidgets 


qtCreatorFile = "gui.ui" 

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

estudiantes = [' ',' ','  ',' '] 

ser = serial.Serial('COM9', baudrate=9600, timeout=1) 

class MyApp(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     QtWidgets.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self) 
     self.Boton.clicked.connect(self.ingresos) 
     #self.ingresos() 

    def ingresos(self): 

     dato = ser.readline().decode('ascii') 

     #datos = (self.Box4.toPlainText()) 
     #dato = str(datos) 
     estudiantes.insert(0,dato) 
     estudiantes.pop() 

     self.Box1.setText(estudiantes[0]) 
     self.Box2.setText(estudiantes[1]) 
     self.Box3.setText(estudiantes[2]) 
     self.Box4.setText(estudiantes[3]) 
     #self.Box1.setText("estudiantes") 

# ============================================= 
     def job(): 
      # print("I'm working...") 
      dato = ser.readline().decode('ascii') 

      #datos = (self.Box4.toPlainText()) 
      #dato = str(datos) 
      estudiantes.insert(0,dato) 
      estudiantes.pop() 

      self.Box1.setText(estudiantes[0]) 
      self.Box2.setText(estudiantes[1]) 
      self.Box3.setText(estudiantes[2]) 
      self.Box4.setText(estudiantes[3]) 
      #self.Box1.setText("estudiantes") 

     # .......................  

     schedule.every(0.05).minutes.do(job) 

     while True: 
      schedule.run_pending() 
      time.sleep(1)   

# .... Time definition .... 
# 0.05 = 05 Seconds 
# 0.50 = 50 Seconds 
# 5.00 = 05 Minutes 

# ============================================= 




if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv) 
    window = MyApp() 
    window.show() 
    sys.exit(app.exec_()) 

PyQt5 GUI .uiファイルはHERE ....です

答えて

0

のQtでの基本的なルールは、GUIは、メイン以外のスレッドから更新すべきではないということですこれはGUIスレッドと呼ばれます。非常に近かった

qtCreatorFile = "gui.ui" 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 
estudiantes = [' ',' ','  ',' '] 

class SerialRunnable(QtCore.QRunnable): 
    def __init__(self, w): 
     QtCore.QRunnable.__init__(self) 
     self.w = w 
     self.ser = serial.Serial('COM9', baudrate=9600, timeout=1) 

    def run(self): 
     while True: 
      dato = self.ser.readline().decode('ascii') 
      if dato != "": 
       QtCore.QMetaObject.invokeMethod(self.w, "setValues", 
            QtCore.Qt.QueuedConnection, 
            QtCore.Q_ARG(str, dato)) 
      QtCore.QThread.msleep(10) 


class MyApp(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     QtWidgets.QMainWindow.__init__(self) 
     self.setupUi(self) 
     runnable = SerialRunnable(self) 
     QtCore.QThreadPool.globalInstance().start(runnable) 

    @QtCore.pyqtSlot(str) 
    def setValues(self, dato): 
     estudiantes.insert(0,dato) 
     estudiantes.pop() 
     self.Box1.setText(estudiantes[0]) 
     self.Box2.setText(estudiantes[1]) 
     self.Box3.setText(estudiantes[2]) 
     self.Box4.setText(estudiantes[3]) 
+0

コード:例えば以下に示すようにメインスレッドに信号を介してデータを送信、またはQThreadPoolQRunnableを使用するなど、いくつかのオプションがあります。一度に4つのボックスの代わりに2つのボックスを使用するだけです。どうすれば修正できますか? – userPyGeo

+0

@userPyGeoコードを修正しました。どのくらいの頻度でデータを送信しますか? – eyllanesc

+0

それはそれです。スピードは良いです – userPyGeo