当前位置: 首页 > 面试题库 >

Tkinter显示初始屏幕并隐藏主屏幕,直到__init__完成

桂和同
2023-03-14
问题内容

我有一个主要的tkinter窗口,可能需要花费几秒钟才能正确加载。因此,我希望显示一个初始屏幕,直到主类的 init
方法完成,然后可以显示主tkinter应用程序。如何做到这一点?

启动画面代码:

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()

编辑:我可以使用主窗口,直到使用.withdraw()和.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中很难实现的原因之一是,仅在程序未运行特定功能且到达主循环时才更新Windows。对于类似这样的简单操作,您可以使用updateupdate_idletasks命令使其显示/更新,但是,如果延迟时间过长,则在Windows上,窗口可能会“无响应”

解决此问题的一种方法是在整个加载例程中放置多个updateupdate_idletasks命令,或者使用线程。

但是,如果您使用线程,我建议不要将启动程序放入其自己的线程中(可能更容易实现),最好将加载任务放入其自己的线程中,并保持工作线程和GUI线程分开,因为这样容易提供更流畅的用户体验。



 类似资料:
  • 我目前正在编写一个游戏,你必须避免小行星。我不得不处理一些混乱的坐标,我不得不猜测精灵的坐标。我现在有了描述我的世界的任意单位。不幸的是,我的游戏屏幕不能完全工作。当我想渲染我的小行星时,游戏屏幕会显示一个黑屏。 上面显示的代码工作正常,并向我展示了以下内容: 当我在GameScreen类中添加小行星的渲染方法时,GameScreen只是黑色的: 小行星等级: 小行星等级:

  • 问题内容: 嗨,我正在编写图形程序,我一直在寻找一种获取所使用屏幕物理尺寸的方法。我可以获得以像素为单位的屏幕大小以及逻辑分辨率。我似乎找不到任何地方可以获取任何显示器规格中始终具有的物理尺寸(例如19“-376 x 301 mm)。问题是,加载此信息时,此信息是否甚至还存储在OS中的任何位置?我正在编写的程序需要在Mac和Windows上运行。 谢谢! nt 问题答案: 我认为Java不可能实现

  • 我使用了“arFragment.getArSceneView.getScene().setOnUpdateListener”。每当我实现我自己的“setOnUpdateListener”时,我都能够显示我的菜单,但这个加载图像不会隐藏。此图像仅在我未实现updateListener时自动隐藏。这是活动_main的片段。来自MainActivity的xml和侦听器。JAVA

  • 8.3.3 打印输出的中断功能 打印输出是一种硬拷贝输出,也是一种常用的输出形式。随着计算机应用领域的不断扩大,外围设备的重视程度也越来越高。目前,打印机的种类已日益丰富,有针式打印机、喷墨打印机和激光打印机等。从打印色彩来看,既有普通的黑色打印,也有彩色打印。总之,计算机打印输出的品质是越来越高。 1、打印机状态字 打印机状态字记录着打印机的当前工作情况(或状态),它相当于CPU中的程序状态字和

  • screen 模块用于检索有关屏幕大小,显示,光标位置等的信息 进程: 主进程 渲染进程​ screen 是一个 EventEmitter. 注意: app模块必须用在 ready事件后. 注意: 在渲染进程或开发者工具栏中, window.screen 是一个预设值的 DOM属性, 所以 var screen = require('electron').screen 这样写的话是无效的. 创建一

  • 我是python新手,我想用pygame在屏幕上可视化一个算法。这是我的代码: 但这总是显示一个黑色或有点深灰色的屏幕。有人知道我做错了什么吗?我尝试了多个教程,它们都给了我相同的屏幕。 我正在使用MacOS 10.14