Создать объекты и переменные в соответствии со списком имен - PullRequest
0 голосов
/ 03 июля 2019

Я хочу создать форму и прочитать ее содержимое позже, в настоящее время я думаю написать что-то вроде этого:

import tkinter as tk
objectkeylist=["name","lastname","age"]
root = tk.Tk()
textwidgetdict=dict()
textwidgetdict("name") =tk.Text(root, height=3, width=50)
textwidgetdict("lastname")=tk.Text(root, height=3, width=50)
textwidgetdict("age")=tk.Text(root, height=3, width=50)

textwidgetdict("name").pack()
textwidgetdict("lastname").pack()
textwidgetdict("age").pack()

def getcontent():
  formcontentdict=dict()
  formcontentdict("name") =textwidgetdict("name").get("1.0", tk.END)
  formcontentdict("lastname") =textwidgetdict("lastname").get("1.0", tk.END)
  formcontentdict("age") =textwidgetdict("age").get("1.0", tk.END)
  return formcontentdict()


tk.mainloop()

Могу ли я как-то уменьшить избыточный код с помощью чего-то вроде

map(lambda : objectlist[index]_text=objectlist.get("1.0", tk.END) , objectlist)

или

for object in objectlist:
    object_text=objectlist.get("1.0", tk.END)

?

Я даже не знаю, как правильно искать это ключевое слово.

Я понимаю, что лучше использовать эту идеюэлементы objectlist в качестве ключей для словаря, как объяснено здесь: https://stackoverflow.com/a/4010869/3503111 Я надеюсь, что этот код более ясен в отношении того, чего я хочу достичь, хотя

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Зачем вам нужно устанавливать эти имена динамически? Планируете ли вы получить к ним доступ, используя динамические ссылки? Предпочтительным способом обработки таких ситуаций является использование объекта-контейнера, такого как список или словарь, для хранения объектов.

Ваш второй фрагмент был почти верным. Совершенно нормально и приемлемо писать

text_list = []
for object in objectlist:
    object_text = object.get("1.0", tk.END)
    text_list.append(object_text)

Вы, вероятно, уже заметили, что не можете создать список, содержащий word, otherword и more_word, пока не назначите значения этим переменным, поэтому оператор должен произойти позже в программе.

1 голос
/ 03 июля 2019

Я не уверен, что должно содержать ваше objectlist, потому что его содержимое не определено до тех пор, пока оно не будет определено, и если вы его определили, вы все равно немедленно его перезапишите.

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

Если у вас есть список имен компонентов:

component_names = ['word', 'otherword', 'moreword']

И функция, которая создает новый компонент, упаковывает его, и возвращает функцию, которая получает текст:

def create_pack_text(root):
    comp = tk.Text(root, height=3, width=50)
    comp.pack()
    # return comp.get('1.0', tk.END)
    return lambda: comp.get('1.0', tk.END)

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

root = tk.Tk()
mapping = { name: create_pack_text(root) for name in component_names }

tk.mainlook()

# edit
mapping['word'] # a function which returns the contents of the component
print(mapping['word']())

EDIT Вы можете заставить create_pack_text возвращать кортеж текстового компонента и лямбда-выражения. Тогда

comp, fun = mapping['word']
# comp is the actual component
# fun() gets the text in it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...