2009-08-04 95 views
0

我有一個框架作爲啓動屏幕存在,供用戶在主程序啓動之前作出選擇。在用戶做出選擇之後,我需要將屏幕保持爲一種閃屏,直到主程序完成加載。通過一個新線程在Python中打開一個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

你不需要線程。缺點是加載時會阻塞splash窗口,但只有當您想更新它的內容(設置動畫效果)或者想要拖動它時纔會出現問題。例如,可以通過定期呼叫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 2009-08-04 23:12:54