我创建了一个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。
答案 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()