Python:将变量名传递给函数来改变值?

时间:2017-07-28 15:12:02

标签: python matplotlib tkinter

我创建了一个Tkinter窗口。在一个框架中,我使用matplotlib来绘制一些文本(我使用matplotlib,因为我需要希腊数学字符)。我确实每个变量有10个以上的变量和两个按钮来改变它的值。 所以,现在我认为不是有28个函数来改变值,我只能编写两个函数,它们使用exec()改变所需的变量。但这不起作用......

先前尝试变量a:

def ap():
    global a
    a+=10
    plot()
    canvas.draw()

def am():
    global a
    a-=10
    plot()
    canvas.draw()

button_ap = Tk.Button(configframe, text='a+', command=ap).grid(row=0,column=0)
button_am = Tk.Button(configframe, text='a-', command=am).grid(row=0,column=1)

这很有效。只要按下其中一个按钮,图表就会以a的新值更新。

新尝试:

def parp(var):
    exec('global '+var)
    exec(var+'+=10')
    plot()
    canvas.draw()

def parm(var):
    exec('global '+var)
    exec(var+'-=10')
    plot()
    canvas.draw()

button_ap = Tk.Button(configframe, text='a+', command=lambda: parp('a')).grid(row=0,column=0)
button_am = Tk.Button(configframe, text='a-', command=lambda: parm('a')).grid(row=0,column=1)

这不起作用。它实际上读取变量并执行'var+=10',因为如果我之后打印变量,它会减少10.但plot()命令不会更新绘图。

你知道为什么吗? THX。

1 个答案:

答案 0 :(得分:0)

为了能够在函数中使用exec操纵全局变量,我们需要提供global()作为exec的第二个参数。

以下是ecec上使用globals()的方式:

a = 0
b = 10
c = 20

def parp(my_var):
    exec("{} -= 10".format(my_var), globals())

parp("a")
parp("b")
parp("c")

print(a)
print(b)
print(c)

另一件事。避免使用+%来组合字符串。而是使用format()作为此函数的当前首选方法。

因为我和其他人会说" Globals是糟糕的MKAY!"。

Here是一个很好的链接,解释了为什么。

这是一个使用类属性执行相同操作的类,因此我们不需要使用全局变量。

class ExecClass():


    def __init__(self):
        self.a = 0
        self.b = 10
        self.c = 20

        self.parp("a")
        self.parp("b")
        self.parp("c")

        print(self.a, self.b, self.c)

    def parp(self, my_var):
        exec("self.{} -= 10".format(my_var))


my_class = ExecClass()