2016-07-30 4 views
1

정상적으로로드하려면 몇 초가 걸리는 메인 tkinter 창이 있습니다. 이 때문에 메인 클래스의 초기화 메소드가 끝날 때까지 보여주는 스플래시 화면을 갖고 싶고 메인 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() 

편집 : 그것은 .withdraw() 등을 사용하여로드가 완료 될 때까지 내가 메인 윈도우를 사용할 수 있습니다. deiconify() 메소드. 그러나 내 문제는이 두 메서드 호출 사이의 기간에 시작 화면을 실행하는 방법을 찾을 수 없다는 것입니다.

+0

아마도 이것은 XY 문제입니다. 기본 창에로드되는 데 몇 분이 걸리는 이유는 무엇입니까? 로드 시간 등을 일으키는'__init__' 함수를 실행하고 있습니까? – Pythonista

답변

2

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_idletasks 명령을 사용할 수 있습니다 것이 지연이 창에 윈도우가 "응답"이 될 수 후 너무 긴하지만 경우,/업데이 트를 보여이 주위

하나의 방법은 여러 넣어하는 것입니다 update 또는 로딩 루틴 전반에 걸쳐 update_idletasks 명령을 사용하거나 또는 스레딩을 사용하십시오.

그러나 스레딩을 사용하는 경우 자체 스레드에 스플래시를 넣는 대신 (아마도 구현하기가 더 쉽습니다) 작업 스레드와 GUI 스레드를 별도로 유지하면서 자체 스레드에로드 작업을 더 효과적으로 제공하는 것이 좋습니다. 이것은보다 부드러운 사용자 경험을 제공하는 경향이 있기 때문입니다.

관련 문제