python - 如何在使用 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方法在程序加载时出现,但它甚至没有出现。
有什么解决办法吗?提前致谢!
解决方案
你可能正在寻找这样的东西
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()
推荐阅读
- excel - 如何创建与附件图像中的轮廓图类似的轮廓图?(最好在 Excel 中,但对其他选项开放)
- c# - Autofac mock - 如何从依赖项中的特定方法设置/伪造数据?
- python - cupy map_coordinates gives out shape is mismatched error
- mysql - 如何在mysql中为表分配动态值
- c# - GetSnapshotAsync() 永远不会返回,我也没有收到任何错误。我该如何调试这个问题?
- visual-studio - 在条件“$(MSBuildVersion) >= 16.1.0”) 下,对“$(MSBuildVersion)”进行了数值比较,计算结果为“”而不是数字
- deadlock - ExternalTaskOperators 死锁:为什么,多久一次,以及如何解决这个问题?
- c - emxFree_real_T 导致可执行文件中止
- java - 在小程序中加载时,清单中的 Class-Path 属性会导致烦人的 FileNotFoundException
- python - 在不将其转换为 Pandas 的情况下绘制 Spark Dataframe 的方法