我想创建一个表单并稍后阅读它的内容 目前,我正在考虑编写如下内容:
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 我希望这段代码对我想要实现的目标更加清晰
答案 0 :(得分:2)
为什么需要动态建立这些名称?您是否打算使用动态引用来访问它们?处理此类情况的首选方法是使用容器对象(例如列表或字典)来保存这些对象。
您的第二个片段几乎是正确的。完全正常并且可以接受
text_list = []
for object in objectlist:
object_text = object.get("1.0", tk.END)
text_list.append(object_text)
您可能已经注意到,在为这些变量分配值之前,您无法创建包含word
,otherword
和more_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