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

如何通过Tkinter复选框选中项运行列表对应函数,无需单独创建多组变量

实现思路
  • 首先建立函数名与函数对象的映射关系,不推荐使用不安全的eval执行函数,手动构建映射字典的可控性和安全性更高
  • 修改OK按钮绑定的letssee函数,遍历存储选中项的addlist,依次取出映射中的函数执行即可

具体修改步骤

  1. 定义完def1到def6的函数后,新增函数映射字典:
func_map = {
    "def1": def1,
    "def2": def2,
    "def3": def3,
    "def4": def4,
    "def5": def5,
    "def6": def6
}
  1. 替换原有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:54:02