代码之家  ›  专栏  ›  技术社区  ›  pediatrictactic

Treeview-调用set column text before long函数忽略

  •  0
  • pediatrictactic  · 技术社区  · 7 年前

    我对tkinter和Python3的GUI编程还不熟悉。

    我的应用程序从医学期刊文章中提取DOI。PDF使用ttk.Treeview显示。双击文件可启动文本提取功能,根据PDF的大小,该功能最多需要5秒钟。状态列在调用函数之前显示“正在处理…”,在调用函数之后显示“完成”。

    这是我可怜的人版本的进度条,因为我还没有学会这些或线程。

    实际发生的情况:

    双击文件启动该功能,然后将状态列设置为“完成”。它从不显示“处理”。

    我错过了什么?

    实例

    这将创建一个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()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   CJC    7 年前

    您需要在更改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')