如何通过Tkinter复选框选中项运行列表对应函数,无需单独创建多组变量
实现思路
- 首先建立函数名与函数对象的映射关系,不推荐使用不安全的
eval执行函数,手动构建映射字典的可控性和安全性更高 - 修改OK按钮绑定的
letssee函数,遍历存储选中项的addlist,依次取出映射中的函数执行即可
具体修改步骤
- 定义完
def1到def6的函数后,新增函数映射字典:
func_map = { "def1": def1, "def2": def2, "def3": def3, "def4": def4, "def5": def5, "def6": def6 }
- 替换原有
letssee函数的逻辑:
def letssee(): # 遍历所有选中的函数名,执行对应函数 for func_name in addlist: # 校验避免出现不存在的函数名报错 if func_name in func_map: func_map[func_name]()
可选简化方案
如果不想手动维护映射字典,也可以直接从全局命名空间获取函数对象,将上述执行逻辑替换为如下代码即可,不过该方案存在同名变量误执行的风险,不推荐生产环境使用:
def letssee(): for func_name in addlist: if func_name in globals() and callable(globals()[func_name]): globals()[func_name]()
完整修改后代码
from tkinter import Tk, StringVar, Checkbutton, Button, BooleanVar root = Tk() w, h = root.winfo_screenwidth(), root.winfo_screenheight() root.geometry("%dx%d+0+0" % (w, h)) def def1(): print("1") def def2(): print("2") def def3(): print("3") def def4(): print("4") def def5(): print("5") def def6(): print("6") # 新增函数映射字典 func_map = { "def1": def1, "def2": def2, "def3": def3, "def4": def4, "def5": def5, "def6": def6 } def letssee(): # 遍历执行选中的函数 for func_name in addlist: if func_name in func_map: func_map[func_name]() nomtestes = ["def1", "def2", "def3", "def4", "def5", "def6"] clltes = 0 rwwtes = 0 addlist=[] username_cbs = dict() for name in nomtestes: if clltes == 5: rwwtes += 1 clltes = 0 username_cbs[name] = Checkbutton(root, text=name, onvalue=True, offvalue=False) username_cbs[name].var = BooleanVar() username_cbs[name]['variable'] = username_cbs[name].var username_cbs[name]['command'] = lambda w=username_cbs[name]: upon_select(w) username_cbs[name].grid(row=rwwtes, column=clltes, pady=2) clltes += 1 Button(root, text="OK",command=letssee).grid(column=0, row=5, padx=1, pady=15) def upon_select(widget): if widget.var.get() == True: addlist.append(widget['text']) else: addlist.remove(widget['text']) root.mainloop()
内容的提问来源于stack exchange,提问作者mrpy
相关产品推荐
相关产品推荐

