2017-05-09 8 views
0

Ich bin neu in Python und PyQt so leid, wenn ich meine Probleme nicht klar beschreiben kann. Ich möchte einen Kinosessel Wähler UI zu tun und das ist der Code, den ich unten gemacht habe:PyQt - QPushButton Schleife

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_()) 

Das Problem ist, wenn ich die Taste B1 mehrmals, um das Programm einfrieren - ich habe irgendwo gelesen, dass dies verursacht durch vollen Speicher.

Auch dies ist nur für die Taste B1, was soll ich tun, wenn ich die gleichen Funktionen für alle Tasten implementieren möchte?

Vielen Dank!

Antwort

0

Sie sollten self.B1.clicked.connect nicht so oft aufrufen. Jedes Mal, wenn Sie diese Funktion aufrufen, registriert sie einen anderen Event-Handler. Wenn auf die Schaltfläche geklickt wird, werden alle Event-Handler aufgerufen, die jemals registriert wurden. Während Sie weiterklicken, verursacht jeder Klick mehr und mehr Dinge. Irgendwann scheitert es.

Im Allgemeinen möchten Sie versuchen, einen Handler für jedes Ereignis zu haben. Hier ist eine einfache Möglichkeit, das zu tun:

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) 

Getestet mit pyside und Qt4.8, aber es sollte noch in Ihrer Umgebung arbeiten (hoffe ich).

+0

Vielen Dank! Es hat wie ein Zauber funktioniert. Können Sie mir auch sagen, was ich tun soll, um diese Funktion an allen Tasten (z. B. A1, A2, B1, B2 ...) zu verwenden, ohne Funktionen für jede Taste zu erstellen? – pooroll

+0

Ich bevorzuge immer eine Ereignishandlerfunktion für jedes Ereignis, selbst wenn es Ereignisse desselben Typs auf verschiedenen Widgets gibt. Wenn es unter mehreren Handlern eine gemeinsame Funktionalität gibt, faktor ich das in eine separate Methode. Dann rufe ich diese Methode von jedem Handler auf. Manchmal führt dies zu vielen kleinen Funktionen, aber die Leistungseinbußen sind in der Regel unbedeutend und der Code ist leichter zu lesen und zu verstehen. –