Получение значений динамически генерируемых полей ввода с помощью Tkinter

#python #tkinter

#python #tkinter

Вопрос:

У меня есть список атрибутов, таких как стоимость, цена, IsObsolete и т.д. который я хотел бы динамически генерировать в виде метки с полем ввода внизу, чтобы пользователь мог вставить в него правильное значение.

Кажется, лучший способ сделать это — сохранить атрибуты для значений в словаре и обновлять этот словарь всякий раз, когда обновляется поле ввода.

Я пытался использовать функцию trace_variable для StringVar, назначенной моему полю ввода, но, похоже, это не работает, когда я ввожу в поле (в качестве теста) или когда я запускаю функцию в классе, чтобы получить ключи и значения словаря:

 from Tkinter import *
import ttk

t = ['cost','price','isObsolete']

root = Tk()

rowAcc = 1
colAcc = 0

d = {}

for item in t:
    newValue = StringVar()

    def callback(*args):
        print args[0]   " variable changed to "   newValue.get()
        d[item] = newValue.get()

    newValue.trace_variable("w", callback)

    ttk.Label(root, text=item).grid(column=colAcc, row=rowAcc, sticky=(N, W))

    reqEntry = ttk.Entry(root, textvariable=newValue, width=19)
    reqEntry.grid(column=colAcc, row=rowAcc   1, sticky=(N, W), pady=3, padx=1)

    colAcc  = 1

def printDict():
    for key in d:
        print key, d[key]

root.mainloop()
  

Есть ли способ настроить это для достижения моего результата или есть лучшее решение для получения значений динамически генерируемых полей ввода?

Ответ №1:

Сохранить StringVar в массиве

 from Tkinter import *

master = Tk()

frame = Frame(master)
frame.pack()

s_vars = []

for i in range(5):
    s_vars.append( StringVar() )

    def onChange(a ,b, c, s_var):
        print a, "changed to", s_var.get()

    s_vars[i].trace('w', lambda a, b, c, x=i: onChange(a, b, c, s_vars[x]) )

    en = Entry(frame, textvariable=s_vars[i])
    en.pack()

    s_vars[i].set( str(i) )

mainloop()