Treeview - 在忽略长函数之前调用设置列文本
Treeview - call to set column text before long function ignored
我是使用 tkinter 和 python 进行 GUI 编程的新手 3.
它应该做什么:
我的应用程序从医学期刊文章中提取 DOI。 PDF 使用 ttk.Treeview 显示。双击文件会启动文本提取功能,最多可能需要 5 秒,具体取决于 PDF 的大小。调用函数前状态栏显示 "processing ...",调用后显示 "complete"。
这是我可怜的进度条版本,因为我还没有学过那些或线程。
实际发生了什么:
双击文件启动功能,然后将状态列设置为"complete"。它从不显示 "processing".
我在这里错过了什么?
示例
这将创建一个 ttk.Treeview 并加载当前目录。双击任意文件都要设置状态,等待4秒(模拟冗长功能),再设置状态。
import os, time
import tkinter as tk
from tkinter import ttk
class DirBrowser(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.parent = parent
self.path = os.getcwd()
self.setup_tree()
def setup_tree(self):
self.tree = ttk.Treeview(self, columns=('status'))
self.tree.pack(expand=True, fill=tk.BOTH)
self.tree.heading("#0", text="Directory", anchor='w')
self.tree.heading('status', text='Status', anchor='w')
self.tree.bind('<Double-Button-1>', self.on_dblclick)
for directory, subdir_list, file_list in os.walk(self.path):
node = self.tree.insert('', 'end', text=directory)
for file in file_list:
self.tree.insert(node, 'end', text=file)
def on_dblclick(self, event):
selected = self.tree.selection()[0]
# set status column to 'processing'
self.tree.set(selected, 'status', 'processing ...')
# simulate a time-consuming function
# the real program extracts text from a PDF here
time.sleep(4)
# set status column to 'complete'
self.tree.set(selected, 'status', 'complete')
if __name__ == '__main__':
master = tk.Tk()
tree = DirBrowser(master).pack(fill=tk.BOTH, expand=True)
master.mainloop()
更改TreeView文本后需要更新界面如下
def on_dblclick(self, event):
selected = self.tree.selection()[0]
# set status column to 'processing'
self.tree.set(selected, 'status', 'processing ...')
# Update (like a single step of mainloop)
self.parent.update() # <-- ADD
# simulate a time-consuming function
# the real program extracts text from a PDF here
time.sleep(4)
# set status column to 'complete'
self.tree.set(selected, 'status', 'complete')
我是使用 tkinter 和 python 进行 GUI 编程的新手 3.
它应该做什么:
我的应用程序从医学期刊文章中提取 DOI。 PDF 使用 ttk.Treeview 显示。双击文件会启动文本提取功能,最多可能需要 5 秒,具体取决于 PDF 的大小。调用函数前状态栏显示 "processing ...",调用后显示 "complete"。
这是我可怜的进度条版本,因为我还没有学过那些或线程。
实际发生了什么:
双击文件启动功能,然后将状态列设置为"complete"。它从不显示 "processing".
我在这里错过了什么?
示例
这将创建一个 ttk.Treeview 并加载当前目录。双击任意文件都要设置状态,等待4秒(模拟冗长功能),再设置状态。
import os, time
import tkinter as tk
from tkinter import ttk
class DirBrowser(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.parent = parent
self.path = os.getcwd()
self.setup_tree()
def setup_tree(self):
self.tree = ttk.Treeview(self, columns=('status'))
self.tree.pack(expand=True, fill=tk.BOTH)
self.tree.heading("#0", text="Directory", anchor='w')
self.tree.heading('status', text='Status', anchor='w')
self.tree.bind('<Double-Button-1>', self.on_dblclick)
for directory, subdir_list, file_list in os.walk(self.path):
node = self.tree.insert('', 'end', text=directory)
for file in file_list:
self.tree.insert(node, 'end', text=file)
def on_dblclick(self, event):
selected = self.tree.selection()[0]
# set status column to 'processing'
self.tree.set(selected, 'status', 'processing ...')
# simulate a time-consuming function
# the real program extracts text from a PDF here
time.sleep(4)
# set status column to 'complete'
self.tree.set(selected, 'status', 'complete')
if __name__ == '__main__':
master = tk.Tk()
tree = DirBrowser(master).pack(fill=tk.BOTH, expand=True)
master.mainloop()
更改TreeView文本后需要更新界面如下
def on_dblclick(self, event):
selected = self.tree.selection()[0]
# set status column to 'processing'
self.tree.set(selected, 'status', 'processing ...')
# Update (like a single step of mainloop)
self.parent.update() # <-- ADD
# simulate a time-consuming function
# the real program extracts text from a PDF here
time.sleep(4)
# set status column to 'complete'
self.tree.set(selected, 'status', 'complete')