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
相关产品推荐
相关产品推荐

