gpt4 book ai didi

python - 从外部函数访问 QLCDNumber 对象

转载 作者:行者123 更新时间:2023-12-03 12:58:49 25 4
gpt4 key购买 nike

每当线程 t1 每秒调用函数 wait_thread_v1 时,我的 python 脚本都需要更改一个对象 lcd_p1,但这是怎么做的?我不知道如何在函数内部访问这个对象?任何人都可以帮忙吗?

vazao1 = 12
global pulses_v1
pulses_v1 = 0

GPIO.setmode(GPIO.BCM)
GPIO.setup(vazao1, GPIO.IN)

class Window(QWidget):

def __init__(self):
super().__init__()
self.setGeometry(50, 50, 640, 480)
self.setWindowTitle("Programa")
self.initUI()

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)

def count_pulses_v1(channel):
global pulses_v1
pulses_v1 += 1

def wait_thread_v1():
global pulses_v1
while True:
time.sleep(1)
print("Pulsos total de vazão 1: "+str(pulses_v1))
#Window.initUI.self.lcd_p1.display(100)
pulses_v1 = 0

GPIO.add_event_detect(vazao1, GPIO.FALLING, callback=count_pulses_v1)
t1 = Thread(target=wait_thread_v1, name='thread_01', args=())
t1.start()

if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())

最佳答案

the docs 所示,您不能也不应该从辅助线程修改 GUI。因为除了不需要创建新线程之外,Qt 不保证它可以工作。在这种情况下,最好创建一个 QObject 在调用回调时发出信号,因为它是线程安全的,然后将该信号连接到增加脉冲的槽,然后使用 QTimer 来实现线程的逻辑.

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())

关于python - 从外部函数访问 QLCDNumber 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59736501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com