Access a QLCDNumber object from a external function

后端 未结 1 2001
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-22 16:55

My python script need to change one object lcd_p1 every time the function wait_thread_v1 is call every second by a thread t1, but how do this? I don\'t know how to access this

相关标签:
1条回答
  • 2021-01-22 17:03

    You cannot and should not modify the GUI from a secondary thread as indicated by the docs since Qt does not guarantee that it works besides that it is unnecessary to create a new thread. In this case it is better to create a QObject that emits the signal when the callback is invoked since it is thread-safe, and then connect that signal to a slot that increases the pulses, then use a QTimer to implement the logic of the thread.

    import sys
    
    from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QTimer
    from PyQt5.QtWidgets import QApplication, QLCDNumber, QWidget
    
    import RPi.GPIO as GPIO
    
    
    class Window(QWidget):
        def __init__(self):
            super().__init__()
    
            self.pulses = 0
    
            self.setGeometry(50, 50, 640, 480)
            self.setWindowTitle("Programa")
            self.initUI()
    
            timer = QTimer(self, timeout=self.on_timeout, interval=1000)
            timer.start()
    
        def initUI(self):
            self.lcd_v1 = QLCDNumber(self)
            self.lcd_v1.display(0)
            self.lcd_v1.setDigitCount(4)
            self.lcd_v1.setFixedWidth(180)
            self.lcd_v1.setFixedHeight(80)
            self.lcd_v1.move(60, 320)
    
        @pyqtSlot()
        def falling_slot(self):
            self.pulses += 1
    
        @pyqtSlot()
        def on_timeout(self):
            self.lcd_v1.display(self.pulses)
            self.pulses = 0
    
    
    class GPIOManager(QObject):
        fallingSignal = pyqtSignal()
    
        def __init__(self, parent=None):
            super().__init__(parent)
    
            pin = 12
            GPIO.setmode(GPIO.BCM)
            GPIO.setup(pin, GPIO.IN)
            GPIO.add_event_detect(pin, GPIO.FALLING, callback=self.falling_callback)
    
        def falling_callback(self, channel):
            # This method is called in the thread where GPIOs are monitored.
            self.fallingSignal.emit()
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
    
        window = Window()
        window.show()
        manager = GPIOManager()
        manager.fallingSignal.connect(window.falling_slot)
    
        sys.exit(app.exec())
    
    0 讨论(0)
提交回复
热议问题