2016-11-02 20 views
1

シリアルで値を取り込み、それらの値でGuiを更新しようとしているときに問題が発生しています。残念ながら、値が正しく更新されても、私はそれをクリックしてから戻ってこない限り、画面を更新することができません。私は、repaint、update、processEvents()を試みましたが、問題を解決することができませんでした。PyQt5 GUIは、画面をクリックして戻したときにのみ更新されます。

import sys 
import serial 
import time 
import requests 


import PyQt5 
from PyQt5.QtWidgets import * 
from PyQt5.QtCore import* 
from PyQt5.QtGui import * 

import mainwindow_auto 


CUSTOM_EVENT = 1000 
ser = serial.Serial('/dev/ttyACM0', 9600) 
class TestThread(QThread): 

    def __init__(self, target): 
     QThread.__init__(self) 
     self.target = target 

    def run(self): 
     while True: 
      QApplication.postEvent(self.target, QEvent(QEvent.Type(CUSTOM_EVENT))) 
      QApplication.processEvents() 
      QThread.sleep(15) 




class MainWindow(QMainWindow, mainwindow_auto.Ui_MainWindow): 

    def __init__(self): 
     super(self.__class__, self).__init__() 
     self.setupUi(self)# gets defined in the UI file 
     self.thread = TestThread(self) 
     self.thread.start() 

    def event(s, e): 
     if(e.type() == CUSTOM_EVENT): 
      print("Readline: ",int(ser.readline())) 
      SOC = int(ser.readline()) 
      s.lcdNumber.display(SOC) 
      s.progressBar.setValue(SOC) 
      print("SOC: ",SOC) 
      print(s.lcdNumber.value()) 

     return True 


def main(): 

    app = QApplication(sys.argv) 
    form = MainWindow() 
    form.lcdNumber.display(30) 
    form.progressBar.setValue(30) 
    form.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

事前に感謝します:ここで

は、私が働いているコードがあります!

答えて

1

すでにI/Oスレッドがあるので、I/Oを処理させ、受信した値をシグナル経由でメインスレッドに送信します。

カスタムイベントは不要で、メインスレッドではI/Oが必要ありません。 スレッドのサブクラスにシグナルを追加し、スレッドを開始する前にスロットに接続するだけです。

+0

こんにちはケビン!早速の対応、ありがとうございました!私はあなたが提案したルートに行きましたが、多くのデバッグ(PyQtを使って初めて)で終了しました。私は画面を隠して再描画することで力の再描画で解決しました。ベストプラクティスではないかもしれないが、それまでは安定していた。あなたの助けをもう一度ありがとう! –

0

上記のコードを書き直すのではなく、イベントコードの値を更新した後にs.hide()およびs.show()を使って強制的に再描画することで解決しました。そうしないと作業を拒否した再描画を余儀なくされました。

s.lcdNumber.display(SOC) 
s.progressBar.setValue(SOC) 
s.hide() 
s.show() 
0

@KevinKrammerによって示唆されるように、これは、カスタム信号と関係するのは簡単です:

class TestThread(QThread): 
    serialUpdate = pyqtSignal(int) 

    def run(self): 
     while True: 
      QThread.sleep(1) 
      value = int(ser.readline()) 
      self.serialUpdate.emit(value) 

class MainWindow(QMainWindow, mainwindow_auto.Ui_MainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.setupUi(self) 
     self.thread = TestThread(self) 
     self.thread.serialUpdate.connect(self.handleSerialUpdate) 
     self.thread.start() 

    def handleSerialUpdate(self, value): 
     print("Readline: ", value) 
     self.lcdNumber.display(value) 
     self.progressBar.setValue(value) 
関連する問題