Как получить данные из динамически создаваемых текстовых полей при нажатии кнопки в Pyqt5? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь создать оконное приложение в pyqt5, в котором пользователь вводит число, а затем нажимает кнопку («нажмите меня»).

После этого создается количество строк в соответствии с введенным пользователем номером и одной кнопкой («GO»)

В каждом столбце есть три метки с тремя текстовыми полями

Мне уже удалось создать строки, но я не могу выбрать данные из текстовых полей при нажатии кнопки

Примечание 1: Для простоты я просто пробовал код только для одного текстового поля, тогда я добавлю больше текстовых полей

Примечание 2: я слышал о какой-то функции, называемой лямбда, но я искал ее и не мог найти хорошее объяснение этому

Примечание 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 строк

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Я работал над приложением 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_())

PS Я исправил ваш pushButton_ok.clicked() сигнал, он вызывал addCheckBox(), которого не существует.

0 голосов
/ 15 апреля 2019

Попробуйте:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...