Python 使用PyQt5通过循环连接多个复选框
我正在尝试使用循环创建多个复选框。我希望能够将这个盒子网格转换成一个numpy数组。代码手动创建一个5x5的复选框矩阵,对应于numpy数组中的同一点。当用户运行此代码并选中复选框时,numpy数组将按如下方式打印:Python 使用PyQt5通过循环连接多个复选框,python,pyqt5,Python,Pyqt5,我正在尝试使用循环创建多个复选框。我希望能够将这个盒子网格转换成一个numpy数组。代码手动创建一个5x5的复选框矩阵,对应于numpy数组中的同一点。当用户运行此代码并选中复选框时,numpy数组将按如下方式打印: [[False False False False False] [False False False False False] [False False False False False] [False False False False False] [False F
[[False False False False False]
[False False False False False]
[False False False False False]
[False False False False False]
[False False False False True]]
我真的不知道怎么了
import sys
from PyQt5.QtWidgets import (QWidget, QApplication, QPushButton, QCheckBox)
from PyQt5.QtCore import Qt
import numpy as np
class Example(QWidget):
def __init__(self):
super().__init__()
self.grid =np.zeros([5,5], dtype=bool)
self.x_pos, self.y_pos = 0, 0
self.initUI()
def initUI(self):
for i in range(5):
for j in range(5):
self.x_pos, self.y_pos = i, j
btn = QCheckBox(self)
btn.move(50+17*i, 50+17*j)
# btn.toggle()
btn.stateChanged.connect(self.click)
done = QPushButton('Done', self)
done.clicked.connect(self._print)
self.setGeometry(300, 300, 300, 200)
self.show()
def click(self, state):
if state == Qt.Checked:
self.grid[self.x_pos][self.y_pos] = True
else:
self.grid[self.x_pos][self.y_pos] = False
def _print(self):
print(self.grid)
仅导致数组中最后一个元素发生更改的主要问题是,在创建复选按钮后未分配位置。因此它保持
5,5
解决此问题的一种方法是将复选按钮分配到QGridLayout中,并为每个输入更新每个网格。代码如下:
从PyQt5.qtwidts导入QGridLayout
在def\uuuu init\uuuuu(self)下:
self.grid_layout = QGridLayout()
self.setLayout(self.grid_layout)
在def initUI(self)
下:
在def下,单击(自身,状态)
:
initUI()
运行时,会更改self.x\u pos
和self.y\u pos
,但在此之后不会更改变量。因此,这两个变量保持[5,5]
,只有该位置的元素发生变化。你应该给这两个变量分配一个可以跟踪实际复选框位置的数字。我本来想使用网格对象,但它从来没有返回正确的布局。我需要一个实际的复选框网格,中间只有很少的空间。此外,运行代码会引发错误:AttributeError:'QWidgetItem'对象没有属性'Widget'
Widget=item.Widget()中有'typo'。这应该是widget=item.widget()。仍然是相同的错误。无论如何,它仍然不能提供我想要的输出。我需要一个复选框矩阵。我试着使用内置的网格对象,但它产生了一个网格,盒子之间有巨大的空间,似乎也没有什么改变它。编辑:问题中的错误NoneType'对象没有属性“widget”
,这非常令人困惑,因为我当前运行的代码与我上传的代码相同。。。你能指定矩阵不显示的方式吗?它不是在5*5矩阵中,或者甚至没有显示?代码将执行,但会生成一个包含10个复选框的窗口,所有复选框都垂直对齐。如果我单击一个,它会自动抛出上面的错误,甚至不会单击“完成”。
for i in range(5):
for j in range(5):
btn = QCheckBox()
self.grid_layout.addWidget(btn,i,j)
btn.stateChanged.connect(self.click)
if state == Qt.Checked :
for i in range(5):
for j in range(5):
item = self.grid_layout.itemAtPosition(i,j)
widget = item.widget()
self.grid[i][j] = widget.isChecked()
else :
pass