4 ページ (またはそれ以上) の wxPython を使用して GUI フローを作成しています。私がアプローチした方法は、各クラスが独自の静的(背景)および動的画像/コンテンツを定義する4つ(またはそれ以上)のクラスを作成することです。私のアプリケーションでは、必要なインスタンス クラスをプログラムで作成し、そのページでイベントをキャプチャします。トリガーされたイベントに基づいて、登録されたハンドラーは現在のクラスを破棄し、他のクラス (ページ) に切り替えます。したがって、私のコードは実際に X クラスを作成し、各クラスには背景/前景のコンテンツ/画像を設定する独自のメソッドがあります。
def OnEraseBackground(self, evt):
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
bmp = wx.Bitmap(self.image)
dc.DrawBitmap(bmp, 0, 0)
def buttonClick(self, evt):
parent = self.frame
self.Destroy()
DispatchState(parent, "admin1.png", 1)
問題は、2 ページ目が画面にまったく表示されないことです。
以下は私の完全なコードです。アプリケーション フレームのパネルに画面を作成する 2 つのクラス (MainPanel、SecondPanel) を作成したことに注意してください。その後、イベントを待ちます。目的のイベントを取得したら、現在のクラスを削除し、新しいクラスのインスタンスを作成します。
import wx
########################################################################
class SecondPanel(wx.Panel):
def __init__(self,parent, image, state):
wx.Panel.__init__(self, parent=parent)
self.state = state
self.image = image
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.frame = parent
sizer = wx.BoxSizer(wx.VERTICAL)
hSizer = wx.BoxSizer(wx.HORIZONTAL)
panel=wx.Panel(self, -1)
self.buttonOne=wx.Image("image1.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
self.button=wx.BitmapButton(self, -1, self.buttonOne, pos=(100,50))
self.button.Bind(wx.EVT_LEFT_DCLICK, self.buttonClick)
sizer.Add(self.button, 0, wx.ALL, 5)
hSizer.Add((1,1), 1, wx.EXPAND)
hSizer.Add(sizer, 0, wx.TOP, 100)
hSizer.Add((1,1), 0, wx.ALL, 75)
self.SetSizer(hSizer)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
def buttonClick(self, evt):
parent = self.frame
self.Destroy()
DispatchState(parent, "admin0.png", 0)
def OnEraseBackground(self, evt):
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
bmp = wx.Bitmap(self.image)
dc.DrawBitmap(bmp, 0, 0)
class MainPanel(wx.Panel):
def __init__(self,parent, image, state):
wx.Panel.__init__(self, parent=parent)
self.state = state
self.image = image
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.frame = parent
sizer = wx.BoxSizer(wx.VERTICAL)
hSizer = wx.BoxSizer(wx.HORIZONTAL)
panel=wx.Panel(self, -1)
self.buttonOne=wx.Image("image0.bmp", wx.BITMAP_TYPE_BMP).ConvertToBitmap()
self.button=wx.BitmapButton(self, -1, self.buttonOne, pos=(100,50))
self.button.Bind(wx.EVT_LEFT_DCLICK, self.buttonClick)
sizer.Add(self.button, 0, wx.ALL, 5)
hSizer.Add((1,1), 1, wx.EXPAND)
hSizer.Add(sizer, 0, wx.TOP, 100)
hSizer.Add((1,1), 0, wx.ALL, 75)
self.SetSizer(hSizer)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
def buttonClick(self, evt):
parent = self.frame
self.Destroy()
DispatchState(parent, "admin1.png", 1)
def OnEraseBackground(self, evt):
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
bmp = wx.Bitmap(self.image)
dc.DrawBitmap(bmp, 0, 0)
class Main(wx.App):
def __init__(self, redirect=False, filename=None):
wx.App.__init__(self, redirect, filename)
self.frame = wx.Frame(None, size=(800, 480))
self.state = 0
self.image = 'admin0.png'
def DispatchState(frame, image, state):
if state == 0 :
print image
print state
MainPanel(frame, image, state)
if state == 1 :
print image
print state
SecondPanel(frame, image, state)
frame.Show()
if __name__ == "__main__":
app = Main()
DispatchState(app.frame,app.image, app.state)
app.MainLoop()
このアプローチを選択した理由は、任意の画面/ページに切り替えることができるように、ある状態から別の状態に簡単に切り替えることができるためです。明日、さらに多くのページを動的に追加/削除する必要がある場合、簡単に実行できます。ページ (クラス) を作成し、その状態を DispatchState() グローバル メソッドに追加する必要があります。
しかし、私にとって現在、2番目の画面はまったくレンダリングされません。また、私のアプローチについてコメントしてください - これを達成するためのより良い方法はありますか?