演示效果
實現panel切換思路
1.創建所有在某個區域需要切換面板對象,設置為None
self.panel_Celan1 = None self.panel_Celan2 = None self.panel_Celan3 = None self.panel_Celan1_1 =None
2.我們要實現切換,就是刪除在這個位置的其他panel,然后創建顯示你想要顯示的panel。
我們以側欄第二個按鈕為例:
我們想要顯示self.panel_Celan2,而在這個位置可能存在self.panel_Celan1,self.panel_Celan3,self.panel_Celan1_1,
對於self.panel_Celan1,self.panel_Celan3,self.panel_Celan1_1這些panel,全部需要判斷,如果存在,則刪除,如果不存在,我們就不需要操作
而我們需要切換顯示的panel只需要在不存在的時候創建即可,因為你一直點擊同一個按鈕,已經創建panel,不需要再次創建panel。
if event.GetEventObject()==self._caidan2: # 如果需要顯示的地方存在其他面板,刪除 if self.panel_Celan1: self.panel_Celan1.Destroy() if self.panel_Celan1_1: self.panel_Celan1_1.Destroy() if self.panel_Celan3: self.panel_Celan3.Destroy() if not self.panel_Celan2 : self.panel_Celan2 = wx.Panel(self, pos=(200, 0), size=(700, 700))
源碼
#!/usr/bin/env python ''' 靜態文本、可控文本、對話框、GetApp() ''' import wx,time ID_EXIT=200 ID_ABOUT=201 class Frame(wx.Frame): #2 wx.Frame子類 def __init__(self,parent = None,id = -1,title ='系統管理界面'): wx.Frame.__init__(self,parent,id,title,size=(900,600)) self.panel_Celan1 = None self.panel_Celan2 = None self.panel_Celan3 = None self.panel_Celan1_1 =None self.setupStatusBar() self.InitCelan() self.InitButton() #初始化狀態欄 def setupStatusBar(self): # 狀態欄 sb = self.CreateStatusBar(2) # 2代表將狀態欄分為兩個 self.SetStatusWidths([-1, -2]) # 比例為1:2 self.SetStatusText("Ready", 0) # 0代表第一個欄,Ready為內容 # timmer self.timer = wx.PyTimer(self.Notify) self.timer.Start(1000, wx.TIMER_CONTINUOUS) self.Notify() # 實時顯示時間 def Notify(self): t = time.localtime(time.time()) st = time.strftime('%Y-%m-%d %H:%M:%S', t) self.SetStatusText(st, 1) # 這里的1代表將時間放入狀態欄的第二部分上 # 初始化登陸 def InitButton(self): self.panel_Celan1 = wx.Panel(self, pos=(400, 150), size=(300, 300)) wx.StaticText(self.panel_Celan1,label="Username",pos=(20,20)) wx.StaticText(self.panel_Celan1, label="Password", pos=(20, 50)) self._username=wx.TextCtrl(self.panel_Celan1,pos=(110,15)) self._passwd = wx.TextCtrl(self.panel_Celan1, pos=(110, 45),style=wx.TE_PASSWORD) self._submit_btn=wx.Button(self.panel_Celan1,label=u'提交',pos=(100,100),size=(50,30)) self.panel_Celan1.Bind(wx.EVT_BUTTON,self.Onclick,self._submit_btn) #處理登陸事件 def Onclick(self,event): global denglu_flag if event.GetEventObject()==self._submit_btn: user = self.GetUsername() passwd = self.GetPasswd() print(user+":"+passwd) if(user == "wenli"and passwd == "123456"): denglu_flag=True self.panel_Celan1.Destroy() self.panel_Celan1_1 =wx.Panel(self, pos=(400, 150), size=(300, 300)) wx.StaticText(self.panel_Celan1_1, label="歡迎登陸", pos=(130, 150)) def GetUsername(self): return self._username.GetValue() def GetPasswd(self): return self._passwd.GetValue() #初始化側欄 def InitCelan(self): self.panel_Celan = wx.Panel(self, pos=(0, 0), size=(200, 800)) # 創建側欄畫板 self._background = wx.Image("background.jpg",type = wx.BITMAP_TYPE_ANY,) self._background = self._background.Rescale(200,150) #改變圖像大小 wx.StaticBitmap(self.panel_Celan,-1,wx.BitmapFromImage( self._background)) #顯示圖像 self._caidan1 = wx.Button(self.panel_Celan, label=u'用戶信息', pos=(0, 150), size=(200, 30)) self.panel_Celan.Bind(wx.EVT_BUTTON, self.Onclick_Ce, self._caidan1) self._caidan2 = wx.Button(self.panel_Celan, label=u'圖書館大廳', pos=(0, 180), size=(200, 30)) self.panel_Celan.Bind(wx.EVT_BUTTON, self.Onclick_Ce, self._caidan2) self._caidan3 = wx.Button(self.panel_Celan, label=u'公告', pos=(0, 210), size=(200, 30)) self.panel_Celan.Bind(wx.EVT_BUTTON, self.Onclick_Ce, self._caidan3) #處理側欄的點擊事件 def Onclick_Ce(self,event): global denglu_flag if event.GetEventObject() == self._caidan1: # 如果需要顯示的地方存在其他面板,刪除 if self.panel_Celan2: self.panel_Celan2.Destroy() if self.panel_Celan3: self.panel_Celan3.Destroy() if not self.panel_Celan1 : if(denglu_flag == False): self.InitButton() else: if not self.panel_Celan1_1: self.panel_Celan1_1 = wx.Panel(self, pos=(400, 150), size=(300, 300)) wx.StaticText(self.panel_Celan1_1, label="歡迎登陸", pos=(130, 150)) if event.GetEventObject()==self._caidan2: # 如果需要顯示的地方存在其他面板,刪除 if self.panel_Celan1: self.panel_Celan1.Destroy() if self.panel_Celan1_1: self.panel_Celan1_1.Destroy() if self.panel_Celan3: self.panel_Celan3.Destroy() if not self.panel_Celan2 : self.panel_Celan2 = wx.Panel(self, pos=(200, 0), size=(700, 700)) if event.GetEventObject() == self._caidan3: if self.panel_Celan1: self.panel_Celan1.Destroy() if self.panel_Celan1_1: self.panel_Celan1_1.Destroy() if self.panel_Celan2 : self.panel_Celan2.Destroy() if not self.panel_Celan3: self.panel_Celan3 = wx.Panel(self, pos=(400, 150), size=(300, 300)) wx.StaticText(self.panel_Celan3, label="公告", pos=(130, 150)) class App(wx.App): #5 wx.App子類 def __init__(self): #如果要重寫__init__,必須調用wx.App的__init__,否則OnInit方法不會被調用 wx.App.__init__(self) def OnInit(self): self.frame=Frame() self.SetTopWindow(self.frame) self.frame.Show() return True if __name__=="__main__": denglu_flag = False app = App() app.MainLoop()