6

Hiện tại tôi có màn hình giật gân. Tuy nhiên, nó không hoạt động như một màn hình giật gân thực sự - vì nó tạm dừng việc thực hiện phần còn lại của mã (thay vì cho phép chúng chạy trong nền).Làm cách nào để điều chỉnh màn hình giật gân hiện tại của tôi để cho phép các phần khác của mã của tôi chạy trong nền?

Đây là kiến ​​trúc hiện tại (giảm) của chương trình của tôi, với các bit quan trọng được hiển thị đầy đủ. Làm cách nào tôi có thể điều chỉnh màn hình giật gân hiện tại để thực sự cho phép phần còn lại của chương trình tải trong nền? Có thể trong python?

Cảm ơn!

import ... 
(many other imports) 
def ... 
def ... 
(many other definitions) 

class VFrams(wxFrame): 
    wx.Frame.__init__(self, parent, -1, _("Software"), 
         size=(1024, 768), style=wx.DEFAULT_FRAME_STYLE) 
    (a lot of code goes in here) 

class MySplashScreen(wx.SplashScreen): 
    def __init__(self, parent=None): 
     aBitmap = wx.Image(name=VarFiles["img_splash"]).ConvertToBitmap() 
     splashStyle = wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT 
     splashDuration = 5000 # ms 
     wx.SplashScreen.__init__(self, aBitmap, splashStyle, splashDuration, parent) 
     self.Bind(wx.EVT_CLOSE, self.CloseSplash) 
     wx.Yield() 
    def CloseSplash(self, evt): 
     self.Hide() 
     global frame 
     frame = VFrame(parent=None) 
     app.SetTopWindow(frame) 
     frame.Show(True) 
     evt.Skip() 

class MyApp(wx.App): 
    def OnInit(self): 
     MySplash = MySplashScreen() 
     MySplash.Show() 
     return True 

if __name__ == '__main__': 
    DEBUG = viz.addText('DEBUG:', viz.SCREEN) 
    DEBUG.setPosition(0, 0) 
    DEBUG.fontSize(16) 
    DEBUG.color(viz.BLACK) 
    Start_Mainvars()   
    Start_Config() 
    Start_Translation() 
    Start_DB() 
    Start_Themes() 
    Start_Gui() 
    Start_Get_Isos() 
    Start_Bars() 
    Start_Menus() 
    Start_Event_Handlers() 
    app = MyApp() 
    app.MainLoop() 

Cảm ơn bạn cho tất cả sự giúp đỡ, đây là cách tôi đã thay đổi mã (theo lời khuyên được cung cấp):

def show_splash(): 
    # create, show and return the splash screen 
    global splash 
    bitmap = wx.Image(name=VarFiles["img_splash"]).ConvertToBitmap() 
    splash = wx.SplashScreen(bitmap, wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_NO_TIMEOUT, 0, None, -1) 
    splash.Show() 
    return splash 

class MyApp(wx.App): 
    def OnInit(self): 
     global frame, splash 
     splash = show_splash() 
     Start_Config() 
     Start_Translation() 
     Start_DB() 
     Start_Themes() 
     Start_Gui() 
     Start_Get_Isos() 
     Start_Bars("GDP1POP1_20091224_gdp", "1 pork") 
     Start_Menus() 
     Start_Event_Handlers() 
     frame = VFrame(parent=None) 
     frame.Show(True) 
     splash.Destroy() 
     return True 

if __name__ == '__main__': 
    DEBUG = viz.addText('DEBUG:', viz.SCREEN) 
    DEBUG.setPosition(0, 0) 
    DEBUG.fontSize(16) 
    DEBUG.color(viz.BLACK) 
    Start_Mainvars() 
    app = MyApp() 
    app.MainLoop() 

Trả lời

12

Mã của bạn khá lộn xộn/phức tạp. Không cần phải ghi đè lên wx.SplashScreen và không có lý do gì khiến sự kiện đóng màn hình giật gân của bạn phải tạo ra cửa sổ ứng dụng chính. Đây là cách tôi làm màn hình giật gân.

import wx 

def show_splash(): 
    # create, show and return the splash screen 
    bitmap = wx.Bitmap('images/splash.png') 
    splash = wx.SplashScreen(bitmap, wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_NO_TIMEOUT, 0, None, -1) 
    splash.Show() 
    return splash 

def main(): 
    app = wx.PySimpleApp() 
    splash = show_splash() 

    # do processing/initialization here and create main window 
    frame = MyFrame(...) 
    frame.Show() 

    splash.Destroy() 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 

Chỉ cần tạo màn hình giật gân càng sớm càng tốt mà không hết thời gian chờ. Tiếp tục tải và tạo cửa sổ chính của ứng dụng của bạn. Sau đó phá hủy màn hình giật gân để nó biến mất. Hiển thị màn hình giật gân không ngăn việc xử lý khác xảy ra.

+0

Cảm ơn bạn rất nhiều. Tôi đang thử điều này. – relima

0

Bạn sẽ muốn sử dụng hai luồng: một cho màn hình giật gân, một cho bất kỳ mã nào khác mà bạn muốn thực thi. Cả hai luồng sẽ chạy cùng lúc, cung cấp kết quả bạn mong muốn.

+0

Có vấn đề: Tôi chưa bao giờ sử dụng đề tài. Tôi đã cố gắng để làm cho nó hoạt động, nhưng tôi không có đầu mối về cách làm cho nó có hiệu lực. Tôi đã mong được học hỏi từ những câu trả lời cho câu hỏi này. – relima

+0

Xem một số bài viết trực tuyến về chủ đề này. Tôi tìm thấy một trong những điều này có thể giúp: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python – Bernard

+0

Không có chủ đề là cần thiết ở đây. Màn hình giật gân không chặn thực thi nếu được sử dụng đúng cách. – FogleBird