【问题标题】:Connecting multiple checkboxes through a loop using PyQt5使用 PyQt5 通过循环连接多个复选框
【发布时间】:2017-05-22 09:02:59
【问题描述】:

我正在尝试使用循环来创建多个复选框。我希望能够将这个盒子网格转换为一个 numpy 数组。该代码手动创建一个 5x5 复选框矩阵,对应于 numpy 数组中的同一点。当此代码运行并且用户选中框时,numpy 数组 always 打印如下:

[[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)

【问题讨论】:

  • self.x_posself.y_posinitUI() 运行时更改,但之后您不会更改变量。因此,这两个变量保持[5,5],并且只有该位置的元素发生变化。您应该将可以跟踪实际复选框位置的数字分配给这两个变量。

标签: python pyqt5


【解决方案1】:

仅导致数组中的最后一个元素发生更改的主要问题是您在创建检查按钮后没有分配位置。因此它保持5,5

解决此问题的一种方法是将检查按钮分配给 QGridLayout 并为每个输入更新每个网格。代码如下:

from PyQt5.QtWidgets import QGridLayout

def __init__(self):

self.grid_layout = QGridLayout()
self.setLayout(self.grid_layout)

def initUI(self)下:

for i in range(5):
    for j in range(5):
        btn = QCheckBox()
        self.grid_layout.addWidget(btn,i,j)
        btn.stateChanged.connect(self.click)

def click(self,state)下:

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

【讨论】:

  • 我原本想使用一个网格对象,但它永远不会返回正确的布局。我需要一个实际的复选框网格,它们之间的空间很小。此外,运行您的代码会引发错误:AttributeError: 'QWidgetItem' object has no attribute 'Widget'
  • widget = item.Widget() 中有错字。这应该是 widget = item.widget()。
  • 还是同样的错误。无论如何,它仍然没有提供我正在寻找的输出。我需要一个复选框矩阵。我尝试使用内置的网格对象,但它在盒子之间产生了一个带有巨大空间的网格,似乎也没有任何改变。编辑:有问题的错误NoneType' object has no attribute 'widget'
  • 这很令人困惑,因为我目前正在运行与我上传的相同的代码......你能指定矩阵不显示的方式吗?它不是在 5*5 矩阵中还是没有显示?
  • 代码将执行,但会生成一个包含 10 个复选框的窗口,它们都垂直对齐。如果我点击一个,它会自动抛出上面的错误,甚至没有点击“完成”。
猜你喜欢
  • 1970-01-01
  • 2014-06-29
  • 2016-04-10
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2015-10-29
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多