2016-07-30 36 views
1

Ich habe ein Hauptfenster, das bis zu ein paar Sekunden dauern kann, um korrekt geladen zu werden. Aus diesem Grund möchte ich einen Begrüßungsbildschirm haben, der zeigt, bis die Methode init der Hauptklasse beendet ist, und die Haupt-tkinter-Anwendung kann angezeigt werden. Wie kann dies erreicht werden?Tkinter Splash Screen anzeigen und Hauptbildschirm ausblenden, bis __init__ beendet ist

Splash Screen Code:

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

Haupt tkinter Fenster Mindestarbeitsbeispiel:

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

EDIT: ich das Hauptfenster verwenden können, bis sie Laden mit dem .withdraw() und beendet ist. deiconify() Methoden. Mein Problem ist jedoch, dass ich keine Möglichkeit finde, den Begrüßungsbildschirm zwischen diesen beiden Methodenaufrufen zu verwenden.

+0

Vielleicht ist dies ein XY-Problem. Warum dauert das Laden Ihres Hauptfensters einige Minuten? Führen Sie eine Funktion in "__init__" aus, die die Ladezeit usw. verursacht? – Pythonista

Antwort

2

ein einfaches Beispiel für 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() 

einer der Gründe, Dinge wie diese in tkinter schwer ist, dass Fenster werden nur dann aktualisiert, wenn das Programm nicht bestimmte Funktionen ausgeführt und erreicht so die mainloop. für einfache Dinge wie diese Ihnen die update oder update_idletasks Befehle verwenden können, um es/update zu machen zeigen jedoch, wenn die Verzögerung dann zu lang auf Fenster kann das Fenster „nicht reagiert“, um dieses

ein Weg geworden ist, mehrere zu setzen update oder update_idletasks Befehl während Ihrer Lade-Routine, oder alternativ Threading verwenden.

Wenn Sie jedoch threading verwenden, würde ich vorschlagen, anstatt den Splash in einen eigenen Thread zu setzen (wahrscheinlich einfacher zu implementieren), wäre es besser, die Ladeaufgaben in einen eigenen Thread zu setzen, Worker-Threads und GUI-Threads getrennt zu halten. Dies führt zu einer besseren Benutzererfahrung.