我正在从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_())
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)
#!/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()