Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PyQt5通过循环连接多个复选框_Python_Pyqt5 - Fatal编程技术网

Python 使用PyQt5通过循环连接多个复选框

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

我正在尝试使用循环创建多个复选框。我希望能够将这个盒子网格转换成一个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 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