如何在已定义的代码中编辑变量?

时间:2018-11-02 18:34:14

标签: python-3.x tkinter

程序不会将+1添加到“总计”中。 有更好的编程方法吗? 我也主要使用Pycharm,这可能。

from tkinter import * #imports tkinter

window = Tk() #Tk name

window.title("Cookie Clicker")#window title

window.geometry('350x200')#window size

lbl = Label(window, text="$0.00")#makes label

lbl.grid(column=0, row=0)#makes label

x=0  #possibly a problem
total=0 #possibly a problem

def clicked():  
    total = total+1  # also possibly causing problems
    lbl.configure(text='${:,.2f}'.format(total))#This is possibly causing problems 

btn = Button(window, text="Cookie", command=clicked)#This is the button

btn.grid(column=1, row=0)

mainloop()

2 个答案:

答案 0 :(得分:1)

问题是该函数中未定义变量total。您可以通过将total设置为全局变量来解决此问题:

def clicked():
    global total  
    total = total+1
    lbl.configure(text='${:,.2f}'.format(total)) 

这使total成为全局变量,这意味着该函数可以更改其在全局命名空间中的值。您需要在要访问该变量的每个函数中使用global

另一种解决方案是使用面向对象的方法并将total设置为属性。

答案 1 :(得分:0)

将来,请包括您从代码中得到的错误。您的示例代码将告诉您它产生的回溯错误到底出了什么问题。

  

Tkinter回调Traceback中的异常(最近一次调用最后一次):
  文件“ C:\ Users \ user \ Desktop \ Python 3.6.2 \ lib \ tkinter__init __。py”,   第1699行,在致电中       返回self.func(* args)文件“ C:\ Users \ user \ neon \ workspace \ OLD_MINT \ OM \ Test3.py”,行17,在   点击了       total = total + 1#也可能会引起问题UnboundLocalError:赋值之前引用了局部变量'total'

此回溯中的关键信息是:

UnboundLocalError: local variable 'total' referenced before assignment

这告诉您函数视图total作为局部变量,并且抱怨您在分配之前试图引用。此部分专门total+1

要纠正这种情况,您需要告诉您的函数total是全局变量,因此该函数将首先在全局命名空间中查找。

现在您可能想知道是否是这种情况,然后为什么可以在不定义全局的情况下更新标签(lbl)。这是因为python可以猜测是局部变量还是全局变量。

如果您尝试编辑某些内容而不实际分配它,则python将首先在函数中本地查找,然后,如果找不到,它将在全局名称空间中查找。我不确定所有细节,但这通常就是它在做的事情。

from tkinter import *

window = Tk()
window.title("Cookie Clicker")
window.geometry('350x200')
lbl = Label(window, text="$0.00")
lbl.grid(column=0, row=0)

x=0
total=0

def clicked():
    global total # tell the function total is in the global namespace. 
    total = total+1
    lbl.configure(text='${:,.2f}'.format(total))

btn = Button(window, text="Cookie", command=clicked)
btn.grid(column=1, row=0)
mainloop()