gpt4 book ai didi

python - 如何通过不单击按钮来调用函数?

转载 作者:太空宇宙 更新时间:2023-11-04 04:12:41 24 4
gpt4 key购买 nike

我正在使用 PyQt5 GUI 在 Python 3.5 上进行编码。我的项目原型(prototype)是一个应用程序,它创建文本矩阵并逐个更改每个“单元格”的颜色。现在它发生在点击按钮上,它与函数相关联。

我需要调用更改 BrowserText 配置的函数,而无需用户与应用进行任何交互。换句话说,调色板应该在具体的时间间隔内自行改变颜色。

那么,QPushButton 小部件(或任何继承的小部件)中是否有任何方法,例如,在一段时间未单击它后调用该函数?如果没有,我可以通过某种方式自动调用函数吗?

设计类代码如下:

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

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
self.texts[self.i][self.j].setStyleSheet("QTextBrowser {background-color:red}")


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"))

最佳答案

QTimer 类提供重复和单次定时器。

QTimer 类为计时器提供了高级编程接口(interface)。要使用它,请创建一个 QTimer,将其 timeout() 信号连接到适当的槽,然后调用 start()。从那时起,它将以固定的时间间隔发出 timeout() 信号。

试一试:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


class Ui_Dialog(object):

def __init__(self):
self.width = int(20)
self.height = int(16)
self.i = 0
self.j = 0

"""
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
self.texts[self.i][self.j].setStyleSheet("QTextBrowser {background-color:red}")
"""

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("Button", 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"))


class Window(QWidget, Ui_Dialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)

self.setupUi(self)

self.width = int(20)
self.height = int(16)
self.i = 0
self.j = 0

self.timer = QtCore.QTimer(interval=1000) # <-------
self.timer.timeout.connect(self.setColor)
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
self.texts[self.i][self.j].setStyleSheet("QTextBrowser {background-color:red}")



if __name__ == "__main__":
application = QtWidgets.QApplication(sys.argv)
window = Window()
window.setWindowTitle('How to call function by not clicking the button?')
window.show()
sys.exit(application.exec_())

关于python - 如何通过不单击按钮来调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56059033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com