Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 3.x 如何在pyqt5中创建类似于计算器的按钮网格_Python 3.x_Button_Pyqt - Fatal编程技术网

Python 3.x 如何在pyqt5中创建类似于计算器的按钮网格

Python 3.x 如何在pyqt5中创建类似于计算器的按钮网格,python-3.x,button,pyqt,Python 3.x,Button,Pyqt,我正在用python开发我的第一个GUI项目,构建一个简单的GUI计算器。 我不想一个接一个地创建每个按钮,而是想用两个for循环来创建它们 从以下列表开始: all_rows = [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['0']] 我目前的目标是将这些按钮放置在类似网格的模式中,我尝试按如下方式解决它,但我无法找出错误: class MyWindow (QMainWindow): def __init__(self):

我正在用python开发我的第一个GUI项目,构建一个简单的GUI计算器。 我不想一个接一个地创建每个按钮,而是想用两个for循环来创建它们 从以下列表开始:

all_rows = [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['0']]
我目前的目标是将这些按钮放置在类似网格的模式中,我尝试按如下方式解决它,但我无法找出错误:

class MyWindow (QMainWindow):
def __init__(self):
    super(MyWindow, self).__init__()

    #creating default width and height to work with a grid
    default_width = 50
    default_height = 50

    self.setGeometry(0, 0, 10*default_width, 10*default_height)
    self.setWindowTitle('Calcolatrice')
    self.InitUI()

def InitUI (self):

    all_rows = [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['0']]
    bt_list = []

    #setting default height and width of buttons
    bt_width = 50
    bt_height = 50

    #looping troughout all_rows to create buttons
    for row in all_rows:
        for button in range(len(row)):

            #creating each button and giving it the name
            bt_list.append(QtW.QPushButton(self))
            bt_list[button].setText(row[button])
            bt_list[button].setGeometry(0,0,bt_width,bt_height)

            #setting button placement
            bt_list[button].move(bt_width * button, bt_height * all_rows.index(row))
我显然没有想到会有这样的输出,我无法理解为什么只有8、9和0处于正确的位置

Qt主窗口框架

QMainWindow有自己的布局

不支持创建没有中心小部件的主窗口。您必须有一个中心小部件,即使它只是一个占位符

试试看:

import sys
from functools import partial
from PyQt5.Qt import *


class PushButton(QPushButton):
    def __init__(self, text, parent=None):
        super(PushButton, self).__init__(text, parent)

        self.setText(text)
        self.setMinimumSize(QSize(50, 50))
        self.setMaximumSize(QSize(50, 50))
        

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()

        self.rows = 4
        self.columns = 3
        
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        self.label = QLabel(self, alignment=Qt.AlignRight)
        self.label.setFont(QFont("Times", 12, QFont.Bold))

        self.layout = QGridLayout(centralWidget)
        self.layout.addWidget(self.label, 0, 0, 1, 3)
        
        _list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
        len_list = len(_list)

        i = 0
        for row in range(self.rows): 
           for column in range(self.columns): 
                button = PushButton(f'{_list[i]}', self)
                button.clicked.connect(partial(self.onClicked, _list[i]))
                self.layout.addWidget(button, row+1, column)
                i += 1
                if i == len_list: break

    def onClicked(self, i):
        self.label.setNum(i)
        
                
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.setWindowTitle('Calcolatrice')
    w.show()
    sys.exit(app.exec_())

Qt主窗口框架

QMainWindow有自己的布局

不支持创建没有中心小部件的主窗口。您必须有一个中心小部件,即使它只是一个占位符

试试看:

import sys
from functools import partial
from PyQt5.Qt import *


class PushButton(QPushButton):
    def __init__(self, text, parent=None):
        super(PushButton, self).__init__(text, parent)

        self.setText(text)
        self.setMinimumSize(QSize(50, 50))
        self.setMaximumSize(QSize(50, 50))
        

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()

        self.rows = 4
        self.columns = 3
        
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        self.label = QLabel(self, alignment=Qt.AlignRight)
        self.label.setFont(QFont("Times", 12, QFont.Bold))

        self.layout = QGridLayout(centralWidget)
        self.layout.addWidget(self.label, 0, 0, 1, 3)
        
        _list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
        len_list = len(_list)

        i = 0
        for row in range(self.rows): 
           for column in range(self.columns): 
                button = PushButton(f'{_list[i]}', self)
                button.clicked.connect(partial(self.onClicked, _list[i]))
                self.layout.addWidget(button, row+1, column)
                i += 1
                if i == len_list: break

    def onClicked(self, i):
        self.label.setNum(i)
        
                
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWindow()
    w.setWindowTitle('Calcolatrice')
    w.show()
    sys.exit(app.exec_())