首页 > 解决方案 > 如何在使用 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方法在程序加载时出现,但它甚至没有出现。

有什么解决办法吗?提前致谢!

标签: pythonmultithreadingobjecttkinter

解决方案


你可能正在寻找这样的东西

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 i%100==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. 在开始指示 GUI 已加载之前self.loaded变为True正确。mainloop()


推荐阅读