我很难将我的问题归结为一个基本问题,所以如果这个问题已经在另一个问题中处理过,我深表歉意。
我的问题在于向用户提供进度反馈。基本系统用于导入文件,分析它们(使用外部功能),并最终生成输出文件。在分析过程中,我想让用户知道哪些文件已经被分析过。
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()
如评论中所述