PyQt5开发QLCDNumber同步计数器时出现Ui_WizardPage无lcdTemp属性错误
报错根因
你遇到的AttributeError: 'Ui_WizardPage' object has no attribute 'lcdTemp',本质是对象未完成初始化就被访问:
Ui_WizardPage类里的self.lcdTemp属性,是在setupUi()方法内部才会被赋值创建的。你在全局位置直接实例化的obj1 = Ui_WizardPage(),从创建到调用全程没有执行过setupUi()流程,自然不存在lcdTemp这个属性。- 主程序入口里创建的
ui = Ui_WizardPage(),才是完整执行了setupUi()、真正挂载了所有界面控件的有效实例。你在定时器回调hello()里错误访问了未初始化的obj1的lcdTemp,直接触发属性不存在的报错。
代码附带的其他运行隐患
- 跨线程操作GUI不合规:用
threading.Timer启动的后台定时任务属于子线程,PyQt明确要求所有界面控件的修改必须在主线程执行,直接在子线程调用lcdTemp.display()会引发随机崩溃、界面无响应,这类问题没有固定报错点,排查难度远高于当前的属性错误。 - GPIO操作缺少前置初始化:
opm()方法里直接执行GPIO.output(12, GPIO.HIGH),没有提前设置GPIO引脚的编码模式、配置引脚为输出状态,在树莓派硬件环境下运行会直接触发GPIO权限或配置类报错。
具体修复步骤
- 删掉全局冗余实例
obj1 = Ui_WizardPage(),定时器回调中所有涉及界面控件的操作,统一使用主入口里完成初始化的ui实例关联。 - 把跨线程直接更新LCD的逻辑改成PyQt原生信号槽机制:
- 在
Ui_WizardPage类内部定义自定义信号:counter_updated = QtCore.pyqtSignal(int) - 类初始化时将信号和更新LCD显示的槽函数绑定
- 后台定时器线程只负责累加计数器值,通过信号把数值传递给主线程,由主线程的槽函数执行LCD刷新,从根源上保证线程安全
- 在
- 程序启动时补全GPIO初始化逻辑:依次调用
GPIO.setmode()设置引脚编码规则、GPIO.setup(12, GPIO.OUT)配置引脚方向;程序退出时调用GPIO.cleanup()释放硬件资源,避免下次启动出现引脚状态异常。
内容的提问来源于stack exchange,提问作者debishree mishra
相关产品推荐
相关产品推荐

