2016-12-16 16 views
0

に私は私のアプリは、このwxPythonのスプラッシュスクリーンを搭載

import wx, wx.lib.agw.advancedsplash as AS, sys, os, matplotlib 
matplotlib.use('WXAgg') 
from threading import Thread 

#some function definitions 

class application(wx.Frame): 
    #the UI code here 

class mod(Thread): 
    #blah blah 

if __name__ == "__main__": 
    app = wx.App(redirect=True, filename="logfile.txt") 

    image = wx.Image("splash.png") 
    image.ConvertAlphaToMask() 
    bitmap = wx.BitmapFromImage(image) 
    splash = AS.AdvancedSplash(None, bitmap=bitmap, timeout=4000, agwStyle=AS.AS_TIMEOUT | AS.AS_CENTER_ON_SCREEN) 

    import time 
    import telnetlib 
    import ownmodule 
    import matplotlib.pyplot as plt 
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 
    from matplotlib.backends.backend_wx import NavigationToolbar2Wx as NavigationToolbar 
    from matplotlib.figure import Figure 

    frame = application(None, -1, "AdvancedSplash Test") 
    app.MainLoop() 

ような何かを行うことによってインポートされている間、できるだけ早くスプラッシュ画面を表示しようとしているが、私が得る唯一のものは灰色で形状ですイメージを選択すると、UIがロードされ、実際のイメージがグレーの形で一瞬でいっぱいになり、タイムアウトになります。スプラッシュ画面が表示されますが、メインフレームが表示されるまで画像はロードされません。

何が起こるべきかは、形状だけでなく画像を直ちに表示することです。誰かが何が起こっているのか、それを解決する方法を知っていますか?

また、スプラッシュ画面をタイムアウトしないようにしても、メインUIが表示される直前に破棄するとよいでしょう。

答えて

1

MainLoopは実行されていないため、ビットマップを描画するスプラッシュスクリーンのEVT_PAINTイベントを含め、イベントがウィンドウに配信されることはありません。

wx.Yield関数は一時的なイベントループを実行するので、スプラッシュスクリーンを作成した後にその呼び出しを追加すると、それ自体がペイントされ、必要に応じて十分に機能します。 1つの欠点は、別の起動コードを実行している間に別のペイントイベントが必要な場合、別の起動コードを実行しない限り発生しないことです。また、他の種類のイベントが発生する可能性があります。再入可能性の問題を心配する。

もう1つの方法は、MainLoopにジャンプし、起動コードの残りの部分をCallAfterまたは別のスレッドで実行するか、アプリケーションに合ったものを実行することです。

+0

'splash = AS.AdvancedSplash ...'の直後に 'wx.Yield()'を追加します。動作は同じで、何も解決しません。ですから、 'MainLoop'は' class application(wx.Frame) 'を意味していますか?スタートアップコードは何ですか? – Javier

関連する問題