2017-10-07 4 views
1

Der unten stehende Code wird geschrieben, um die Plätze in einem Auditorium Bildschirm auszuwählen .. Wenn ich die CheckBox auswähle, muss das Ergebnis angezeigt werden (Preis des Tickets) und auch wenn ich versuche, das CheckBox das Ergebnis zu deaktivieren sollte abgezogen und angezeigt werden, statt diese Es hält gerade hinzufügen, um das Ergebnis von 180 ...PyQt: Wie benutzt man die QCheckBox.isChecked() Methode

import sys 
from PyQt4 import QtGui, QtCore, QtSql 

class SeatSel(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(SeatSel, self).__init__(parent) 
     self.a = {} 
     self.l = {} 
     self.l1 = QtGui.QLabel("\t\t  Screen", self) 
     self.l1.setStyleSheet("color : black") 
     self.l1.move(210,600) 
     self.l1.setAutoFillBackground(True) 
     self.l1.setMinimumWidth(700) 
     self.l3 = QtGui.QLabel("00    " ,self) 
     self.l3.setStyleSheet("color : white") 
     self.l3.move(1000, 500) 
     self.l3.setMaximumWidth(300) 
     self.display = QtGui.QLabel(self) 
     self.display.setStyleSheet("color : white") 
     self.display.move(800,800) 

     for i in range(14): 
      self.l[(i)] = QtGui.QLabel("%s" % chr(65+i), self) 
      self.l[(i)].setStyleSheet("color : white") 
      self.l[(i)].move(110, 103 + i * 32) 

     for i in range(26): 
      for j in range(14): 
       self.a[(i,j)] = QtGui.QCheckBox(self) 
       self.a[(i,j)].setMaximumSize(40,40) 
       self.a[(i,j)].setCheckable(True) 
       self.a[(i,j)].move(160+ (i-1) * 31,100 + j *32) 

    def seat(self, m_name, x, y): 
     self.l2 = QtGui.QLabel(m_name, self) 
     self.l2.move(x,y) 
     self.l2.setStyleSheet("color : white") 


class DeadPool(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(QtGui.QMainWindow, self).__init__(parent) 
     self.amount = 0 
     self.count = 0 
     self.setGeometry(50, 50, 1920, 1080) 
     self.showMaximized() 
     self.seat_sel("Conjuring", 640,40) 

    def full_screen(self): 
     if self.count == 0: 
      self.count=1 
      self.showFullScreen() 
     else : 
      self.count = 0 
      self.showNormal() 

    def exit(self): 
     sys.exit() 


    def seat_sel(self, m_name, x, y): 
     self.seat = SeatSel(self) 
     self.setWindowTitle("Select Seats") 
     self.setCentralWidget(self.seat) 
     self.seat.seat(m_name, x, y) 
     for i in range(26): 
      for j in range(14): 
       self.seat.a[(i,j)].stateChanged.connect(lambda : 
             self.seat_buttons(i, j)) 
     self.show() 

    def seat_buttons(self, i, j): 
     self.btn_toggle(self.seat.a[(i,j)]) 

    def btn_toggle(self, button): 
     if button.isChecked(): 
      self.amount -= 180 
      self.seat.l3.setNum(self.amount) 
     if not button.isChecked(): 
      self.amount += 180 
      self.seat.l3.setNum(self.amount) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    w = DeadPool() 
    sys.exit(app.exec_()) 

Antwort

1

Es gibt ein Problem, wie Sie die stateChanged verbinden Signal an den lambda Steckplatz. Wenn Sie Signale in einer Schleife verbinden, werden die Variablen nicht zwischengespeichert, sodass alle lambda dieselben Werte aufweisen (d. H. Wie auch immer die endgültigen Werte der Variablen lauten, wenn die Schleife beendet wird). Es gibt mehrere Möglichkeiten, dies zu beheben. Eine Möglichkeit besteht darin, explizit die Werte zwischenzuspeichern Standardargumente verwenden:

for i in range(26): 
     for j in range(14): 
      self.seat.a[(i,j)].stateChanged.connect(
       lambda state, i=i, j=j: self.seat_buttons(i, j)) 

Eine andere Möglichkeit ist die Verwendung functools.partial:

from functools import partial 
... 

    for i in range(26): 
     for j in range(14): 
      self.seat.a[(i,j)].stateChanged.connect(
       partial(self.seat_buttons, i, j)) 

Aber noch einfacher in Ihrem Fall wäre sender() zu verwenden, was gibt was Objekt das Signal gesendet:

for i in range(26): 
     for j in range(14): 
      self.seat.a[(i,j)].stateChanged.connect(self.btn_toggle) 
...  

def btn_toggle(self, state): 
    button = self.sender() 
    if button.isChecked(): 
     self.amount += 180 
     self.seat.l3.setNum(self.amount) 
    else: 
     self.amount -= 180 
     self.seat.l3.setNum(self.amount) 

(PS: beachten sie, dass ich die +/- getauscht habe, weil ich denke, dass sie die falsche Art und Weise sind um in Ihr Beispielcode)