Python3:使用exec()创建函数

时间:2019-04-14 11:29:05

标签: python python-3.x tkinter windows-7 exec

我正在使用tkinter来创建应用程序,当前我做了很多按钮,因此我需要用不同的命令绑定所有按钮,我想使用exec()来创建函数。

strategy=None
exec("global commandbutton"+str(len(strategicpoint)+1)+"\ndef commandbutton"+str(len(strategicpoint)+1)+"():\n\tglobal strategy\n\tstrategy="+str(len(strategicpoint)))
commandline=eval('commandbutton'+str(len(strategicpoint)+1))
imgx=tk.Button(win,image=towert,command=commandline)

更清洁的解决方案:

global commandbutton{...}
def commandbutton{...}():
    global strategy
    strategy={...}

我希望我的代码像上面一样运行并且可以运行,但是后来我调用命令并测试到print(strategy),(我单击了按钮/调用了命令)它在需要时打印None它可以打印其他内容。

2 个答案:

答案 0 :(得分:2)

这里绝对不需要使用exec()eval()

  • 不必按顺序命名函数。您也可以将函数对象存储在循环变量中,并使用该循环变量创建tkinter挂钩。
  • 您可以使用闭包创建带有绑定参数而不使用exec的函数,也可以使用闭包或仅通过将参数绑定到lambda函数或functools.partial()中来创建函数。

因此,如果您有一个循环的strategicpoint值递增,我就可以这样做:

def set_strategy(point):
    global strategy
    strategy = point

buttons = []
for strategicpoint in range(1, number_of_points + 1):
    imgx = tk.Button(win, image=towert, command=lambda point=strategicpoint: set_strategy(point))
    buttons.append(imgx)

lambda point=...部分将当前循环值绑定为point创建的新函数对象的lambda自变量的默认值。当不带参数调用该函数(如单击按钮时所做的那样)时,新函数将使用当时分配给strategicpoint的整数值来调用set_strategy(point)

您还可以在内部函数中使用闭包(外部函数中的局部变量)。每次调用外部函数时,都会在外部函数内部创建嵌套的内部函数,因此它们与由相同外部函数创建的其他函数对象是分开的:

def create_strategy_command(strategypoint):
    def set_strategy():
        global strategy
        strategy = strategypoint
    return set_strategy

然后在创建按钮时,使用:

imgx = tk.Button(win, image=towert, command=create_strategy_command(strategicpoint))

请注意,调用create_strategy_command()函数会在此处返回一个新功能,用作按钮命令。

答案 1 :(得分:0)

免责声明:我尚未对此进行测试。

使用字典来存储所有功能,例如:

option = "default"
def change_option(target):
    global option
    option = target

def f1():
    print("foo")
def f2():
    print("bar")

my_functions = {
    "select1": f1,
    "select2": f2
    "default": None
    }

imgx=tk.Button(win,image=towert,command=my_functions[option])  # None
swapper = tk.Button(win, image=towert, lambda: change_option("select2")) # button to change the command if you want it
imgx=tk.Button(win,image=towert,command=my_functions[option]) # print("bar")
change_option("select1")
imgx=tk.Button(win,image=towert,command=my_functions[option]) # print("foo")

您可能不需要使用字典也可以解决问题,但是我认为这很干净。永远不要使用exec()或eval(),除非您完全知道它具有什么安全问题,或者您知道该产品不会在另一台计算机上使用,或者您真的没有其他选择。