tkinter:进度列表未更新

tkinter: progress list not updating

我很难将我的问题归结为一个基本问题,所以如果这已经在另一个问题中得到解决,我深表歉意。

我的问题在于向用户提供进度反馈。基本系统用于导入文件、分析它们(使用外部函数)并最终生成输出文件。在分析过程中,我想让用户知道哪些文件已经被分析过。

GUI 由两个列表框组成:左侧显示选择进行分析的文件,右侧显示已分析的文件。底部的按钮开始分析。

问题是进度列表只在 for 循环完成后更新,中间不会更新。

非常感谢您的帮助,因为我现在已经被困了很长时间了。

主文件:

from Tkinter import *
from ext_function import Xfunct
import tkFileDialog
import time

root=Tk()
width=3;
files=Frame(root, relief=GROOVE,borderwidth=width)
progress=Frame(root, relief=GROOVE,borderwidth=width)
analysis=Frame(root)

global fl_paths
global fl_names
fl_paths=[]
fl_names=[]

#################  Functions #################

def f_load_files():
    temp = root.tk.splitlist(tkFileDialog.askopenfilenames(parent=root,title='Select files'))
    temp_list=list(temp)

    for i in range(len(temp_list)):
        fl_names.append(temp_list[i].split('/')[-1])
        fl_paths.append(temp_list[i])
        file_list.insert(END, fl_names[-1])

def f_run():
    for i in range(len(fl_names)):
        Xfunct(i) #call the function
        prog_list.insert(END,fl_names[i])#update the list in the progress box           

#################  File selection frame #################
files_name=Label(files,text='File selection:')
files_name.grid(column=0,row=0)
file_list=Listbox(files)
file_list.grid(column=0, row=1, columnspan=2, rowspan=4,pady=3, padx=10)
load_files=Button(files,text='Load files',command=f_load_files)
load_files.grid(column=0,row=5, padx=3, pady=6)

################# Progress #################
progress_name=Label(progress,text='Done:')
progress_name.grid(column=0,row=0, columnspan=3)
prog_list=Listbox(progress)
prog_list.grid(column=0, row=1, columnspan=3, padx=10)

################# Analysis #################
start_analysis=Button(analysis,text='Make Analysis',command=f_run)
start_analysis.grid(column=4, row=1, rowspan=10, padx=10)

################# Align frames #################
files.grid(row=0, column=0, padx=10, pady=10, sticky=N+S+W+E)
progress.grid(row=0, column=1, pady=10, padx=10, sticky=N+S+W+E)
analysis.grid(row=2,column=0, columnspan=2, padx=10, pady=10)

mainloop()

名为 Xfunct 的外部函数,位于名为 ext_funct.py:

的文件中
def Xfunct(i):
    import time

    print i
    time.sleep(3)

您应该在 window 上使用 update() 方法。通常 tkinter 更新 mainloop() 中的 window。它非常快地重新绘制 window 内容(每秒很多次)。当您现在调用 f_run() 时,mainloop() 将被中断,直到函数完成。在任何你想重新绘制 window 内容的地方,在代码中输入 root.update() 。例如:

for i in range(len(fl_names)):
    Xfunct(i)
    root.update()
    prog_list...

或者你应该使用

update_idletasks()

如评论所述