Как вызвать функцию, не нажимая кнопку? - PullRequest
2 голосов
/ 09 мая 2019

Я пишу на Python 3.5, используя PyQt5 GUI.Прототипом моего проекта является приложение, которое создает матрицу текстов и меняет цвет каждой «ячейки», одну за другой.Теперь это происходит при нажатии кнопки, которая связана с функцией.

Мне нужно вызвать функцию, которая изменяет конфигурацию 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"))

1 Ответ

1 голос
/ 09 мая 2019

Класс QTimer предоставляет повторяющиеся и одиночные таймеры.

Класс QTimer предоставляет высокоуровневый интерфейс программирования для таймеров. Чтобы использовать его, создайте 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_())        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...