我有一个带有小部件的主界面.. GUI 上的内容并不重要。
我想做的是在应用程序启动时创建启动画面。
重点是在加载界面时,启动画面应该是占用加载时间的东西。
我尝试了很多选择。
使用两个库,Tkinter 和 (PyQt5/6, PySide6, PySimpleGUI)
为启动画面创建一个新文件
tk.Tk 用于两个窗口(主窗口和启动画面)
Tk 和 TopLevel
最后一个选项看起来是最好的,但是有一个问题。
哪个是根,哪个是顶级?
您需要先启动启动画面,
所以也许这个可以成为根,但是你会破坏启动画面(错误的选择)或撤回它?但在您关闭主界面后,该应用程序仍会运行。
我知道这个理论。你不能有 or.. 更准确地说,不建议有两个 Tk 实例。
我该怎么办
您可以在下面找到代码。现在,代码中没有线程,只有主线程。首先出现启动画面,然后显示我的主界面。
这是主界面,我的小部件在这里:
class CANGui():
def __init__(self, gui_revision: str):
self.splash() # splash function
self.gui_revision = gui_revision
self.root = Tk() # Tk instance of main interface
self.root.geometry("600x850")
self.root.title(f"CanInterfaceGUI {self.gui_revision}")
...
调用我的启动类的函数:
def splash(self):
root = Tk()
splash = SplashScreen(root)
for i in range(200):
if i % 10 == 0:
splash.abc()
root.update()
splash.progressbar.step(0.5)
time.sleep(0.01)
splash.destroy()
root.mainloop()
带有启动画面的类:
class SplashScreen:
def __init__(self, parent):
self.parent = parent
self.logo_image = Image.open("photo.png").resize((500, 250), Image.ANTIALIAS)
self.logo_animation = ImageTk.PhotoImage(self.logo_image)
self.parent.overrideredirect(True)
screen_width = self.parent.winfo_screenwidth()
screen_height = self.parent.winfo_screenheight()
logo_width = self.logo_animation.width()
logo_height = self.logo_animation.height()
x = (screen_width - logo_width) // 2
y = (screen_height - logo_height) // 2
self.parent.geometry("+{}+{}".format(x, y))
self.logo_frame = Frame(self.parent)
self.logo_frame.grid(row=0, column=0, sticky='nsew')
frame = Frame(self.parent)
frame.grid(row=1, column=0, sticky='nsew')
self.logo_label = Label(self.logo_frame, image=self.logo_animation)
self.logo_label.grid(row=0, column=0)
self.progressbar = Progressbar(frame, orient='horizontal', length=200)
self.progressbar.config()
self.progressbar.grid(row=0, column=0, padx=5)
self.text_label = Label(frame, text="...", font=("Arial", 11))
self.text_label.grid(row=0, column=1, padx=(200,0), sticky='e')
self.list = ['.modules', 'CAN-HAT.sh' , 'continue', '.install', 'initialize']
self.parent.update()
def abc(self):
self.text_label.config(text = random.choice(self.list))
def destroy(self):
self.parent.overrideredirect(False)
self.parent.destroy()