You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5界面跨文件取值问题求助:SpinBox驱动按钮定时器失效

问题分析与修复方案

现存问题

  1. 控件未正确绑定:Hot_Strt_Test_Btn类的__init__方法接收了pushButton_object参数,但未将其赋值给self.pushButton,导致后续调用self.pushButton会抛出属性不存在的错误。
  2. 未读取SpinBox数值:代码中固定使用bt3_timer = 10作为倒计时时长,没有从界面的SpinBox获取用户设置的值。
  3. 缺少必要导入:Hot_Strt_Test.py中使用了QTimer但未导入,运行时会报错。
  4. 样式重复设置:Refresh方法中每次触发都重复设置按钮红色样式,属于冗余操作。
  5. 未关联界面与逻辑类:主程序中没有实例化Hot_Strt_Test_Btn,导致按钮点击逻辑未生效。

修复步骤

  1. 修改Hot_Strt_Test_Btn的构造方法,接收按钮和SpinBox两个控件对象,保存为实例属性。
  2. 在按钮点击时读取SpinBox的当前值作为倒计时时长,确保每次使用最新设置。
  3. 补充QTimer的导入语句,解决依赖问题。
  4. 将样式设置逻辑移到倒计时开始和结束的节点,避免重复操作。
  5. 在主程序中导入并实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:02:23