【问题标题】:Count down error倒计时错误
【发布时间】:2016-02-10 23:55:10
【问题描述】:

此代码生成错误,我不知道为什么或如何解决它?

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()

【问题讨论】:

    标签: python tkinter countdown


    【解决方案1】:

    您正在尝试将整数传递给函数倒计时。需要注意的是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))
    

    【讨论】:

    • 我用您的代码替换了我的倒计时功能,而其他所有内容都原样保留。我添加了导入。现在我收到一个新错误:文件“/Users/johnz/Dropbox/PythonWorkspace/BumpersRev1/test3.py”,第 10 行,倒计时之后(1000,functools.partial(countdown(remaining)))NameError:名称'之后'未定义
    • 我希望你能做到。您仍然需要处理使用带有 After 的 Widget 实例。不幸的是,我没有经常使用 Tkinter 来了解它,但我立即意识到你对 self 的使用是错误的。
    • 另外,刷新页面以获取我最近的编辑。我假设 after 是您已经使用或可以访问的功能。 AFAIK,它在 Tkinter.Widget.after
    • 我非常感谢您的回答,但我一定过得很糟糕。试图了解小部件和 .after 函数之间的联系。当应用 .after 函数或以不同方式放置小部件时,小部件会发生什么情况,即使它仅用作占位符,任何小部件都会这样做吗?我说得有道理吗?
    • After 是一些 gui 元素的变化!后一个标签,框架,根,所以跟踪任何一个变化!
    【解决方案2】:

    你必须在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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多