首页 > 解决方案 > 在 Pyqt5 中单击按钮时如何从动态创建的文本框中获取数据?

问题描述

我正在尝试在 pyqt5 中创建一个窗口应用程序,其中用户输入一个数字然后单击(“按我”)按钮。

之后,根据用户输入的数字和一个按钮(“GO”)创建多行

每列有三个标签和三个文本框

我已经设法制作了行,但是我无法管理的是在单击按钮时从文本框中获取数据

注意1:为简单起见,我只是尝试了一个文本框的代码,然后我将添加更多文本框

注2:我听说过一些名为 Lambda 的函数,但我搜索了它,但找不到很好的解释

注意3:对我不起作用的类似问题: 访问动态添加的小部件我不知道如何使用这个答案,因为我在布局中有两种小部件,标签和qlinedit

从动态创建的 qlinedits 中获取值这个答案不适合我的情况,因为我想要一个按钮来获取所有创建的文本框中的数据

代码 :

 from PyQt5 import QtWidgets, QtGui, QtCore
 from PyQt5 import *
 from PyQt5.QtWidgets import QLineEdit,QLabel,QGridLayout

 import sys 
 class Window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.home()
    def home(self):

        self.grid=QGridLayout()
        self.setLayout(self.grid)

        self.label=QLabel(self)
        self.label.setText("NO")
        self.grid.addWidget(self.label,0,1)

        self.pushButton_ok = QtWidgets.QPushButton("Press me", self)
        self.pushButton_ok.clicked.connect(self.addtextbox)
        self.grid.addWidget(self.pushButton_ok,0,10)

        self.input1=QLineEdit(self)
        self.grid.addWidget(self.input1,0,5)




    def addtextbox(self):
      no_of_process=(self.input1.text())
      no=int(no_of_process)
      n=0
      while(n<no):
           self.bursttime=QLabel(self)
           self.bursttime.setText("b")
           self.timeinput=QLineEdit(self)


           self.grid.addWidget(self.bursttime,2*n+1,0)
           self.grid.addWidget(self.timeinput,2*n+1,1)
           n=n+1


      self.go=QtWidgets.QPushButton("GO",self)

      self.grid.addWidget(self.go,6,0)
      self.go.clicked.connect(self.printvalues)
    def printvalues():
       n=0
       #fetch data in some way




application = QtWidgets.QApplication(sys.argv)
window = Window()
window.setWindowTitle('Dynamically adding textboxes using a push button')
window.resize(250, 180)
window.show()
sys.exit(application.exec_())

程序主窗口

当用户输入例如 2 以创建 2 行时

标签: pythondynamicpyqt

解决方案


我正在开发一个 PyQt5 应用程序,它有一个动态加载的整个选项卡,带有 QTableView、QLineEdit 和几个 QPushButtons,并且遇到了类似的问题,我需要每个选项卡中来自那个 QLineEdit 的数据。我使用了 QSignalMapper,因为我必须在textChanged()信号上获取数据,但是由于您有一个简单的按钮来获取数据,因此您可以QObject.findChildren()像我在此示例中所做的那样使用:

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5 import *
from PyQt5.QtWidgets import QLineEdit,QLabel,QGridLayout

import sys 
class Window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.home()
    def home(self):

        self.grid=QGridLayout()
        self.setLayout(self.grid)

        self.label=QLabel(self)
        self.label.setText("NO")
        self.grid.addWidget(self.label,0,1)

        self.pushButton_ok = QtWidgets.QPushButton("Press me", self)
        self.pushButton_ok.clicked.connect(self.addtextbox)
        self.grid.addWidget(self.pushButton_ok,0,10)

        self.input1=QLineEdit(self)
        self.grid.addWidget(self.input1,0,5)
    def addtextbox(self):
        no_of_process=(self.input1.text())
        no=int(no_of_process)
        n=0
        while(n<no):
            self.bursttime=QLabel(self)
            self.bursttime.setText("b")
            self.timeinput=QLineEdit(self)
            self.timeinput.setObjectName("timeinput_{0}".format(n))


            self.grid.addWidget(self.bursttime,2*n+1,0)
            self.grid.addWidget(self.timeinput,2*n+1,1)
            n=n+1


        self.go=QtWidgets.QPushButton("GO",self)

        self.grid.addWidget(self.go,6,0)
        self.go.clicked.connect(self.printvalues)

    def printvalues(self):
        for child in self.findChildren(QLineEdit, QtCore.QRegExp("timeinput_(\d)+")):
            print(child.text())

application = QtWidgets.QApplication(sys.argv)
window = Window()
window.setWindowTitle('Dynamically adding textboxes using a push button')
window.resize(250, 180)
window.show()
sys.exit(application.exec_())

PS我修复了你的pushButton_ok.clicked()信号,它正在调用addCheckBox()不存在的信号。


推荐阅读