函数如何更改全局变量(Tikinter示例)?

时间:2018-10-29 20:14:10

标签: python-3.x function tkinter global-variables

我是Oython的新朋友。我写了一个简单的计算器,我不明白我们称之为“评估”的函数是如何工作的。 我知道我们在函数中有局部变量,除了我们将其定义为输出之外,函数无法在函数外部更改变量。

但是在此函数中,它将更改外部变量并定义新标签。  我希望我们输入ans作为输入并接受输出。另一个奇怪的问题是我们没有提供e作为输入,但是此函数使用带有e注释的变量e.get()。当我们没有将变量e赋予函数时,函数如何知道它,

我的第二个问题是“配置”如何工作?

这是我的代码:

from tkinter import*
root=Tk()

label1 = Label(root,text="Enter your expression:")
label1.pack()

def evaluate(event):
  data=e.get()
  ans.configure(text="Answer:"+ str(eval(data)))

e = Entry(root)

e.bind("<Return>",evaluate)
e.pack()
ans = Label(root)
ans.pack()

root.mainloop()

1 个答案:

答案 0 :(得分:0)

函数起作用的原因是因为Python可以接受这种情况。 当Python无法找到ans作为局部变量时,Python将首先尝试编辑局部变量,然后假定它必须位于全局名称空间中,然后在此处进行检查。这并不总是有效,但如果条件合适,则可以。

这是一个代码示例,显示了该函数将在何处正确猜测变量是全局变量,以及一个失败的函数。

import tkinter as tk

root = tk.Tk()

def print_some_number():
    some_number = some_number + 5
    print(some_number)

def testing():
    lbl.configure(text="After button press")

some_number = 5

lbl = tk.Label(root, text="Before button press")
lbl.pack()
tk.Button(root, text="Update lavel", command=testing).pack()
tk.Button(root, text="Print some number", command=print_some_number).pack()

root.mainloop()

print语句功能将失败,因为我们尝试在分配之前分配局部变量。我们知道它已经在全局中分配,但是该功能不会检查,因为它看起来像我们在尝试本地分配。解决此问题的方法是通过添加如下所示的全局语句:

import tkinter as tk

root = tk.Tk()

def print_some_number():
    global some_number # global added here for this kind of fuction
    some_number = some_number + 5
    print(some_number)

def testing():
    lbl.configure(text="After button press")

some_number = 5

lbl = tk.Label(root, text="Before button press")
lbl.pack()
tk.Button(root, text="Update lavel", command=testing).pack()
tk.Button(root, text="Print some number", command=print_some_number).pack()

root.mainloop()