PyQt - цикл QPushButton

Я новичок в Python и PyQt, так что извините, если не могу четко описать свои проблемы. Я хочу сделать пользовательский интерфейс селектора сидений в кинотеатре, и вот код, который я сделал ниже:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import (QWidget, QApplication)

class Ui2(QWidget):
    def __init__(self):
        super(Ui2, self).__init__()
        uic.loadUi('seat.ui', self)
        self.A1.setStyleSheet("background-color: red")
        self.B1.clicked.connect(self.greenButton)
        self.show()

    def greenButton(self):
        self.B1.setStyleSheet("background-color: green")
        self.B1.clicked.connect(self.whiteButton)

    def whiteButton(self):
        self.B1.setStyleSheet("background-color: white")
        self.B1.clicked.connect(self.greenButton)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Ui2()
    sys.exit(app.exec_())

Проблема в том, что если я нажимаю кнопку B1 несколько раз, программа зависает - я где-то читал, что это вызвано переполнением памяти.

Кроме того, это только для кнопки B1, что мне делать, если я хочу реализовать одинаковые функции для всех кнопок?

Большое спасибо!

1 ответ

Решение

Вы не должны вызывать self.B1.clicked.connect так много раз. Каждый раз, когда вы вызываете эту функцию, она регистрирует другой обработчик событий. Когда кнопка нажата, все обработчики событий, которые когда-либо были зарегистрированы, вызываются. Так как вы продолжаете нажимать, каждый щелчок вызывает все больше и больше вещей. В конце концов это не удается.

В общем, вы хотите попробовать иметь один обработчик для каждого события. Вот один простой способ сделать это:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import (QWidget, QApplication)

class Ui2(QWidget):
    def __init__(self):
        super(Ui2, self).__init__()
        uic.loadUi('seat.ui', self)
        self.b1_color = "green"
        self.A1.setStyleSheet("background-color: red")
        self.B1.clicked.connect(self.onButton)
        self.show()

    def onButton(self):
        if self.b1_color == "green":
            self.b1_color = "white"
        else:
            self.b1_color = "green"
        self.B1.setStyleSheet("background-color: " + self.b1_color)

Протестировано с PySide и Qt4.8, но все равно должно работать в вашей среде (я надеюсь).

Другие вопросы по тегам