我试图用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()
答案 0 :(得分:1)
这是因为在没有类的示例中,count
变量位于update_txt
函数可用的范围内。
在您的班级中,update_clock
函数无权访问您在countVar
中定义的__init__
变量。单独定义的两个函数将无法访问其他每个变量。这是您使用变量self
的原因。传递给此类中任何函数的第一个参数是该类的副本,并为其指定名称self
。
因此,如果您将其设置为self.countVar
,则update_clock
中self.countVar
可以使用{{1}}。
您可能有兴趣搜索" python LEGB",它将向您展示更多关于如何在python中使用作用域:D
答案 1 :(得分:0)
countVar
只是一个局部变量。它不是您班级的属性,因此在countVar
中设置__init__
完全独立于countVar
中的update_clock
。
通过在self
上设置属性:
self.countVar = tk.StringVar()
现在您可以在update_clock
。
请注意,这也适用于clock
变量。在self
上放置您需要在方法(实例州)之间共享的所有内容。