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, но все равно должно работать в вашей среде (я надеюсь).