2016-02-10 2 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: name 'after' не определен – user2172181

+0

Я бы ожидал, что вы это сделаете. Вам все равно придется иметь дело с использованием экземпляра Widget с After. К сожалению, я не использую 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() 

КСТАТИ: пример с after ВОПОГ отображения Текущее время в окне tkinter: Tkinter Text Animation?

Смежные вопросы