Как SpinBox реализовать добавление или удаление полей текстового ввода

Рейтинг: 1Ответов: 2Опубликовано: 01.02.2023

Подскажите, пожалуйста, как в Python (Tkinter или PySimpleGUI) с помощью SpinBox реализовать возможность добавления или удаления полей для ввода текста в главном окне программы путем увеличении или уменьшении значения SpinBox.

С помощью какого фреймворка это лучше реализовывать?

Ответы

▲ 1Принят

Более-менее минимальный пример на tkinter. Создаваемые текстовые поля добавляем в список. Отслеживаем изменение значения в SpinBox, если новое значение больше, чем полей уже существует - добавляем поля ввода, если меньше - удаляем.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

entries = []


def on_change():
    value = int(spinbox.get())
    if value > len(entries):
        entries.append(tk.Entry())
        entries[-1].pack()
    elif value < len(entries):
        entries.pop().destroy()


spinbox = ttk.Spinbox(root, from_=0, to=10, command=on_change, state="readonly")
spinbox.set(0)
spinbox.pack()

root.mainloop()
▲ 1

С помощью любого фреймворка это можно реализовывать.

Использую PyQt, это может выглядеть примерно так:

import sys
from PyQt5.Qt import *


class Widget(QGroupBox):
    def __init__(self, name):
        super().__init__()
        self.setTitle(name.upper())        
        self.name = name

        self.lbl = QLabel(f'Label {self.name}')
        self.lbl.setTextInteractionFlags(Qt.TextSelectableByMouse)

        self.btn = QPushButton(f'Button {self.name}')
        self.btn.clicked.connect(self.printsignal)
        
        self.lineEdit = QLineEdit(f'LineEdit {self.name}')

        self.layout = QGridLayout(self)
        self.layout.addWidget(self.lbl, 0, 0)
        self.layout.addWidget(self.btn, 0, 1)
        self.layout.addWidget(self.lineEdit, 1, 0, 1, 2)
        self.layout.setColumnStretch(0, 1)

    def printsignal(self):
        print(
            f"clicked: \n\tTitle    --> {self.title()}"
            f" \n\tLabel    --> {self.lbl.text()}"
            f" \n\tLineEdit --> {self.lineEdit.text()}"
        )


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        value = 12
        self._list = [f'item{i}' for i in range(1, value+1)]

        self.controls = QWidget()
        self.controlsLayout = QVBoxLayout(self.controls)

        self.widgets = []
        for name in self._list:
            item = Widget(name)
            self.controlsLayout.addWidget(item)
            self.widgets.append(item)

        spacer = QSpacerItem(1, 1, QSizePolicy.Minimum, QSizePolicy.Expanding)
        self.controlsLayout.addItem(spacer)

        self.scroll = QScrollArea()
        self.scroll.setWidgetResizable(True)
        self.scroll.setWidget(self.controls)
 
        self.spinBox = QSpinBox()
        self.spinBox.setRange(1, 12)
        self.spinBox.setProperty("value", 12)
        self.spinBox.valueChanged.connect(self.update_display)        

        containerLayout = QVBoxLayout(centralWidget)
        containerLayout.addWidget(self.spinBox)
        containerLayout.addWidget(self.scroll)

    def update_display(self, value):
        for i, widget in enumerate(self.widgets):
            if i+1 <= value:
                widget.show()
            else:
                widget.hide()

    def sizeHint(self):
        return self.scroll.widget().size() * 0.7
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

PyQt — набор расширений графического фреймворка Qt для языка программирования Python, выполненный в виде расширения Python.

PyQt работает на всех платформах, поддерживаемых Qt: Linux и другие UNIX-подобные ОС, Mac OS X и Windows.