2017-05-09 45 views
0

我是新来的Python和PyQt的很抱歉,如果我无法描述我的问题清楚。我想做一个电影院的座位选择UI,这是我做了下面的代码:PyQt的 - QPushButton环

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,我应该怎么做,如果我想要实现同样功能的所有按钮?

非常感谢!

回答

0

你不应该叫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,但它仍然应该在你的环境中(我希望)工作。

+0

太感谢你了!它像一个魅力。另外,您能否告诉我如何在所有按钮(例如A1,A2,B1,B2 ...)上使用此功能而无需为每个按钮创建功能? – pooroll

+0

我一直希望有一个事件处理函数,每个事件,即使有不同的部件相同类型的事件。如果在几个处理程序中有共同的功能,我将其分解成单独的方法。然后我从每个处理程序调用该方法。有时候这会导致很多小函数,但是性能损失通常是微不足道的,并且代码更易于阅读和理解。 –