PyQt5界面跨文件取值问题求助:SpinBox驱动按钮定时器失效
问题分析与修复方案
现存问题
- 控件未正确绑定:
Hot_Strt_Test_Btn类的__init__方法接收了pushButton_object参数,但未将其赋值给self.pushButton,导致后续调用self.pushButton会抛出属性不存在的错误。 - 未读取SpinBox数值:代码中固定使用
bt3_timer = 10作为倒计时时长,没有从界面的SpinBox获取用户设置的值。 - 缺少必要导入:
Hot_Strt_Test.py中使用了QTimer但未导入,运行时会报错。 - 样式重复设置:
Refresh方法中每次触发都重复设置按钮红色样式,属于冗余操作。 - 未关联界面与逻辑类:主程序中没有实例化
Hot_Strt_Test_Btn,导致按钮点击逻辑未生效。
修复步骤
- 修改
Hot_Strt_Test_Btn的构造方法,接收按钮和SpinBox两个控件对象,保存为实例属性。 - 在按钮点击时读取SpinBox的当前值作为倒计时时长,确保每次使用最新设置。
- 补充
QTimer的导入语句,解决依赖问题。 - 将样式设置逻辑移到倒计时开始和结束的节点,避免重复操作。
- 在主程序中导入并实例化
Hot_Strt_Test_Btn,绑定界面控件。
修改后的代码
Hot_Strt_Test.py
from PyQt5.QtCore import QTimer class Hot_Strt_Test_Btn(): def __init__(self, pushButton_object, spinBox_object): self.pushButton = pushButton_object self.spinBox = spinBox_object self.count = self.spinBox.value() self.pushButton.clicked.connect(self.Action) self.time = QTimer(self.pushButton) self.time.setInterval(1000) self.time.timeout.connect(self.Refresh) def Action(self): if self.pushButton.isEnabled(): self.count = self.spinBox.value() self.time.start() self.pushButton.setEnabled(False) self.pushButton.setStyleSheet(""" QPushButton { background-color : red; } """) def Refresh(self): if self.count > 0: self.pushButton.setText(f'HOT START RUNNING\n{self.count} secs') self.count -= 1 else: self.time.stop() self.pushButton.setEnabled(True) self.pushButton.setText('HOT START') self.pushButton.setStyleSheet(""" QPushButton { background-color : lightgray; } """)
ForEmail.py(修改主程序部分)
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import QSize, QTimer class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(398, 235) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.frame = QtWidgets.QFrame(self.centralwidget) self.frame.setGeometry(QtCore.QRect(40, 20, 161, 121)) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.spinBox = QtWidgets.QSpinBox(self.frame) self.spinBox.setGeometry(QtCore.QRect(92, 33, 51, 19)) self.spinBox.setObjectName("spinBox") self.label = QtWidgets.QLabel(self.frame) self.label.setGeometry(QtCore.QRect(90, 10, 52, 16)) self.label.setObjectName("label") self.pushButton = QtWidgets.QPushButton(self.frame) self.pushButton.setGeometry(QtCore.QRect(11, 31, 75, 23)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 398, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "HS_DELAY")) self.pushButton.setText(_translate("MainWindow", "HOT START")) if __name__ == "__main__": import sys from Hot_Strt_Test import Hot_Strt_Test_Btn app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) Hot_Strt_Test_Btn(ui.pushButton, ui.spinBox) MainWindow.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

