Методы работы с потоками внутри класса в Python Tkinter - PullRequest
0 голосов
/ 08 ноября 2019

Я работаю с 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()

1 Ответ

2 голосов
/ 08 ноября 2019

Ваш закомментированный код был близок к работе - но вам нужно вызвать start, чтобы запустить потоки.

  def run(self):
        t1 = threading.Thread(target = self._animate)
        t2 = threading.Thread(target = self._data_run)
        t1.start()
        t2.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...