我正在使用具有 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 个类(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() 全局方法中。
但对我来说,目前第二个屏幕根本没有被渲染。另外请评论我的方法 - 有没有更好的方法可以实现这一点 - 我应该注意什么或我的代码中有什么错误?