#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()
началом, указывающим, что графический интерфейс был загружен.