#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()
Результат будет следующим: