Tkinter命令忽略了一些行

时间:2014-10-20 05:10:22

标签: python tkinter ttk

下面的代码创建了一个带按钮的Tkinter根窗口。该按钮绑定到一个简单的函数,该函数应该暂时显示进度条小部件。虽然打印语句按预期运行,但从不显示进度条。有线索吗?

from Tkinter import *
import ttk
from time import sleep

root = Tk()

def foo():
    print 'starting...'
    pb = ttk.Progressbar(root, mode='indeterminate')
    pb.pack()
    sleep(5)
    print 'stopping...'
    pb.destroy()

ttk.Button(root, text="Run", command=foo).pack()

1 个答案:

答案 0 :(得分:0)

这里是解决方案:

from Tkinter import *
import ttk
from time import sleep

root = Tk()

def foo():
    print 'starting...'
    pb = ttk.Progressbar(root, mode='indeterminate')
    pb.pack()
    root.update()
    sleep(5)
    print 'stopping...'
    pb.destroy()

ttk.Button(root, text="Run", command=foo).pack()

root.mainloop()

现在的原因是:当某个函数调用之间有可用时间时,tkinter会刷新它的GUI。因此,如果您想创建一个显示巨大进程进度的界面,您必须定期调用并手动调用Tk.update()方法。

事实上,在你的代码中,你正在做一个time.sleep(5),可以预期Tkinter会在睡眠期间更新GUI,但这是一个活跃的'等等,以便刷新tkinter GUI。

通过每隔25ms移动进度条,可以让用户意识到发生了某些事情。如果没有关于0.025(或其他合理值)的测试,进度条会发疯并且移动得太快。我的想法是不使用睡眠而是使用时间:

from Tkinter import *
import ttk
from time import *

root = Tk()

def foo():
    print 'starting...'
    pb = ttk.Progressbar(root, mode='indeterminate')
    pb.pack()
    root.update()
    start = time()
    last_update= time()
    while (time() - start) <= 5:
        current = time()
        if (current-last_update)> 0.025:
            pb.step()
                root.update()
                last_update = current
    print 'stopping...'
    pb.destroy()

ttk.Button(root, text="Run", command=foo).pack()

root.mainloop()