Python Tkinter多标签页菜单点击后内容错误填充至末尾文本框求助
问题根源
- 代码中使用了全局变量存储配置列表
lsttiporeq/lstjsonreq和文本框对象request_box,每次调用makesubmenu创建新标签页时,全局变量都会被新的标签页资源覆盖,最终全局变量保存的始终是最后一个标签页的资源,因此所有按钮点击都会触发对最后一个文本框的操作。 - 回调函数
ChangConfWI完全依赖全局变量取值,无法识别当前按钮属于哪个标签页。
修复思路
- 移除所有相关全局变量声明,每个标签页的配置列表、文本框对象改为
makesubmenu内的局部变量,仅属于当前标签页。 - 按钮点击回调通过默认参数绑定当前标签页的配置列表、文本框对象,直接传入
ChangConfWI使用,不再依赖全局变量。 - 调整文本框创建顺序,确保按钮绑定回调时已经能拿到当前标签页的文本框对象。
修改后代码
makesubmenu 函数修改
def makesubmenu(tipo_de_conf, framename): frmbut = ttk.Frame(framename) frmbut.pack(side="top", anchor='nw') # 移除全局变量声明,改为当前标签页专属局部变量 varconfbook = open("menu_dumps.txt", "r").readlines() lsttiporeq = [] lsttitreq = [] lstjsonreq = [] lstexpectresq = [] cont = 0 # 先创建文本框,后续按钮回调才能拿到当前文本框对象 frmtxtb2 = ttk.Frame(framename) frmtxtb2.pack(side="right", anchor='ne') ttk.Label(frmtxtb2, text="Response:").grid(column=4, row=1, padx=10, pady=10) request_box = ScrolledText(frmtxtb2, width=75, height=10, wrap=tk.WORD) request_box.grid(column=4, row=2, padx=10, pady=10, ipady=35) for line in varconfbook: if tipo_de_conf in line: tiporeq, titreq, jsonreq, expectresq = line.split('<->') lsttiporeq.append(tiporeq) lsttitreq.append(titreq) lstjsonreq.append(jsonreq) lstexpectresq.append(expectresq) # 回调绑定当前索引、当前标签页配置列表、当前标签页文本框 ttk.Button(frmbut, width="20", text=titreq, command=lambda cont=cont, cur_json=lstjsonreq, cur_box=request_box: ChangConfWI(int(cont), cur_json, cur_box)).grid(column=0, row=cont, padx=10, pady=10) cont += 1 return lsttiporeq, lsttitreq, lstjsonreq, lstexpectresq, request_box
ChangConfWI 函数修改
def ChangConfWI(tipreq, cur_json, cur_box): payload = cur_json[tipreq] cur_box.delete('1.0', END) cur_box.insert(tk.INSERT, payload) # 如需要返回其他业务参数可自行补充 return payload, cur_box
内容的提问来源于stack exchange,提问作者ric
相关产品推荐
相关产品推荐

