Создайте загрузочное сообщение для файла tkinter, для открытия которого требуется некоторое время

#python #pandas #tkinter

#python #pandas #tkinter

Вопрос:

У меня есть скрипт на Python, который использует tkinter, и при открытии он запускает запрос, выполнение которого занимает минуту или две. Я хотел бы создать сообщение во время его загрузки до полной загрузки приложения, чтобы пользователь знал, что оно загружается. Мой код выглядит так:

 sqlStr = 'select * from exampleTable'

df = pd.read_sql(sqlStr, conn)

*Some database manipulation*

def1:
     example def 

w = tk.Tk()
w.mainloop()

  

Из этого кода приложение не открывается, пока не будут завершены манипуляции с базой данных. Есть ли способ показать некоторый экран загрузки, пока pandas импортирует данные?

Комментарии:

1. почему бы просто не сначала создать окно tkinter, а затем обновить метку с надписью «Выполняется запрос», а затем «Запрос завершен» Я делаю это постоянно. Мое приложение tkinter открывается, а затем запускает запрос в отдельном потоке и просто обновляет метку, чтобы пользователь знал, что запрос находится на рассмотрении.

2. Как вы могли бы обновить метку?

3. label_name.config(text="new text here")

4. @Mike-SMT Кроме этого, сложно заставить progressbar работать в режиме реального времени, верно?

5. Нет. Индикатор выполнения в реальном времени сделать несложно. Вам просто нужно воспользоваться потоковой обработкой. Однако, когда дело доходит до запроса, будет сложнее предсказать, сколько времени займет запрос, поэтому получение точного индикатора выполнения для чего-то вроде запроса маловероятно. Если библиотека не сообщает о прогрессе. Возможно, Pandas сообщает о прогрессе, которого я сам не знаю.

Ответ №1:

Вы можете запустить свою работу с БД в отдельном потоке:

 import time
import threading
import tkinter as tk
from tkinter.ttk import Progressbar


class TkApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.progress = Progressbar()
        threading.Thread(target=self.db).start()

    def db(self):
        self.progress.grid(row=1, column=0)
        self.progress.start()
        time.sleep(5)  # do something with DB
        self.progress.stop()
        self.progress.grid_forget()


app = TkApp()
app.mainloop()
  

Результат будет следующим:

введите описание изображения здесь