<p>最好在线程中运行耗时的任务,否则会使tkinter应用程序不响应</p>
<p>我使用另一个函数<code>start_classification()</code>,在选择菜单项<code>Classify</code>后执行</p>
<p>在该职能范围内:</p>
<ul>
<li>在<em>不确定</em>模式下创建进度条</li>
<li>启动进度条动画</li>
<li>创建一个tkinter变量来保存来自<code>Classifyall()</code>的结果</li>
<li>启动子线程以执行<code>Classifyall()</code></li>
<li>等待子线程完成</li>
<li>销毁进度条</li>
<li>使用来自<code>Classifyall()</code>的结果更新文本框</li>
</ul>
<pre class="lang-py prettyprint-override"><code>import threading
from tkinter import ttk
...
# added argument var (a tkinter StringVar)
def Classifyall(var):
table = BeautifulTable()
table.column_headers = ["File Name", "File Format"]
directory_path = '/home/.../All files/*'
file_list = glob.glob(directory_path)
for file in file_list:
filepath, file_extention = os.path.splitext(file)
filename = filepath.rsplit('/', 1)[1]
table.append_row([filename, file_extention])
# note that it is not safe to update tkinter widget in a child thread
# so use the passed tkinter variable to save the result instead
var.set(table)
def start_classification():
# create a progress bar and start the animation
pbar = ttk.Progressbar(gui1, orient='horizontal', length=300, mode='indeterminate')
pbar.place(relx=0.5, rely=0.5, anchor='c')
pbar.start()
var = StringVar() # hold the result from Classifyall()
# execute Classifyall() in a child thread
threading.Thread(target=Classifyall, args=(var,)).start()
# wait for the child thread to complete
tx.wait_variable(var)
pbar.destroy()
tx.insert(END, var.get())
...
tool_menu = Menu(menu)
tool_menu.add_command(label='Classify', command=start_classification) # call start_classification() instead
menu.add_cascade(label='Tool', menu=tool_menu)
...
</code></pre>