tkinter:进度列表未更新



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

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

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)

你应该在窗口上使用 update() 方法。通常 tkinter 会在 mainloop() 中更新窗口。它非常快速地重新绘制窗口内容(每秒多次)。当你现在调用 f_run() 时,mainloop() 被中断,直到函数完成。在要重新绘制窗口内容的所有位置,在代码中键入 root.update()。例如:

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

或者你应该使用

update_idletasks()

如评论中所述

相关内容

  • 没有找到相关文章