我试图用json
文件作为小部件配置动态地在tkinter
的根窗口上创建小部件。我简化了代码,以便您也可以进行测试。(我在我的主代码中使用grid()
,但这里没有必要)
json文件包含一个items
列表,每个小部件在一个单独的字典中,它可以像这样查找。
new_dict = {
"items": [
{
"type": "frame",
"id": "f1"
},
{
"type": "button",
"id": "b1",
"text": "Button1"
}
]
}
我的目标是创建一个小部件,存储在id
字段的value
中,这样我就可以稍后通过.config()
更改小部件状态或其他东西
(示例:f1 = Frame(root)
)
(注意:我使用locals()
来创建特定的变量,如果有更好的方法,请让我知道)
# Example: Change Frame Color to Blue
def change_background(frame_id):
locals()[frame_id].config(bg=blue)
# Root Window
root = Tk()
root.geometry("800x600")
# Widget Creation
for item in new_dict["items"]:
if item["type"] == "frame":
frame_id = item["id"]
locals()[item["id"]] = Frame(root, width=200, height=200, bg="green")
locals()[item["id"]].pack(side=BOTTOM, fill=BOTH)
elif item["type"] == "button":
locals()[item["id"]] = Button(root, text=item["text"], command=lambda: change_background(frame_id))
locals()[item["id"]].place(x=50, y=50, anchor=CENTER)
root.mainloop()
现在我的问题是,我不能给frame id
进入change_background
功能。如果我这样做,我得到以下错误:
KeyError: 'f1'
我不太理解这里的问题,因为pack()
,place()
和grid()
与每个小部件都可以正常工作。
正如名称locals
的意思一样,它只存储本地变量。因此,函数内部的locals()
只包含函数内部定义的局部变量。
不建议这样使用locals()
。请使用普通字典:
...
# Example: Change Frame Color to Blue
def change_background(frame_id):
widgets[frame_id].config(bg="blue")
# Root Window
root = Tk()
root.geometry("800x600")
# Widget Creation
# use a normal dictionary instead of locals()
widgets = {}
for item in new_dict["items"]:
if item["type"] == "frame":
frame_id = item["id"]
widgets[item["id"]] = Frame(root, width=200, height=200, bg="green")
widgets[item["id"]].pack(side=BOTTOM, fill=BOTH)
elif item["type"] == "button":
widgets[item["id"]] = Button(root, text=item["text"], command=lambda: change_background(frame_id))
widgets[item["id"]].place(x=50, y=50, anchor=CENTER)
...