Python Tkinter如何动态将Toplevel窗口标题设为传入字典的名称
解决方案
你当前的写法是将字典解包为**kwargs传入函数,解包后仅保留键值对信息,会丢失原字典的变量名标识,因此无法直接从kwargs中获取字典名。你可以选择以下两种方案实现需求:
方案1:调整传参逻辑(推荐,稳定性高)
修改escrito函数参数,改为接收字典名字符串,直接用该字符串作为窗口标题,同时从infections中动态取出对应字典内容:
def escrito(dict_name: str): target_dict = getattr(infections, dict_name) write_window = Toplevel(root) # 直接使用字典名作为窗口标题 write_window.title(dict_name) writing_box = tk.Text(write_window, font = ("calibri", 20), width = 60, height = 15, wrap=WORD) # 注意:原代码同时调用pack和grid会触发布局冲突,需删除其中一行,这里保留grid writing_box.grid(row = 0, column = 0, sticky = 'nswe') texto = '\n'.join(key + ":\n" + value for key, value in target_dict.items()) writing_box.insert("1.0", texto)
对应的调用逻辑只需做批量替换即可,原有上百个函数只需统一修改为如下格式:
def septic_osteo(): escrito("Septic_arthritis")
方案2:调用栈解析(无需修改现有调用代码,灵活性高)
如果不想修改已有的上百个调用函数,可以通过inspect模块解析调用栈代码,自动提取字典名:
import inspect import re def escrito(**kwargs): write_window = Toplevel(root) # 解析上一层调用的代码字符串,提取字典名 caller_code = inspect.stack()[1].code_context[0].strip() name_match = re.search(r'infections\.(\w+)', caller_code) if name_match: write_window.title(name_match.group(1)) writing_box = tk.Text(write_window, font = ("calibri", 20), width = 60, height = 15, wrap=WORD) writing_box.grid(row = 0, column = 0, sticky = 'nswe') texto = '\n'.join(key + ":\n" + value for key, value in kwargs.items()) writing_box.insert("1.0", texto)
注意:该方案依赖调用代码的格式为
escrito(**infections.XXX),如果调用格式发生变化,正则匹配可能失效,因此优先推荐方案1。
内容的提问来源于stack exchange,提问作者Lord_Amenegg
相关产品推荐
相关产品推荐

