2009-08-04 2 views
0

주 프로그램이 시작되기 전에 사용자가 선택을 시작할 수있는 시작 화면으로 프레임이 있습니다. 사용자가 선택을 한 후에는 주 프로그램이 다시로드를 완료 할 때까지 일종의 스플래시 화면을 유지하기 위해 화면이 필요합니다.새로운 스레드를 통해 파이썬에서 wx.Frame 열기

내가 스레드 응용 프로그램을 작성하고 시작하여 이런 짓을했습니다 프레임을 시작

class App(wx.App): 
    ''' 
    Creates the main frame and displays it 
    Returns true if successful 
    ''' 
    def OnInit(self): 
     try: 
      ''' 
      Initialization 
      ''' 
      self.newFile = False 
      self.fileName = "" 

      self.splashThread = Splash.SplashThread(logging, self) 
      self.splashThread.start() 
      #...More to the class 

을 :

앱 값이 그것으로 필요
class SplashThread(threading.Thread): 
    def __init__(self, logger, app): 
     threading.Thread.__init__(self) 
     self.logger = logger 
     self.app = app 

    def run(self): 
     frame = Frame(self.logger, self.app) 
     frame.Show() 

은을 수있는 콜백을 포함 주 프로그램은 사용자가 선택하면 계속 진행됩니다. 문제는 시작 화면이 밀리 초 동안 만 깜박이고 사용자가 선택을하고 나머지 시작을 차단하지 못하게하는 것입니다.

아이디어가 있으십니까? 미리 감사드립니다!

답변

0

스레드를 필요로하지 않습니다. 단점은로드하는 동안 스플래시 창이 차단되지만 내용을 업데이트 (애니메이션 적용)하거나 드래그 할 수있게하려는 경우에만 문제가된다는 점입니다. 예를 들어 wx.SafeYield을 주기적으로 호출하여 해결할 수있는 문제입니다.

import time 
import wx 


class Loader(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(sizer) 
     self.btn1 = wx.Button(self, label="Option 1") 
     self.btn2 = wx.Button(self, label="Option 2") 
     sizer.Add(self.btn1, flag=wx.EXPAND) 
     sizer.Add(self.btn2, flag=wx.EXPAND) 
     self.btn1.Bind(wx.EVT_BUTTON, self.OnOption1) 
     self.btn2.Bind(
      wx.EVT_BUTTON, lambda e: wx.MessageBox("There is no option 2") 
     ) 

    def OnOption1(self, event): 
     self.btn1.Hide() 
     self.btn2.Hide() 
     self.Sizer.Add(
      wx.StaticText(self, label="Loading Option 1..."), 
      1, wx.ALL | wx.EXPAND, 15 
     ) 
     self.Layout() 
     self.Update() 
     AppFrame(self).Show() 

class AppFrame(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent) 
     time.sleep(3) 
     parent.Hide() 

     # the top window (Loader) is hidden so the app needs to be told to exit 
     # when this window is closed 
     self.Bind(wx.EVT_CLOSE, lambda e: wx.GetApp().ExitMainLoop()) 


app = wx.PySimpleApp() 
app.TopWindow = Loader() 
app.TopWindow.Show() 
app.MainLoop() 
+0

완벽한 - 내가 스레딩을 시도하기 전에 이와 비슷한 것을 생각했지만 모든 조각을 함께 묶어 두지 않았습니다 ... 감사합니다! – Fry

관련 문제