Я работаю с Python Tkinter на Windows. Моя цель - запустить SQL-запрос на фоне экрана загрузки анимированного графического интерфейса. Тем не менее, я не могу понять потокПотоки работают последовательно, а не параллельно.
Я закомментировал код, который, как я думал, будет работать. Код как есть создаст загрузочный экран, но он не запускает _data_run в то же время. Если вы замените оператор run (self) закомментированным фрагментом, экран загрузки не будет заполнен вообще. Я знаю, что круглые скобки после метода заставляют потоки запускаться один за другим - как мне заставить потоки выполняться внутри класса без скобок метода? Должен ли я создавать другой класс для запуска функции _data_run?
Я новичок в tkinter и новичок в Python. Любая лучшая практика или рекомендации, которые у вас есть, также приветствуются.
import tkinter as tk
import threading
colorfade =['#0076B6','#127FBB','#2489C0','#3693C5','#489DCA','#5BA6D0','#6DB0D5','#7FBADA','#91C4DF','#A3CEE4','#B6D7EA','#C8E1EF','#DAEBF4','#ECF5F9','#FFFFFF']
class LoadingFrame (tk.Frame):
def __init__(self, master):
super().__init__(master)
self.state = 0
self.titlelabel = tk.Label(self, text = 'LOADING', font = ('Calibri',60),fg = blue, bg = blue)
self.titlelabel.grid(row = 0, column = 0)
self.pack(expand = True)
self.run()
def run(self):
t1 = threading.Thread(target = self._animate())
t2 = threading.Thread(target = self._data_run())
t1.start
t2.start
# def run(self):
# t1 = threading.Thread(target = self._animate)
# t2 = threading.Thread(target = self._data_run)
# t1.start
# t2.start
def _data_run(self):
print('data run started')
#SQL Query would go here
self.state = 1
print('data run complete')
def _fade_in(self, j):
self.titlelabel['fg'] = colorfade[j]
def _fade_out(self, j):
self.titlelabel['fg'] = colorfade[14-j]
def _animate(self):
for i in range(10):
for j in range(15):
self.after(20,self._fade_in(j))
self.titlelabel.update()
for j in range(15):
self.after(20,self._fade_out(j))
self.titlelabel.update()
self.titlelabel.update()
blue = '#000077'
window = tk.Tk()
window.geometry('1750x950')
#window.geometry('1200x900')
window['bg'] = blue
window.title('Frame')
lf = LoadingFrame(window)
lf['bg'] = blue
window.mainloop()