Задание списка и поэлементный ввод python tkinter

Каким образом в tkinter можно создать окна ввода, где в первом вводится размерность списка, а во втором вводится значение каждого элемента?

P.S. Сам дошел только до этого

from tkinter import *

list=int(input('Введите количество измерений n:'))
root = Tk()

for n in range(list):
    Label(root, text='Введите значения каждого измерения').grid(row=1, column=1)
    Entry(root).grid(row=0, column=n+1)

root.mainloop()



Ответы (1 шт):

Автор решения: insolor

Чтобы получить значение из Entry, нужно вызвать метод get у него, т.е. int(entry.get()), но если это сделать сразу после создания entry, то в entry в этот момент будет пустая строка, и программа вылетит с ошибкой ValueError: invalid literal for int() with base 10: ''.

Нужно чтобы пользователь ввел данные, потом нажал кнопку, и после этого уже начали создаваться поля ввода. Данные получать из них опять же нужно не сразу после их создания, а после нажатия следующей кнопки. Набросок кода:

from tkinter import *

root = Tk()
Label(root, text='Введите количество измерений n:').grid(row=0, column=0)
dimensions = Entry(root)
dimensions.grid(row=0, column=1)

def on_button2(entries):
    # Действия после нажатия на кнопку "Еще какие-то действия"
    # Здесь проходим по списку entries циклом,
    # из каждого поля ввода получаем значение с помощью метода get
    # и что-то с ним делаем
    ...  

def on_button():
    # Действия после нажатия на кнопку "Ввод измерений"
    entries = []
    for n in range(int(dimensions.get())):
        Label(root, text=f'Введите значения измерения {n+1}').grid(row=n+1, column=0)
        entry = Entry(root)
        entry.grid(row=n+1, column=1)
        entries.append(entry)  # Добавляем текстовое поле в список, чтобы потом из него можно было получить значение
    
    Button(root, text="Еще какие-то действия", command=lambda: on_button2(entries)).grid(row=n+2, column=0)

Button(root, text="Ввод измерений", command=on_button).grid(row=0, column=2)
root.mainloop()

Скриншот 1


Еще вариант - сделать кнопки добавления/удаления строк и кнопку вычисления, так код будет менее запутанным:

from tkinter import *

root = Tk()

labels = []
entries = []


def add_row():
    n = len(entries)
    label = Label(root, text=f'Введите значения измерения {n+1}')
    label.grid(row=n+1, column=0)
    labels.append(label)
    entry = Entry(root)
    entry.grid(row=n+1, column=1)
    entries.append(entry)


def remove_row():
    if len(entries) > 1:  # Удалить строку можно только если строк больше одной
        # Метод pop() удаляет последний элемент из списка, и возвращает его,
        # потом к этому элементу применяем метод destroy
        # (уничтожаем самую нижнюю метку и текстовое поле)
        entries.pop().destroy()
        labels.pop().destroy()


def calculate():
    # Тут какие-то вычисления
    ...


Button(root, text="Добавить измерение", command=add_row).grid(row=0, column=0)
Button(root, text="Удалить измерение", command=remove_row).grid(row=0, column=1)
Button(root, text="Вычисления", command=calculate).grid(row=0, column=2)

# Сразу добавляем одну строку
add_row()

root.mainloop()

Скриншот

→ Ссылка