首页 > 解决方案 > Python:使用 exec 创建 TKINTER Checkbutton 时键入错误

问题描述

我想使用循环创建一个复选框(使用 dropbox files_list_folder('').entries)并获取文本和状态,如果它被选中,但它显示 TypeError,问题是我需要分配 var 来获取状态检查按钮:

for ii,j in zip(range(len(files_list)),range(1,len(files_list)+1)):
    exec("var%i=StringVar()"%j)
    exec("ch%i = Checkbutton(text=files_list[ii],variable=var%i)"%j%j)
    exec("ch%i.grid(row=ii, column=0, sticky=W)"%j)

标签: python-3.xtkinter

解决方案


您应该尽可能避免使用execeval。对于那些不完全了解他们能做什么的人来说,这些是非常不安全的。两者都有严重的代码注入风险。

您可以使用列表来获取每个Checkbutton选择的结果。我们可以将其存储StringVar()在一个列表中,然后在选中或取消选中按钮时调用该值。

import tkinter as tk


root = tk.Tk()

value_list = ['One', 'Two', 'Three', 'Four']
var_list = []

def print_results_from_selection(i):
    print("{}: {}".format(value_list[i], var_list[i].get()))

def generate_buttons():
    for i in range(len(value_list)):
        var_list.append(tk.StringVar())
        var_list[-1].set(0)
        tk.Checkbutton(root, text=value_list[i], variable=var_list[-1],
                       command=lambda i=i: print_results_from_selection(i),
                       onvalue=1, offvalue=0).grid(row=i, column=0, sticky="w")

generate_buttons()
root.mainloop()

推荐阅读