Pyqt4에서 시스템의 확인란을 선택 취소하면 disable_mod 함수를 호출하고 enable_mod를 호출하는 시스템을 구현하려고합니다. 그러나 상태가 변경 되더라도 체크 박스는 시작한 초기 함수를 호출합니다. 이 경우 이미 확인란을 클릭하면 항상 disable_mod 함수를 계속 호출합니다. 왜 이런 일이 일어 났는지 이해가 안되니? 너 나 좀 도와 줄 수 있니?QCheckBox 상태 변경 PyQt4
from PyQt4 import QtCore, QtGui
from os import walk
from os.path import join
import sys
def list_files_regex(dir):
l = []
for (root, dirnames, filenames) in walk(dir):
for d in dirnames:
list_files_regex(join(root, d))
l.extend(filenames)
return l
directory = "J:/test_pack"
directory = join(directory, "/mods")
count = 0
for y in list_files_regex(directory):
print y
count += 1
print count
class ModEdit(QtGui.QMainWindow):
def __init__(self, title, icon, x, y, w, h):
super(ModEdit, self).__init__()
self.setWindowTitle(title)
self.setWindowIcon(QtGui.QIcon(icon))
self.setGeometry(x, y, w, h)
self.choices = []
self.init()
def init(self):
scroll_widget = QtGui.QScrollArea()
sub_widget = QtGui.QWidget()
v_layout = QtGui.QVBoxLayout()
for y in list_files_regex(directory):
tmp = QtGui.QCheckBox(y, self)
tmp.resize(tmp.sizeHint())
if tmp.text()[len(tmp.text()) - 8: len(tmp.text())] != 'disabled':
tmp.setChecked(True)
# if tmp.isChecked() == 0:
# tmp.stateChanged.connect(self.enable_mod)
# if tmp.isChecked():
# tmp.stateChanged.connect(self.disable_mod)
# v_layout.addWidget(tmp)
self.choices.append(tmp)
print self.choices
for choice in self.choices:
v_layout.addWidget(choice)
if choice.isChecked():
choice.stateChanged.connect(self.disable_mod)
else:
choice.stateChanged.connect(self.enable_mod)
sub_widget.setLayout(v_layout)
scroll_widget.setWidget(sub_widget)
self.setCentralWidget(scroll_widget)
self.show()
def enable_mod(self):
print "ENABLE_TEST"
print self.choices[1].isChecked()
def disable_mod(self):
print "DISABLE_TEST"
print self.choices[1].isChecked()
def test(self):
print 'test'
for ch in self.choices:
if ch.isChecked():
ch.stateChanged.connect(self.disable_mod)
else:
ch.stateChanged.connect(self.enable_mod)
class Rename(QtCore.QObject):
enable = QtCore.pyqtSignal
disable = QtCore.pyqtSignal
app = QtGui.QApplication(sys.argv)
ex = ModEdit("Minecraft ModEdit", "ModEdit.png", 64, 64, 640, 480)
sys.exit(app.exec_())
감사 체크 박스의 상태를 확인할 수 있습니다! 이 특별한 경우에 람다 함수가 무엇을하는지 말해 주시겠습니까? 나는 람다 함수를 찾았지만이 특별한 경우에는 혼란 스럽다. –
첫 번째 솔루션이 작동합니다. 두 번째 문제는 같은 문제를 겪고 있습니다! –
@DipanjanPatra 두 번째 솔루션의 경우 확인 및 선택 취소를 모두 처리하는 슬롯이 하나만 있음을 알 수 있습니다. 동일한 함수가 두 상태 변경 이벤트 모두에서 호출됩니다. 그것은 의도 된 것입니다. 체크 상태를 기반으로 다른 함수를 호출하는 대신 함수 내에서 체크 박스의 체크 상태를 테스트하여 동일한 함수를 호출하고 실행할 코드를 분할합니다. –