【问题标题】:Python - Creating buttons in loop in PyQt5 [duplicate]Python - 在 PyQt5 中循环创建按钮 [重复]
【发布时间】:2019-02-28 13:46:24
【问题描述】:

我一直在尝试根据 PyQt5 中变量的值创建 X 个按钮,但我的方法行不通。

我创建了一个带有循环的函数,其中 X 值是按钮的数量。

此代码(功能已注释)有效:

class Ui_MainWindow(object):

def setupUi(self, MainWindow):

    def createButtons(x):
        number_of_buttons = x
        table_set = 1
        distance_from_left = 5

        while table_set <= number_of_buttons:
            print(distance_from_left) #Check if the loop is runnig
            "self.pushButton_{} = QtWidgets.QPushButton(self.groupBox)".format(table_set)
            "self.pushButton_{}.setGeometry(QtCore.QRect({}, 15, 40, 35))".format(table_set, distance_from_left)
            "self.pushButton_{}.setText(\"{}\")".format(table_set, str(table_set).zfill(2))
            "self.pushButton_{}.setObjectName(\"pushButton_{}\")".format(table_set, table_set)
            table_set += 1
            distance_from_left += 45

    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(1366, 768)
    MainWindow.setAutoFillBackground(False)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
    self.groupBox.setGeometry(QtCore.QRect(0, 80, 531, 56))
    self.groupBox.setAutoFillBackground(False)
    self.groupBox.setObjectName("groupBox")
    #createButtons(3)
    self.pushButton_1 = QtWidgets.QPushButton(self.groupBox)
    self.pushButton_1.setGeometry(QtCore.QRect(5, 15, 40, 35))
    self.pushButton_1.setText("01")
    self.pushButton_1.setObjectName("pushButton_1")
    self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
    self.pushButton_2.setGeometry(QtCore.QRect(50, 15, 40, 35))
    self.pushButton_2.setText("02")
    self.pushButton_2.setObjectName("pushButton_2")
    self.pushButton_3 = QtWidgets.QPushButton(self.groupBox)
    self.pushButton_3.setGeometry(QtCore.QRect(95, 15, 40, 35))
    self.pushButton_3.setText("03")
    self.pushButton_3.setObjectName("pushButton_3")
    MainWindow.setCentralWidget(self.centralwidget)
    self.centralwidget.show()
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

这(函数正在运行,直接命令已注释)不起作用。在我看来,它们看起来是一样的。

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):

        def createButtons(x):
            number_of_buttons = x
            table_set = 1
            distance_from_left = 5

            while table_set <= number_of_buttons:
                print(distance_from_left) #Check if the loop is runnig
                "self.pushButton_{} = QtWidgets.QPushButton(self.groupBox)".format(table_set)
                "self.pushButton_{}.setGeometry(QtCore.QRect({}, 15, 40, 35))".format(table_set, distance_from_left)
                "self.pushButton_{}.setText(\"{}\")".format(table_set, str(table_set).zfill(2))
                "self.pushButton_{}.setObjectName(\"pushButton_{}\")".format(table_set, table_set)
                table_set += 1
                distance_from_left += 45

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1366, 768)
        MainWindow.setAutoFillBackground(False)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(0, 80, 531, 56))
        self.groupBox.setAutoFillBackground(False)
        self.groupBox.setObjectName("groupBox")
        createButtons(3)
        """
        self.pushButton_1 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_1.setGeometry(QtCore.QRect(5, 15, 40, 35))
        self.pushButton_1.setText("01")
        self.pushButton_1.setObjectName("pushButton_1")
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_2.setGeometry(QtCore.QRect(50, 15, 40, 35))
        self.pushButton_2.setText("02")
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_3.setGeometry(QtCore.QRect(95, 15, 40, 35))
        self.pushButton_3.setText("03")
        self.pushButton_3.setObjectName("pushButton_3")
        """
        MainWindow.setCentralWidget(self.centralwidget)
        self.centralwidget.show()
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

没有显示任何按钮。有人可以告诉我我做错了什么吗?

【问题讨论】:

  • 格式化字符串不会运行你的代码...
  • @Netwave 抱歉,什么?你的回答太简短了,我似乎犯了一些非常基本的错误。也许是因为我真的是初学者,我还是不明白。
  • @f.poletto, "self.pushButton_{} = QtWidgets.QPushButton(self.groupBox)".format(table_set) 这段代码实际上什么也没做。我给你一个提示,但我没有时间给出完整的答案:setAttr(self, "pushButton_{}".format(table_set), QtWidgets.QPushButton(self.groupBox))

标签: python python-3.x pyqt5


【解决方案1】:

试试看:

import sys
from PyQt5.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, 
                             QApplication, QPushButton)


class MainWindow(QMainWindow): 
    def __init__(self, x):                                         # x <-- 3
        super().__init__()

        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)
        self.lay = QVBoxLayout(self.centralwidget)

        for i in range(x):                                          # <---
            self.btn = QPushButton('Button {}'.format(i +1), self)            
            text = self.btn.text()
            self.btn.clicked.connect(lambda ch, text=text : print("\nclicked--> {}".format(text)))
            self.lay.addWidget(self.btn)

        self.numButton = 4

        pybutton = QPushButton('Create a button', self)
        pybutton.clicked.connect(self.clickMethod)

        self.lay.addWidget(pybutton)
        self.lay.addStretch(1)

    def clickMethod(self):
        newBtn = QPushButton('New Button{}'.format(self.numButton), self)
        self.numButton += 1
        newBtn.clicked.connect(lambda : print("\nclicked===>> {}".format(newBtn.text())))
        self.lay.addWidget(newBtn)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = MainWindow(3)                                            # 3 --> x
    mainWin.show()
    sys.exit( app.exec_() )

【讨论】:

  • 您的代码运行良好,但我仍然完全不知道为什么...无论如何,我的这个版本运行良好:x = 5 d = 5 for i in range(x): self.pushButton = QtWidgets.QPushButton('Button {}'.format(str(i).zfill(2)), self.groupBox) self.pushButton.setGeometry(QtCore.QRect(int("{}".format(d)), 15, 40, 35)) self.pushButton.setText("{}".format(str(i).zfill(2))) self.pushButton.setObjectName("pushButton_{}".format(str(i).zfill(2))) i += 1 d += 45 非常感谢。
  • 赞成您的回答。但是,你为什么需要lambda ch
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多