Доступ к динамически создаваемым виджетам tkinter - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь создать графический интерфейс, в котором количество записей tkinter определяется пользователем.

Мой код:

from tkinter import*

root = Tk()

def createEntries(quantity):
    for num in range(quantity):
        usrInput = Entry(root, text = num)
        usrInput.pack()

createEntries(10)

root.mainloop()

Этот код основан на этом уроке Я нашел:

for num in range(10):
    btn = tkinter.button(window, text=num)
    btn.pack(side=tkinter.LEFT)

Проблема в том, что я могу получить доступ только к входу в последнем созданном виджете, потому что все они имеют одинаковые имена. Есть ли способ динамического создания виджетов с уникальными именами?

Любой совет будет принят с благодарностью

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

С помощью следующего кода вы можете регулировать количество кнопок и записей в зависимости от «полей» Var. Надеюсь, это поможет

from tkinter import *
fields = 'Last Name', 'First Name', 'Job', 'Country'

def fetch(entries):
   for entry in entries:
      field = entry[0]
      text  = entry[1].get()
      print('%s: "%s"' % (field, text))

def makeform(root, fields):
   entries = []
   for field in fields:
      row = Frame(root)
      lab = Label(row, width=15, text=field, anchor='w')
      ent = Entry(row)
      row.pack(side=TOP, fill=X, padx=5, pady=5)
      lab.pack(side=LEFT)
      ent.pack(side=RIGHT, expand=YES, fill=X)
      entries.append((field, ent))
   return entries

if __name__ == '__main__':
   root = Tk()
   ents = makeform(root, fields)
   root.bind('<Return>', (lambda event, e=ents: fetch(e)))
   b1 = Button(root, text='Show',
          command=(lambda e=ents: fetch(e)))
   b1.pack(side=LEFT, padx=5, pady=5)
   b2 = Button(root, text='Quit', command=root.quit)
   b2.pack(side=LEFT, padx=5, pady=5)
   root.mainloop()
0 голосов
/ 31 октября 2018

Решение состоит в том, чтобы хранить виджеты в структуре данных, такой как список или словарь. Например:

entries = []
for num in range(quantity):
    usrInput = Entry(root, text = num)
    usrInput.pack()
    entries.append(usrInput)

Позже вы можете перебрать этот список, чтобы получить значения:

for entry in entries:
    value = entry.get()
    print("value: {}".format(value))

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

print("first item: {}".format(entries[0].get()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...