【问题标题】:How to get data from dynamically created textboxes when a button is clicked in Pyqt5?在 Pyqt5 中单击按钮时如何从动态创建的文本框中获取数据?
【发布时间】:2019-09-04 21:10:03
【问题描述】:

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

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

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

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

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

注意2:我听说过一个叫做 Lambda 的函数,但我搜索了它,但找不到很好的解释

注意3:对我不起作用的类似问题: Acessing dynamically added widgets我不知道如何使用这个答案,因为我在布局中有两种小部件,标签和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

【问题讨论】:

    标签: python dynamic pyqt


    【解决方案1】:

    试试看:

    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_())
    

    【讨论】:

    • 为什么 textchanged 事件不允许删除字符?例如,如果我在 QLineEdit 中输入了错误的数据并且我想在按下 ok 之前将其删除,整个程序就会崩溃
    • @Girl 请发布您更新的示例和错误消息。
    • 对不起,我发现了错误,如果你觉得我的问题不错,可以点赞吗?
    【解决方案2】:

    我正在开发一个 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_())
    

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

    【讨论】:

    • @icewebndev 谢谢:D
    • 很高兴我能帮上忙。如果这解决了您的问题,请将其标记为答案。
    • 我赞成你的回答,但很抱歉我尝试了其他解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多