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

如何无需点击按钮自动调用PyQt5函数?Python3.5定时触发需求

实现PyQt5中文本矩阵自动定时变色的方案

首先明确一点:QPushButton(或它的继承类)并没有提供“一段时间未点击后自动调用函数”的内置方法。不过PyQt5里有专门做定时任务的工具——QTimer,这正是你实现自动定时调用setColor函数的最佳选择。

具体实现思路

  1. 初始化定时器实例:在类的初始化方法里创建QTimer对象,将它的timeout信号和你的setColor方法绑定。
  2. 设置定时间隔并启动:根据需求设置触发间隔(单位是毫秒),启动定时器后,它就会每隔指定时间自动触发一次setColor。
  3. (可选)保留手动触发逻辑:如果需要保留原按钮的手动触发功能,两者可以共存,互不影响。

修改后的完整代码示例

我调整了你的代码,加入了QTimer的实现,同时修复了一些小问题:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def __init__(self):
        self.width = int(20)
        self.height = int(16)
        self.i = 0
        self.j = 0
        # 初始化定时器
        self.timer = QtCore.QTimer()
        # 绑定定时器超时信号到setColor方法
        self.timer.timeout.connect(self.setColor)
        # 设置定时间隔,这里设为500毫秒(0.5秒),可按需调整
        self.timer.setInterval(500)
        # 启动定时器
        self.timer.start()

    def setColor(self):
        if (self.i < self.height) and (self.j < self.width):
            self.texts[self.i][self.j].setStyleSheet("QTextBrowser {background-color:white}")
            if self.j == self.width - 1:
                self.j = -1
                self.i += 1
            self.j += 1
            # 增加越界判断,避免遍历完所有单元格后报错
            if self.i < self.height and self.j < self.width:
                self.texts[self.i][self.j].setStyleSheet("QTextBrowser {background-color:red}")
        else:
            # 所有单元格遍历完成后停止定时器,也可以改成循环遍历
            self.timer.stop()

    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(40 * int(self.width), 40 * int(self.height) + 10)
        # 修复按钮样式的语法错误,把=改成:
        Dialog.setStyleSheet("QPushButton{\n width: 0px;\n}")
        self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 40 * self.width, 40 * self.height))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.texts = [[QtWidgets.QTextBrowser(self.gridLayoutWidget) for j in range(self.width)] for i in range(self.height)]
        for i in range(self.height):
            for j in range(self.width):
                self.texts[i][j] = QtWidgets.QTextBrowser(self.gridLayoutWidget)
                self.texts[i][j].setObjectName("text" + str(i) + str(j))
                self.gridLayout.addWidget(self.texts[i][j], i, j)
        self.pushButton = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.pushButton, self.height, 1, 1, self.width - 2)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(lambda: self.setColor())
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))

额外小提示

  • 我在setColor里加了越界判断,防止遍历完所有单元格后触发索引错误;如果需要循环变色,可以把self.timer.stop()改成重置self.i和self.j的逻辑。
  • 原代码里按钮样式的width = 0px语法有误,改成了width: 0px才能正确生效。
  • 如果需要手动控制定时器的启停,可以给按钮绑定新的逻辑,比如点击按钮切换self.timer.start()和self.timer.stop()。

内容的提问来源于stack exchange,提问作者Alex Semenchenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:31:02