Treeview - вызов для установки текста столбца, прежде чем длинная функция игнорируется - PullRequest
0 голосов
/ 09 января 2019

Я новичок в программировании GUI с tkinter и python 3.

Что он должен делать:

Мое приложение извлекает DOI из статей медицинского журнала. PDF-файлы отображаются с помощью ttk.Treeview. Двойной щелчок по файлу запускает функцию извлечения текста, которая может занять до 5 секунд, в зависимости от размера PDF. В столбце состояния отображается «обработка ...» до вызова функции и «завершение» после.

Это версия моего индикатора выполнения для моего бедняка, так как я еще не изучил его или не работал с потоками.

Что на самом деле происходит:

Двойной щелчок по файлу запускает функцию, а затем устанавливает для столбца состояния значение «завершено». Он никогда не отображает «обработку».

Что мне здесь не хватает?

Пример

Это создает 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 Ответ

0 голосов
/ 09 января 2019

Вам необходимо обновить интерфейс после изменения текста 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')
...