Как создать экран загрузки во время загрузки приложения с помощью Tkinter

#python #multithreading #object #tkinter

Вопрос:

У меня есть следующая проблема. Я новичок в этой многопоточности. Я создал программу для преобразования pdf в docx и наоборот. Проблема в том, что я хочу разместить экран загрузки во время преобразования, но я не могу найти способ выполнить одновременно и экран загрузки, и метод. Я обнаружил, что могу использовать многопоточность, но я все еще не могу выполнять оба метода одновременно. У меня есть это:

 Thread(target = Conversor()).start()
Thread(target = loading_screen()).start()
 

Conversor-это объект , у которого есть __init__ , который открывает окно tkinter. С помощью этого кода откроется экран загрузки, который представляет собой следующее:

 def loading_screen():
    chars = "/—|" 
    for char in chars:
        sys.stdout.write('r' 'loading...' char)
        time.sleep(.1)
        sys.stdout.flush()
 

Даже не появляется. Даже если бы это было так, оно появилось бы после того, как я закончу все в окне tkinter.
Во-первых, я хотел посмотреть, выполняются ли оба метода одновременно, поэтому я бы приказал методу loading_screen появляться при загрузке программы, но он даже не появляется.

Есть какое-нибудь решение? Заранее спасибо!

Ответ №1:

Возможно, вы ищете что-то вроде этого

 from tkinter import *
import sys
from threading import Thread
import time

class Conversor(Tk):
    def __init__(self):
        super().__init__()
        self.loaded=False
        self.geometry('400x300')
        Thread(target=self.loading_screen).start()
        label=Label(self)
        label.pack()
        for i in range(10000): #Increase load time
            label['text'] =str(i)
            if i0==0:
                label['text'] ='n'

    def loading_screen(self):
        idx=0
        while not self.loaded:
            chars = r"/—|" 
            sys.stdout.write('r' 'loading...' chars[idx])
            sys.stdout.flush()
            if idx==len(chars)-1:
                idx=0
            else:
                idx =1
            time.sleep(.1)
        else:
            sys.stdout.write('nloaded')

    def start(self):
        self.loaded=True
        self.mainloop()

if __name__=='__main__':
    conversor=Conversor()
    conversor.start()
 

loading_screen Поток был вызван сразу после Tk инициализации, и флаг self.loaded установлен на False . self.loaded становится True прямо перед mainloop() началом, указывающим, что графический интерфейс был загружен.