在Pyqt5中单击按钮时,如何从动态创建的文本框中获取数据?

时间:2019-04-14 20:34:47

标签: python dynamic pyqt

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

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

每个列都有三个带有三个文本框的标签

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

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

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

注意3:类似的问题对我不起作用: Acessing dynamically added widgets我不知道如何使用此答案,因为我在布局中有两种小部件,即label和qlinedit

getting values from dynamically created 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_())

Main Window of program

when user enters for example 2 to create 2 rows

2 个答案:

答案 0 :(得分:1)

我正在开发一个PyQt5应用程序,该应用程序具有动态加载的整个选项卡,带有QTableView,QLineEdit和几个QPushButton,并且存在类似的问题,我需要每个选项卡都从那个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_())

P.S。我修复了您的pushButton_ok.clicked()信号,它正在调用addCheckBox(),该信号不存在。

答案 1 :(得分:0)

尝试一下:

import sys
from PyQt5.QtWidgets import (QLineEdit, QLabel, QGridLayout, QWidget, 
                             QPushButton, QApplication, QSpinBox)

class Window(QWidget):
    def __init__(self):
        super().__init__()
        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.input1 = QLineEdit(self)
        self.input1 = QSpinBox(self)           # +++
        self.input1.setMinimum(1)
        self.input1.setMaximum(12)
        self.input1.setValue(3)

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

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



    def addtextbox(self):
        countLayout = self.layout().count()
        if countLayout > 3:
            for it in range(countLayout - 3):  
                w = self.layout().itemAt(3).widget()
                self.layout().removeWidget(w)     
                w.hide()
        self.lineEdits = []   # +++

        for n in range(self.input1.value()):
            self.bursttime = QLabel(self)
            self.bursttime.setText("b_{}".format(n))

            self.timeinput = QLineEdit(self)
            self.timeinput.textChanged.connect(lambda text, i=n : self.editChanged(text, i)) # +++

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

            self.lineEdits.append('')                                                        # +++

        self.go = QPushButton("GO") #, self)
        self.grid.addWidget(self.go, 2*n+2, 0)
        self.go.clicked.connect(self.printvalues)

    def printvalues(self):  
        # fetch data in some way  
        for i, v in enumerate(self.lineEdits):                                               # +++
            print("bursttime: b_{}, timeinput: {}".format(i, v))                             # +++


    def editChanged(self, text, i):   # +++
        self.lineEdits[i] = text      # +++

    def addCheckbox(self):
        print("def addCheckbox(self):")

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

enter image description here