未定义方法内的变量

时间:2017-11-08 07:43:58

标签: python tkinter

我试图用tkinter制作游戏,为此我使用了类作为框架,所以我可以更改屏幕...... 我的班级Jogo就是游戏,我想把倒计时器放进去。我用于测试的时钟代码,不使用类工作。但是,当我试图将它放在游戏代码上时会出现问题

NameError: name 'countVar' is not defined

这是我要解决的代码:

class Jogo(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.grid(row=0, column=0, sticky="nsew")

        countVar = tk.StringVar()
        self.after(1000, self.update_clock)

        clock = tk.Label(self, textvariable=countVar)
        clock.grid()

    def update_clock(self, event = None):
        for t in range(120, -1, -1):
            mins, secs = divmod(t,60)
            timeformat = "{:02d}:{:02d}".format(mins, secs)
            countVar.set(timeformat)
            clock.update_idletasks()
            sleep(1)

我没有使用类的代码:

import tkinter
from time import sleep

main = tkinter.Tk()
count = tkinter.StringVar()
txt = tkinter.Label(main, textvariable=count)
txt.grid()

def update_txt(event = None):
    for t in range(120, -1, -1):
        mins, secs = divmod(t, 60)
        timeformat = '{:02d}:{:02d}'.format(mins, secs)
        count.set(timeformat)
        txt.update_idletasks()
        sleep(1)

main.after(1000,update_txt)
main.mainloop()

2 个答案:

答案 0 :(得分:1)

这是因为在没有类的示例中,count变量位于update_txt函数可用的范围内。

在您的班级中,update_clock函数无权访问您在countVar中定义的__init__变量。单独定义的两个函数将无法访问其他每个变量。这是您使用变量self的原因。传递给此类中任何函数的第一个参数是该类的副本,并为其指定名称self

因此,如果您将其设置为self.countVar,则update_clockself.countVar可以使用{{1}}。

您可能有兴趣搜索" python LEGB",它将向您展示更多关于如何在python中使用作用域:D

答案 1 :(得分:0)

在这两种方法中,

countVar只是一个局部变量。它不是您班级的属性,因此在countVar中设置__init__完全独立于countVar中的update_clock

通过在self上设置属性:

self.countVar = tk.StringVar()

现在您可以在update_clock

中访问它

请注意,这也适用于clock变量。在self上放置您需要在方法(实例)之间共享的所有内容。