2017-10-07 11 views
1

아래 코드는 강당 화면에서 좌석을 선택하기 위해 작성되었습니다. CheckBox를 선택하면 표시 할 결과 (Price of the Ticket)가 필요합니다. 또한 나는PyQt : QCheckBox.isChecked() 메서드 사용 방법

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_()) 

답변

1

당신이 stateChanged을 연결하는 방법에 문제가 있습니다 ... 그냥 180에 의해 결과를 추가 계속 것 대신에 이런 결과가 차감하여 표시해야 할 체크 박스를 체크 해제하려고 할 때 신호를 lambda 슬롯에 보내십시오. 루프에서 신호를 연결할 때 변수는 캐시되지 않으므로 모든 lambda은 동일한 값 (즉, 루프가 종료 될 때 변수의 최종 값이 무엇이든)으로 끝납니다. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

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)) 

그러나 귀하의 경우에도 간단하게, 어떤 객체 반환, sender()을 사용하는 것입니다 :

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)) 

또 다른 방법은 functools.partial이 사용하는 것입니다 : 한 가지 방법은 명시 적으로 기본 인수를 사용하여 값을 캐시하는 것입니다 신호를 보내

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 : 나는 그들이 주위에서 길을 잘못 생각하기 때문에 나는 +/- 교환 한 점에 유의 예제 코드)