通过一个新线程在Python中打开一个wx.Frame
问题描述:
我有一个框架作为启动屏幕存在,供用户在主程序启动之前作出选择。在用户做出选择之后,我需要将屏幕保持为一种闪屏,直到主程序完成加载。通过一个新线程在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()
的应用价值需要的,因为它包含允许回调主要程序在用户进行选择时继续。问题是启动屏幕只闪烁一毫秒,然后消失,不允许用户进行选择并阻止启动的其余部分。
任何想法?提前致谢!
答
你不需要线程。缺点是加载时会阻塞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()
完美 - 在尝试穿线之前,我曾想过类似的东西,但我只是没有把所有的东西放在一起......谢谢! – Fry 2009-08-04 23:12:54