我正在Windows上使用Python Tkinter。我的目标是在动画GUI加载屏幕的后台运行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()
答案 0 :(得分:2)
您注释掉的代码几乎可以正常工作-但您需要调用start
才能使线程启动。
def run(self):
t1 = threading.Thread(target = self._animate)
t2 = threading.Thread(target = self._data_run)
t1.start()
t2.start()