2017-05-09 38 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

我一直希望有一個事件處理函數,每個事件,即使有不同的部件相同類型的事件。如果在幾個處理程序中有共同的功能,我將其分解成單獨的方法。然後我從每個處理程序調用該方法。有時候這會導致很多小函數,但是性能損失通常是微不足道的,並且代碼更易於閱讀和理解。 –