2009-08-04 19 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

これにスレッドは必要ありません。欠点は、読み込み中にスプラッシュウィンドウがブロックされることですが、内容を更新(アニメーション化)したい場合、またはドラッグできるようにする場合にのみ問題になります。たとえば、定期的に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