2017-05-09 19 views
0

私はPythonとPyQtの新機能です。問題をはっきりと記述することはできません。私は映画館の座席選択UIをやりたい、これは私が下に作ったコードです:私は複数回のボタンB1をクリックすると、問題は、プログラムがフリーズしますさ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のみです。すべてのボタンで同じ機能を実装するにはどうすればよいですか?

ありがとうございます!

答えて

0

self.B1.clicked.connectを何度も呼び出すべきではありません。その関数を呼び出すたびに、別のイベントハンドラが登録されます。ボタンをクリックすると、登録されたイベントハンドラがすべて呼び出されます。だからあなたがクリックし続けると、クリックするたびに何かが起こります。最終的には失敗します。

一般に、各イベントに対しての1つのハンドラが必要です。

PySideとQt4.8でテスト
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) 

が、それはまだ(私は願っています)お使いの環境で動作する必要があります。ここではそれを行うための1つの簡単な方法です。

+0

ありがとうございました!それは魅力のように働いた。また、各ボタンの機能を作成せずに、すべてのボタン(A1、A2、B1、B2など)でこの機能を使用するために必要なことを教えてください。 – pooroll

+0

異なるウィジェットに同じタイプのイベントがあっても、常に各イベントに対して1つのイベントハンドラ関数を持つことを好みます。複数のハンドラに共通の機能がある場合は、別の方法にそれを考慮します。次に、各ハンドラからそのメソッドを呼び出します。ときにこの機能がほとんど機能しなくなることもありますが、パフォーマンス上の不利益はほとんどありません。コードは読みやすく理解しやすくなります。 –