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

问题描述 投票:0回答:2

我试图在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
2个回答
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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.