首页 > 解决方案 > 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()

标签: pythontkinter

解决方案


您的注释掉的代码接近工作-但您需要调用start以启动线程。

  def run(self):
        t1 = threading.Thread(target = self._animate)
        t2 = threading.Thread(target = self._data_run)
        t1.start()
        t2.start()

推荐阅读