根据名称列表创建对象和变量

时间:2019-07-03 10:47:04

标签: python python-3.x tkinter

我想创建一个表单并稍后阅读它的内容 目前,我正在考虑编写如下内容:

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 个答案:

答案 0 :(得分:2)

为什么需要动态建立这些名称?您是否打算使用动态引用来访问它们?处理此类情况的首选方法是使用容器对象(例如列表或字典)来保存这些对象。

您的第二个片段几乎是正确的。完全正常并且可以接受

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

您可能已经注意到,在为这些变量分配值之前,您无法创建包含wordotherwordmore_word的列表,因此该语句需要稍后出现在程序中。

答案 1 :(得分:1)

我不确定您的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']())

编辑 您可以使create_pack_text返回文本组件和lambda表达式的元组。然后

comp, fun = mapping['word']
# comp is the actual component
# fun() gets the text in it