Python3 - Tkinter语言 - 使用字典创建小部件



我试图用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)
...

相关内容

  • 没有找到相关文章

最新更新