2016-07-30 86 views
1

私は正しくロードするのに数秒かかるかもしれないメインのtkinterウィンドウを持っています。このため、メインクラスののinitメソッドが終了し、メインのtkinterアプリケーションが表示されるまでのスプラッシュ画面を表示したいと考えています。これはどのように達成できますか?Tkinter __init__が終了するまで、スプラッシュ画面を表示してメイン画面を非表示にします。

スプラッシュスクリーンコード:

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

EDIT:それは.withdraw()を使用してロードを完了するまで、私は、メインウィンドウを使用することができます。 deiconify()メソッド。しかし、私の問題は、これら2つのメソッド呼び出しの間にスプラッシュ画面を実行する方法が見つからないことです。

+0

これはおそらくXYの問題です。なぜあなたのメインウィンドウはロードに数分かかるのですか?読み込み時間などを引き起こしている '__init__'の関数を実行していますか? – Pythonista

答えて

2

のpython3のための簡単な例:このようなことがTkinterでは困難な理由の

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

1は、プログラムが特定の機能を実行しているので、メインループに到達していないときにウィンドウがのみ更新されることです。このような単純なもののためにあなたはそれが/更新を表示するためにupdateまたはupdate_idletasksコマンドを使用することができ、遅延はWindows上で、その後長すぎるがあれば、ウィンドウは、この周囲に「無反応」

一つの方法は、複数置くことであるになることができますupdateまたはupdate_idletasksコマンドを使用するか、あるいはスレッドを使用します。

スレッドを使用する場合は、スプラッシュを独自のスレッドに入れるのではなく、実装するほうが簡単かもしれませんが、読み込みタスクを独自のスレッドに入れてワーカースレッドとGUIスレッドを分離しておく方が良いでしょう。よりスムーズなユーザーエクスペリエンスを提供する傾向があるためです。

関連する問題