2016-02-10 92 views
0

此代码会产生一个错误,我不知道为什么或者如何解决它?倒计时错误

File "/Users/johnz/Dropbox/PythonWorkspace/BumpersRev1/test3.py", 
    line 7, in countdown 
if self.remaining <= 0: 
AttributeError: 'int' object has no attribute 'remaining'` 

from tkinter import * 

# count down timer 
def countdown(self, remaining = None): 
    if remaining is not None: 
     self.remaining = remaining 
    if self.remaining <= 0: 
     pass 
    else: 
     self.remaining = self.remaining - 1 
     self.after(1000, self.countdown) 

def main(): 
# create a Tk window 
    win1 = Tk() 
    countdown(90) 
    mainloop() 

main() 

回答

3

您正试图将一个整数传递给函数倒数。应该指出的是,self是常规的。不需要命名,但这是我们通常使用的。然而,因为这不是一个实例函数(即不是一个类的一部分),所以你没有理由继承这个对象本身。这可以完全没有自己。

import functools 
from Tkinter import * 
def countdown(remaining = None): 
    if remaining <= 0 or remaining is None: 
     pass 
    else: 
     remaining -= 1 
     # Requires a widget instance here.... 
     # Widget.after(1000, functools.partial(countdown, remaining)) 
+0

我用你的代码取代了我的倒计时功能,把所有的东西都留在原地。我添加了导入。现在我得到一个新的错误: 文件“/Users/johnz/Dropbox/PythonWorkspace/BumpersRev1/test3.py”,第10行,在倒计时 之后(1000,functools.partial(倒计时(剩余))) NameError: '未定义'之后的名字 – user2172181

+0

我希望你能。您仍然需要处理在After中使用Widget实例。不幸的是,我并不经常使用Tkinter来了解它,但我立即认识到你对自己的使用是错误的。 – Goodies

+0

另外,刷新页面以获得我最近的编辑。我假设之后是你已经使用或可以访问的功能。 AFAIK,它在Tkinter.Widget.after – Goodies

0

你必须在after

from tkinter import * 

# count down timer 
def countdown(remaining, widget): 
    print(remaining) 

    if remaining > 0: 
     remaining = remaining - 1 
     widget.after(1000, countdown, remaining, widget) 

def main(): 
    win1 = Tk() 
    countdown(90, win1) 
    mainloop() 

main() 

发送参数如果win1将是全球性的变量,那么你不必送widget

from tkinter import * 

# count down timer 
def countdown(remaining): 
    print(remaining) 

    if remaining > 0: 
     remaining = remaining - 1 
     win1.after(1000, countdown, remaining) 


# global variables 
win1 = Tk() 
countdown(90) 
mainloop() 

BTW:例如与after ADN显示当前时间tkinter窗口中: Tkinter Text Animation?