Задание списка и поэлементный ввод 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 шт):
Чтобы получить значение из 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()
Еще вариант - сделать кнопки добавления/удаления строк и кнопку вычисления, так код будет менее запутанным:
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()

