You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter加载按钮时字典识别异常问题求助

问题原因及解决方法

问题原因

你猜的没错,问题确实是传入nav_load_screen的是字符串而非字典对象:

  • y["links_too"]中存储的是字符串(比如"module_1"),创建按钮时lambda x=x把这个字符串传递给了nav_load_screen;
  • 函数nav_load_screen试图对字符串执行dic["Buttons"]操作,自然会报错,因为字符串没有字典的键访问语法。

解决方法

提供两种可行的修复方案,你可以根据实际需求选择:

方案一:直接传递字典对象(推荐)

修改字典的links_too字段,直接存储对应字典对象而非字符串名称,同时给每个字典添加name字段用于按钮显示文本:

# 先定义所有字典,避免未定义引用
module_1 = {"name": "module_1", "links_too": [], "Buttons": [], "previous": None}
module_2 = {"name": "module_2", "links_too": [], "Buttons": [], "previous": None}
module_3 = {"name": "module_3", "links_too": [], "Buttons": [], "previous": None}
module_5 = {"name": "module_5", "links_too": [], "Buttons": [], "previous": None}
module_6 = {"name": "module_6", "links_too": [], "Buttons": [], "previous": None}
chap1 = {"name": "chap1", "links_too": [], "Buttons": [], "previous": None}
chap2 = {"name": "chap2", "links_too": [], "Buttons": [], "previous": None}

# 补全引用关系
Mods = {"name": "Mods", "links_too": [module_1, module_2, module_3, module_5, module_6], "Buttons": [], "previous": Mods}
module_1["previous"] = Mods
module_2["previous"] = Mods
module_2["links_too"] = [chap1, chap2]

all_dics = (Mods, module_1, module_2)

修改按钮创建函数,直接传递字典对象:

def create_menu_buttons():
    for y in all_dics:
        for x in y["links_too"]:
            z = ttk.Button(window, text=x["name"])
            z.config(command=lambda x=x: nav_load_screen(x))
            y["Buttons"].append(z)

nav_load_screen函数无需修改,现在传入的就是字典对象,可以正常执行dic["Buttons"]操作。

方案二:建立字符串到字典的映射

如果不想修改原有字典结构,可以创建一个映射字典,将字符串名称对应到实际字典对象,在nav_load_screen中完成转换:

# 建立名称到字典的映射,确保所有涉及的字典已定义
name_to_dic = {
    "Mods": Mods,
    "module_1": module_1,
    "module_2": module_2,
    "module_3": module_3,
    "module_5": module_5,
    "module_6": module_6,
    "chap1": chap1,
    "chap2": chap2
}

修改nav_load_screen函数:

def nav_load_screen(dic_name):
    # 通过映射获取实际字典对象
    dic = name_to_dic[dic_name]
    clear_window()
    axis_x = 0
    axis_y = 1
    for but in dic["Buttons"]:
        but.grid(column=axis_x, row=axis_y)
        if axis_x == 9:
            axis_x = 0
            axis_y += 1
        else:
            axis_x += 1

这种方式下,原有按钮创建代码无需修改,依然传递字符串名称,在函数内部完成转换。


内容的提问来源于stack exchange,提问作者user17239444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:52:48