如何无需点击按钮自动调用PyQt5函数?Python3.5定时触发需求
实现PyQt5中文本矩阵自动定时变色的方案
首先明确一点:QPushButton(或它的继承类)并没有提供“一段时间未点击后自动调用函数”的内置方法。不过PyQt5里有专门做定时任务的工具——QTimer,这正是你实现自动定时调用setColor函数的最佳选择。
具体实现思路
- 初始化定时器实例:在类的初始化方法里创建
QTimer对象,将它的timeout信号和你的setColor方法绑定。 - 设置定时间隔并启动:根据需求设置触发间隔(单位是毫秒),启动定时器后,它就会每隔指定时间自动触发一次
setColor。 - (可选)保留手动触发逻辑:如果需要保留原按钮的手动触发功能,两者可以共存,互不影响。
修改后的完整代码示例
我调整了你的代码,加入了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
相关产品推荐
相关产品推荐

