2016-02-10 80 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?