【问题标题】:python showing the current state of a codepython显示代码的当前状态
【发布时间】:2013-08-30 08:01:09
【问题描述】:

我有以下代码:

from Tkinter import *

root = Tk()

def count():
    for i in range(300):
        Display.configure(text = 'The current number is: '+str(i))

Button = Button(root, text = 'Start', command = count)
Button.pack()

Display = Label(root)
Display.pack()

root.mainloop()

我希望在单击“开始”按钮后在计数期间显示当前数字,但它不起作用。 它只在完成计数后显示数字,因此在计数后只显示:“当前数字为:299”。 (重点是我想知道如何显示代码的当前状态。 (我需要制作一个收集特定文件而不是将其复制到特定位置的应用程序,并且我希望它显示它当前正在复制的文件。该应用程序与显示当前文件的工作除外。我试图测试显示使用上面的代码。)

【问题讨论】:

    标签: python tkinter progress


    【解决方案1】:

    在您的示例代码中,问题在于,首先,显示在循环内没有要更新的变化,其次,如果它会更新,那么看到除最后一个数字之外的任何其他数字都会很快。

    一个简单的解决方法是调用root.update_idletasks() 来更新显示。

    from Tkinter import *
    import time
    
    root = Tk()
    
    def count():
        for i in range(300):
            Display.configure(text = 'The current number is: '+str(i))
            root.update_idletasks()
            time.sleep(0.01) # just to see something
    
    Button = Button(root, text = 'Start', command = count)
    Button.pack()
    
    Display = Label(root)
    Display.pack()
    
    root.mainloop()
    

    一个可能更好的方法是使用协程(我在这里包装成一个装饰器)和after_idle

    import time
    from Tkinter import *
    
    root = Tk()
    
    def updatesdisplay(func):
        def driver(iterator):
            try: next(iterator)
            except StopIteration: pass
            else: root.after_idle(driver, iterator)
        def wrapped():
            driver(func())
        return wrapped
    
    @updatesdisplay
    def count():
        for i in range(300):
            time.sleep(0.005) # just to see something
            Display.configure(text = 'The current number is: '+str(i))
            yield # chance to update display here
    
    Button = Button(root, text = 'Start', command = count)
    Button.pack()
    
    Display = Label(root)
    Display.pack()
    
    root.mainloop()
    

    【讨论】:

    • 谢谢,这正是我想要的!一件小事:如果我使用 Display.place() 方法,并遍历一个包含字符串的列表(字符串的长度可以在 24 到 65 的范围内变化),那么在显示文本时它会从左向右跳转.如果我以某种方式修改代码,用户必须单击按钮,然后它会显示列表中的下一项,文本保持静态(因此它按我想要的方式工作)。有解决办法吗?
    • @user2665140 可能,很难说没有看到一个例子。也许只是发布一个带有重现问题的代码的新问题。
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多