gpt4 book ai didi

python - 带有更新标签的 Tkinter 加载屏幕

转载 作者:太空宇宙 更新时间:2023-11-03 21:15:53 25 4
gpt4 key购买 nike

我正在编写一个应用程序,该应用程序在启动时需要处理大量数据。我想做的是创建一个启动屏幕,实时告诉用户数据加载过程的哪个阶段正在发生。

我的计划是创建一个标签,并根据当时正在进行的计算将新文本传递给该标签。然而,在我的各种尝试中,我所做的最好的就是让标签仅在咀嚼完成后才显示。

我看到了这个,这对我有一点帮助,但仍然没有完全实现: Tkinter Show splash screen and hide main screen until __init__ has finished

下面是我目前的最佳尝试(取出所有实际的数据帧内容以使其最小可执行)

[编辑添加] 理想情况下,我希望以不需要在类内部发生所有数据修改的方式来执行此操作。 IOW,第 1 阶段启动启动屏幕,第 2 阶段在主代码中运行数据修改,第 3 阶段启动主 UI

import time
from tkinter import *

class LoadScreen(Toplevel):
def __init__(self, parent):
Toplevel.__init__(self, parent)
self.title('Loading')
self.update()

class UserInterface(Tk):
def __init__(self, parent):
Tk.__init__(self, parent)
self.parent=parent
self.withdraw()
loader = LoadScreen(self)
self.load_label = Label(loader, text='Loading')
self.load_label.grid(row=0, column=0, padx=20, pady=20)
self.stage_label = Label(loader, text='Preparing dataframe')
self.stage_label.grid(row=1, column=0, padx=20, pady=20)
#loader.destroy()
self.main_screen()

def main_screen(self):
self.deiconify()
self.load_label = Label(self, text='Done')
self.load_label.grid(row=0, column=0, padx=20, pady=20)
self.close_button = Button(self, text='Close',
command = lambda: self.destroy())
self.close_button.grid(row=1, column=0, padx=20, pady=20)

ui = UserInterface(None)

#Pretend I'm doing some dataframe munging
print('1')
time.sleep(2)
ui.stage_label['text'] = 'Running some calculations'
print('2')
time.sleep(2)
ui.stage_label['text'] = 'Finishing up'
print('3')
time.sleep(2)

ui.mainloop()

最佳答案

time.sleep 将阻塞主线程。这是我通常如何做的一个最小示例。

import time
from tkinter import *

root = Tk()
root.withdraw()
Label(root,text="I am main window").pack()

class SplashScreen:
def __init__(self):
self.a = Toplevel()
self.percentage = 0
Label(self.a,text="I am loading screen").pack()
self.load = Label(self.a,text=f"Loading...{self.percentage}%")
self.load.pack()
self.load_bar()

def load_bar(self):
self.percentage +=5
self.load.config(text=f"Loading...{self.percentage}%")
if self.percentage == 100:
self.a.destroy()
root.deiconify()
return
else:
root.after(100,self.load_bar)

SplashScreen()

root.mainloop()

关于python - 带有更新标签的 Tkinter 加载屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54722938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com