python - Python Tkinter 类中的线程方法
问题描述
我正在 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()
解决方案
您的注释掉的代码接近工作-但您需要调用start
以启动线程。
def run(self):
t1 = threading.Thread(target = self._animate)
t2 = threading.Thread(target = self._data_run)
t1.start()
t2.start()
推荐阅读
- jquery - 如何延迟淡出的功能?
- plot - 单独的 EPSlatex 不添加 \end{document}
- java - 如何编写一个在某些列值中生成数字的数组生成器?
- java - 将基类参数传递给具有子类签名的方法
- vba - 尝试调用函数时出现名称错误
- wordpress - WPBakery 页面构建器拉伸图像全宽
- java - 忽略在正则表达式中创建单词的开头
- accessibility - Cypress 和 Axe 似乎忽略了内容安全策略
- javascript - 如何从变量或道具导入组件 - 动态路由器
- python - 无法在 Selenium Python 中通过 SendKeys() 输入密码