2017-03-31 1 views
1

일부 밸브를 GUI로 제어하고 버튼을 눌렀을 때 디스플레이를 업데이트하려고합니다. 다음 코드는 올바른 초기 표시를 생성하지만 체크 상자 중 하나를 클릭하면 항상 i=2의 값을 얻습니다. 선택을 취소하면 i=0이 표시됩니다. 또한 메시지가 close에서 open으로 바뀌고 역으로 바뀔 수 있도록 도킹 된 창을 업데이트하는 방법을 알지 못합니다. 내가 배열의 self.states 변화의 결과 값을 참조 할 수 있지만,이 변경되지 않습니다 화면의 오른쪽에 closed 빨간색을 변경하지만 항상 ['open', 'closed', 'open', 'closed', 'closed', 'closed'] 왼쪽하고`개방도킹 된 창 트리거링 및 업데이트 PyQt

class ApplicationWindow(gui.QMainWindow): 
    def __init__(self): 
     self.nCheckBoxes=6 
     self.states = ['closed']*self.nCheckBoxes 

     gui.QMainWindow.__init__(self) 
     self.setAttribute(core.Qt.WA_DeleteOnClose) 
     self.setWindowTitle("PiView") 
     self.file_menu = gui.QMenu('&File', self) 
     self.file_menu.addAction('&Quit', self.fileQuit, core.Qt.CTRL + core.Qt.Key_Q) 
     self.menuBar().addMenu(self.file_menu) 
     self.help_menu = gui.QMenu('&Help', self) 
     self.menuBar().addSeparator() 
     self.menuBar().addMenu(self.help_menu) 
     self.help_menu.addAction('&About', self.about) 
     self.help_menu.addAction('&Docs', self.doc) 
     self.main_widget = gui.QWidget(self) 

     l = gui.QVBoxLayout(self.main_widget) 
     self.dc = MyMplCanvas(self.main_widget, width=5, height=4, dpi=100) 
     l.addWidget(self.dc) 

     self.main_widget.setFocus() 
     self.setCentralWidget(self.main_widget) 

     self.dw = self.createDockWindows(self.dc) 
     self.statusBar().showMessage("Initialized", 2000) 

    def createDockWindows(self, MyMplCanvas): 
     """ 
     Create all the dock widgets 
     """ 
     self.drawValves() 
     self.drawGraphAdjustments() 
     self.drawStartAndStop() 

    def drawValves(self): 
     cboxes = gui.QDockWidget("Controls", self) 
     cboxes.setAllowedAreas(core.Qt.LeftDockWidgetArea) 
     w = gui.QWidget() 
     #layout = gui.QVBoxLayout() 
     layout = gui.QGridLayout() 
     w.setLayout(layout) 

     self.c = [0]*self.nCheckBoxes 
     # Create self.nCheckBoxes 
     msgBox = gui.QLabel() 
     msgBox.setText("States") 
     font = gui.QFont() 
     font.setBold(True) 
     msgBox.setFont(font) 
     msgBox.setStyleSheet("color: rgb(255,0,0)") 
     layout.addWidget(msgBox,0,1) 
     for i in range(self.nCheckBoxes): 
      self.c[i] = gui.QCheckBox("Valve " + str(i)) 
      self.c[i].setChecked(False) 
      #self.c[i].stateChanged.connect(lambda:self.btnstate(self.c[i])) 
      #self.c[i].stateChanged.connect(self.checkedBox) 
      self.c[i].stateChanged.connect(lambda i: self.checkedBox(i)) 
      layout.addWidget(self.c[i],i+1,0) 
      # Messages 
      msgBox = gui.QLabel() 
      msgBox.setText(self.states[i]) 
      if self.states[i] == 'closed': 
       msgBox.setStyleSheet("color: rgb(255,0,0)") 
      else: 
       msgBox.setStyleSheet("color: rgb(0,255,0)") 
      layout.addWidget(msgBox,i+1,1) 

     spacerItem = gui.QSpacerItem(20,40, gui.QSizePolicy.Minimum, gui.QSizePolicy.Expanding) 
     layout.addItem(spacerItem) 
     cboxes.setWidget(w) 
     self.addDockWidget(core.Qt.LeftDockWidgetArea, cboxes) 

    def checkedBox(self,i): 
     sender = self.sender() 
     self.states[i] = 'open' if 'close' else 'close' 
     # For debugging 
     print i 
     print self.states 

는 내가 제대로 이해한다면 내가 보통의 기능을하는 것처럼 밸브를 작동시킬 수 있습니다. checkedBox.

이 난 그냥 openclosed에서 변경할 수있는 권리에 체크 박스와 메시지를 클릭하고 그 반대 할 수 있도록하려면 Unchecked Checked 을 표시되는 내용입니다.

+0

당신은 더 나은 설명 할 수 있을까요? – eyllanesc

+0

체크 박스를 클릭하면'closed'가'open'으로 변경됩니다. 배열을 클릭하면 변경되지만 올바른 값은 변경되지 않습니다. 체크 된 박스는 배열의 'i = 2'값을 변경합니다. 선택을 취소하면'i = 0'이 변경됩니다. –

답변

2

I의 디폴트 값은 상기 신호가 전송되는 값을 취하고 있기 때문에 문제가 발생한다 (즉, 상태 : Unchecked = 0, = 1 PartiallyCheckedChecked = 2), 우리는 함수에 다른 값을 추가한다 이것을 해결하기 : 체크 박스의 인덱스. 또한 QLabel의 텍스트를 변경하려면 해당 레이블에 액세스 할 수 있어야하므로 레이블이있는 새 목록을 만들었습니다. 변경을 위해 상태 목록을 사용합니다.이 함수는 updateLabels을 구현합니다.

class ApplicationWindow(gui.QMainWindow): 
    def __init__(self): 
     self.nCheckBoxes=6 
     self.states = ['closed']*self.nCheckBoxes 

     gui.QMainWindow.__init__(self) 
     self.setAttribute(core.Qt.WA_DeleteOnClose) 
     self.setWindowTitle("PiView") 
     self.file_menu = gui.QMenu('&File', self) 
     #self.file_menu.addAction('&Quit', self.fileQuit, core.Qt.CTRL + core.Qt.Key_Q) 
     self.menuBar().addMenu(self.file_menu) 
     self.help_menu = gui.QMenu('&Help', self) 
     self.menuBar().addSeparator() 
     self.menuBar().addMenu(self.help_menu) 
     #self.help_menu.addAction('&About', self.about) 
     #self.help_menu.addAction('&Docs', self.doc) 
     self.main_widget = gui.QWidget(self) 

     l = gui.QVBoxLayout(self.main_widget) 
     self.dc = MyMplCanvas(self.main_widget, width=5, height=4, dpi=100) 
     l.addWidget(self.dc) 

     self.main_widget.setFocus() 
     self.setCentralWidget(self.main_widget) 

     self.dw = self.createDockWindows(self.dc) 
     self.statusBar().showMessage("Initialized", 2000) 

    def createDockWindows(self, MyMplCanvas): 
     """ 
     Create all the dock widgets 
     """ 
     self.drawValves() 
     #self.drawGraphAdjustments() 
     #self.drawStartAndStop() 

    def drawValves(self): 
     cboxes = gui.QDockWidget("Controls", self) 
     cboxes.setAllowedAreas(core.Qt.LeftDockWidgetArea) 
     w = gui.QWidget() 
     #layout = gui.QVBoxLayout() 
     layout = gui.QGridLayout() 
     w.setLayout(layout) 

     self.c = [] 
     self.l = [] 
     # Create self.nCheckBoxes 
     msgBox = gui.QLabel() 
     msgBox.setText("States") 
     font = gui.QFont() 
     font.setBold(True) 
     msgBox.setFont(font) 
     msgBox.setStyleSheet("color: rgb(255,0,0)") 
     layout.addWidget(msgBox,0,1) 
     for i in range(self.nCheckBoxes): 
      checkBox = gui.QCheckBox("Valve " + str(i)) 
      checkBox.setChecked(False) 
      checkBox.stateChanged.connect(lambda state, p=i: self.checkedBox(state, p)) 
      self.c.append(checkBox) 

      layout.addWidget(self.c[i],i+1,0) 
      msgBox = gui.QLabel() 
      msgBox.setText(self.states[i]) 
      self.l.append(msgBox) 
      layout.addWidget(msgBox,i+1,1) 

     self.update_labels() 

     spacerItem = gui.QSpacerItem(20,40, gui.QSizePolicy.Minimum, gui.QSizePolicy.Expanding) 
     layout.addItem(spacerItem) 
     cboxes.setWidget(w) 
     self.addDockWidget(core.Qt.LeftDockWidgetArea, cboxes) 

    def checkedBox(self, state, p): 
     if state == core.Qt.Unchecked: 
      self.states[p] = 'closed' 
     else: 
      self.states[p] = 'open' 

     self.update_labels() 

    def update_labels(self): 
     for i in range(self.nCheckBoxes): 
      if self.states[i] == 'closed': 
       text = "closed" 
       styleSheet = "color: rgb(255,0,0)" 
      else: 
       text = "open" 
       styleSheet = "color: rgb(0,255,0)" 
      self.l[i].setText(text) 
      self.l[i].setStyleSheet(styleSheet) 

enter image description here

enter image description here

+0

감사합니다! 이것은 내가 가지고 있었던 혼란을 해결하는 데 정말로 도움이됩니다. 그리고 어제 도움에 다시 한번 감사드립니다. –