跟踪通过for循环生成的复选框的状态

问题描述 投票:0回答:2

我正在从MySQL查询中生成一系列复选框,该查询返回服务器上数据库的列表,并且由于无法为变量名单独分配变量名而无法确定如何跟踪复选框的状态在列表的大小中。这可能吗?还是我需要采用其他方法来创建复选框本身?

默认情况下,复选框的生成状态为False,但是如果用户选择了复选框,则我需要存储该信息(特别是文本)以备将来使用。它们是在createGridLayout功能中生成的。

from PyQt5.QtWidgets import *
import sys

databases = []

# Randomly generated database names
for i in range(10):
    databases.append('db' + str(i))

db_count = len(databases)
row_num = 0

class App(QDialog):

    def __init__(self):
        super().__init__()
        self.title = 'MySQL Timing Discrepancies'
        self.left = 10
        self.top = 10
        self.width = 320
        self.height = 100
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createGridLayout()

        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

        self.show()

    def createGridLayout(self):
        self.horizontalGroupBox = QGroupBox("Databases")
        layout = QGridLayout()
        layout.setColumnStretch(0, 0)
        layout.setColumnStretch(1, 0)
        layout.setColumnStretch(2, 0)

        # Generating checkboxes here
        for i in range(db_count):
            col_num = i % 3
            row_num = i if col_num == 0 else row_num
            cb = QCheckBox(databases[i])
            cb.setChecked(False)
            layout.addWidget(cb, row_num, col_num)

            # Does nothing because they are defaulted to False
            if cb.isChecked():
                print(cb.text())

        self.horizontalGroupBox.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
python pyqt pyqt5
2个回答
1
投票
您可以分别通过添加或删除列表来检查QCheckBox文本,具体取决于该文本是选中还是未选中。要获取文本,您可以使用sender()方法,该方法返回发出信号的对象,在这种情况下,您必须使用stateChanged中的QCheckBox信号:

import sys from PyQt5.QtCore import pyqtSlot, Qt from PyQt5.QtWidgets import ( QApplication, QCheckBox, QDialog, QGridLayout, QGroupBox, QVBoxLayout, ) databases = ["db{}".format(i) for i in range(10)] class App(QDialog): def __init__(self): super().__init__() self.title = "MySQL Timing Discrepancies" self.left = 10 self.top = 10 self.width = 320 self.height = 100 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self._databases_checked = [] self.createGridLayout() windowLayout = QVBoxLayout(self) windowLayout.addWidget(self.horizontalGroupBox) self.show() @property def databases_checked(self): return self._databases_checked def createGridLayout(self): self.horizontalGroupBox = QGroupBox("Databases") layout = QGridLayout() self.horizontalGroupBox.setLayout(layout) for i in range(3): layout.setColumnStretch(i, 0) row_num = 0 # Generating checkboxes here for i, database in enumerate(databases): col_num = i % 3 row_num = i if col_num == 0 else row_num cb = QCheckBox(database) cb.setChecked(False) cb.stateChanged.connect(self.on_stateChanged) layout.addWidget(cb, row_num, col_num) @pyqtSlot(int) def on_stateChanged(self, state): checkbox = self.sender() text = checkbox.text() if state == Qt.Checked: self._databases_checked.append(text) else: self._databases_checked.remove(text) print(self.databases_checked) if __name__ == "__main__": app = QApplication(sys.argv) ex = App() sys.exit(app.exec_())


另一种方法是将复选框存储在列表中,并对其进行迭代以获取被选中的QCheckBox的文本:

# ... self.checkboxes = [] row_num = 0 # Generating checkboxes here for i, database in enumerate(databases): col_num = i % 3 row_num = i if col_num == 0 else row_num cb = QCheckBox(database) cb.setChecked(False) self.checkboxes.append(cb) layout.addWidget(cb, row_num, col_num)

texts = [cb.text() for cb in self.checkboxes if cb.isChecked()]
print(texts)

-1
投票
#!/usr/bin/python3 from tkinter import * class Checkbar(Frame): def __init__(self, parent=None, picks=[], side=LEFT, anchor=W): Frame.__init__(self, parent) self.vars = [] for pick in picks: var = IntVar() chk = Checkbutton(self, text=pick, variable=var) chk.pack(side=side, anchor=anchor, expand=YES) self.vars.append(var) def state(self): return map((lambda var: var.get()), self.vars) if __name__ == '__main__': root = Tk() lng = Checkbar(root, ['Python', 'Ruby', 'Perl', 'C++']) tgl = Checkbar(root, ['English','German']) lng.pack(side=TOP, fill=X) tgl.pack(side=LEFT) lng.config(relief=GROOVE, bd=2) def allstates(): print(list(lng.state()), list(tgl.state())) Button(root, text='Quit', command=root.quit).pack(side=RIGHT) Button(root, text='Peek', command=allstates).pack(side=RIGHT) root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.