일부 밸브를 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
.
이 난 그냥 open
에 closed
에서 변경할 수있는 권리에 체크 박스와 메시지를 클릭하고 그 반대 할 수 있도록하려면 을 표시되는 내용입니다.
당신은 더 나은 설명 할 수 있을까요? – eyllanesc
체크 박스를 클릭하면'closed'가'open'으로 변경됩니다. 배열을 클릭하면 변경되지만 올바른 값은 변경되지 않습니다. 체크 된 박스는 배열의 'i = 2'값을 변경합니다. 선택을 취소하면'i = 0'이 변경됩니다. –