2017-05-09 1 views
0

Python과 PyQt에 익숙하지 않아서 문제를 분명하게 설명 할 수 없으면 미안합니다. 나는 영화관 좌석 선택 UI를 수행 할 이것은 내가 아래에 만든 코드입니다 : 나는 여러 번 버튼 B1을 클릭하면 문제는, 프로그램이 동결되어PyQt - QPushButton loop

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에만 해당되며 모든 버튼에 동일한 기능을 구현하려면 어떻게해야합니까?

고맙습니다.

답변

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과 테스트,하지만 여전히 사용자 환경 (I 희망)에서 작동합니다.

+0

정말 고마워요! 그것은 매력처럼 작동했습니다. 또한 각 버튼에 대한 기능을 만들지 않고 모든 버튼 (예 : A1, A2, B1, B2 ...)에서이 기능을 사용하기 위해 내가해야 할 일을 말해 줄 수 있습니까? – pooroll

+0

다른 위젯에 같은 유형의 이벤트가 있어도 각 이벤트에 대해 하나의 이벤트 핸들러 기능을 항상 선호합니다. 여러 핸들러간에 공통된 기능이있는 경우이를 별도의 메소드로 분해합니다. 그런 다음 각 처리기에서 해당 메서드를 호출합니다. 때때로이 기능은 많은 기능을 제공하지만 성능 저하는 일반적으로 중요하지 않으며 코드를 읽고 이해하기가 더 쉽습니다. –