Python Tkinter显示启动屏幕并隐藏主屏幕,直到完成初始化
我有一个tkinter主窗口,需要几秒钟才能正确加载。因此,我希望有一个启动屏幕,直到主类的init方法完成为止,并且可以显示主tkinter应用程序。如何做到这一点 启动屏幕代码:Python Tkinter显示启动屏幕并隐藏主屏幕,直到完成初始化,python,tkinter,splash-screen,Python,Tkinter,Splash Screen,我有一个tkinter主窗口,需要几秒钟才能正确加载。因此,我希望有一个启动屏幕,直到主类的init方法完成为止,并且可以显示主tkinter应用程序。如何做到这一点 启动屏幕代码: from Tkinter import * from PIL import Image, ImageTk import ttk class DemoSplashScreen: def __init__(self, parent): self.parent = parent
from Tkinter import *
from PIL import Image, ImageTk
import ttk
class DemoSplashScreen:
def __init__(self, parent):
self.parent = parent
self.aturSplash()
self.aturWindow()
def aturSplash(self):
self.gambar = Image.open('../output5.png')
self.imgSplash = ImageTk.PhotoImage(self.gambar)
def aturWindow(self):
lebar, tinggi = self.gambar.size
setengahLebar = (self.parent.winfo_screenwidth()-lebar)//2
setengahTinggi = (self.parent.winfo_screenheight()-tinggi)//2
self.parent.geometry("%ix%i+%i+%i" %(lebar, tinggi, setengahLebar,setengahTinggi))
Label(self.parent, image=self.imgSplash).pack()
if __name__ == '__main__':
root = Tk()
root.overrideredirect(True)
progressbar = ttk.Progressbar(orient=HORIZONTAL, length=10000, mode='determinate')
progressbar.pack(side="bottom")
app = DemoSplashScreen(root)
progressbar.start()
root.after(6010, root.destroy)
root.mainloop()
主tkinter窗口最小工作示例:
import tkinter as tk
root = tk.Tk()
class Controller(tk.Frame):
def __init__(self, parent):
'''Initialises basic variables and GUI elements.'''
frame = tk.Frame.__init__(self, parent,relief=tk.GROOVE,width=100,height=100,bd=1)
control = Controller(root)
control.pack()
root.mainloop()
编辑:我可以使用主窗口,直到它使用.draw()和.deiconify()方法完成加载。但是,我的问题是,我找不到一种方法在这两个方法调用之间运行启动屏幕。python3的一个简单示例:
#!python3
import tkinter as tk
import time
class Splash(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.title("Splash")
## required to make window show before the program gets to the mainloop
self.update()
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.withdraw()
splash = Splash(self)
## setup stuff goes here
self.title("Main Window")
## simulate a delay while loading
time.sleep(6)
## finished loading so destroy splash
splash.destroy()
## show window again
self.deiconify()
if __name__ == "__main__":
app = App()
app.mainloop()
在tkinter中这样做很困难的原因之一是,只有当程序没有运行特定的函数并因此到达主循环时,才会更新窗口。对于这样简单的事情,您可以使用update
或update\u idletasks
命令使其显示/更新,但是如果延迟太长,则在windows上窗口可能会变得“无响应”
一种解决方法是在整个加载例程中放置多个update
或update\u idletasks
命令,或者使用线程
但是,如果您使用线程,我建议您最好将加载任务放在自己的线程中,保持工作线程和GUI线程分开,而不是将启动放在自己的线程中(可能更容易实现),因为这样可以提供更流畅的用户体验。python3的一个简单示例:
#!python3
import tkinter as tk
import time
class Splash(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.title("Splash")
## required to make window show before the program gets to the mainloop
self.update()
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.withdraw()
splash = Splash(self)
## setup stuff goes here
self.title("Main Window")
## simulate a delay while loading
time.sleep(6)
## finished loading so destroy splash
splash.destroy()
## show window again
self.deiconify()
if __name__ == "__main__":
app = App()
app.mainloop()
在tkinter中这样做很困难的原因之一是,只有当程序没有运行特定的函数并因此到达主循环时,才会更新窗口。对于这样简单的事情,您可以使用update
或update\u idletasks
命令使其显示/更新,但是如果延迟太长,则在windows上窗口可能会变得“无响应”
一种解决方法是在整个加载例程中放置多个update
或update\u idletasks
命令,或者使用线程
但是,如果您使用线程,我建议您最好将加载任务放在自己的线程中,保持工作线程和GUI线程分开,而不是将启动放在自己的线程中(可能更容易实现),因为这会给用户带来更流畅的体验。我有三个单独的函数需要运行,如果看到一个示例使用线程或更好的多处理,那就太好了。我有三个单独的函数需要运行,如果看到一个示例使用线程或更好的多处理,那就太好了。