2017-03-31 4 views
1

GUIでいくつかのバルブを制御しようとしていて、ボタンを押したときに表示を更新しようとしています。次のコードは正しい初期表示を生成しますが、チェックボックスの1つをクリックすると常にi=2の値が得られます。チェックしないと、i=0が得られます。私はまた、メッセージがcloseからopenに、そしてその逆に切り替わるように、ドッキングされたウィンドウをどのように更新するのか分かりません。私は、アレイ内のself.states変化結果の値を参照してください、これは私が私が正しく理解していれば、オープンドッキングウィンドウのトリガとアップデート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 

`に変更されません、画面の右側に赤いclosedに変更されているが、常に['open', 'closed', 'open', 'closed', 'closed', 'closed']が残っています私は通常の機能のようにバルブを作動させることができますcheckedBox

これは私がちょうどopenclosedから変更する権利、およびその逆にチェックボックスとメッセージをクリックすることができるようにしたい Unchecked Checked を表示しているものです。

+0

あなたはより良い説明してもらえますか? – eyllanesc

+0

チェックボックスをクリックすると 'closed'が' open'に変わります。クリックすると配列が変わりますが、正しい値は変わりません。チェックされたボックスは、配列の 'i = 2'値を変更します。チェックを外すと、 'i = 0'が変更されます。 –

答えて

2

Iのデフォルト値は、信号によって送信された値をとるため、問題が生じる(すなわち状態:Unchecked = 0、= 1 PartiallyCheckedは、Checked = 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

ありがとうございます!これは本当に私が持っていた混乱をクリアするのに役立ちます。そして昨日助けてくれてありがとう。 –

関連する問題