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

时间:2017-05-22 09:03:00

标签: python pyqt5

我试图使用循环创建多个Checkbox。我希望能够将这个盒子网格转换成一个numpy数组。代码手动创建一个5x5的复选框矩阵,对应于numpy数组中的相同点。运行此代码并由用户检查框时,numpy数组 alaways 将打印出来:

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

1 个答案:

答案 0 :(得分: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