| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- import wx
- import os
- class MainFrame(wx.Frame):
- def __init__(self, parent, title):
- super().__init__(parent, title=title, size=(800, 600))
- # 创建菜单栏
- menubar = wx.MenuBar()
- menu1 = wx.Menu()
- menu1.Append(wx.ID_EXIT, "退出")
- menubar.Append(menu1, "菜单1")
- menu2 = wx.Menu()
- menu2.Append(wx.ID_ANY, "选项1")
- menu2.Append(wx.ID_ANY, "选项2")
- menubar.Append(menu2, "菜单2")
- menu3 = wx.Menu()
- menu3.Append(wx.ID_ANY, "设置")
- menubar.Append(menu3, "菜单3")
- menu4 = wx.Menu()
- menu4.Append(wx.ID_ANY, "关于")
- menubar.Append(menu4, "菜单4")
- self.SetMenuBar(menubar)
- # 创建主面板和布局
- main_panel = wx.Panel(self)
- main_sizer = wx.BoxSizer(wx.HORIZONTAL)
- # 创建左侧导航栏
- left_panel = wx.Panel(main_panel)
- left_sizer = wx.BoxSizer(wx.VERTICAL)
- self.navigation_list = wx.ListBox(left_panel, choices=["tab1", "tab2", "tab3", "tab4", "..."], style=wx.LB_SINGLE)
- left_sizer.Add(self.navigation_list, 1, wx.EXPAND | wx.ALL, 5)
- left_panel.SetSizer(left_sizer)
- main_sizer.Add(left_panel, 0, wx.EXPAND | wx.ALL, 5)
- # 创建右侧内容区域
- right_panel = wx.Panel(main_panel)
- right_sizer = wx.BoxSizer(wx.HORIZONTAL)
- # 创建 tab 对应的右侧内容面板
- self.tab_panels = {}
- for tab_name in ["tab1", "tab2", "tab3", "tab4", "..."]:
- tab_panel = wx.Panel(right_panel)
- tab_sizer = wx.BoxSizer(wx.VERTICAL)
- # 将 main_content 创建的内容添加到 tab 面板中
- content = self.main_content(tab_panel, tab_name)
- tab_sizer.Add(content, 1, wx.EXPAND | wx.ALL, 5)
- tab_panel.SetSizer(tab_sizer)
- self.tab_panels[tab_name] = tab_panel
- right_sizer.Add(tab_panel, 1, wx.EXPAND | wx.ALL, 5)
- tab_panel.Hide() # 初始隐藏所有面板
- right_panel.SetSizer(right_sizer)
- main_sizer.Add(right_panel, 1, wx.EXPAND | wx.ALL, 5)
- main_panel.SetSizer(main_sizer)
- # 绑定 ListBox 的选择事件
- self.navigation_list.Bind(wx.EVT_LISTBOX, self.on_tab_selected)
- self.Show(True)
- self.show_tab_content("tab1") # 初始显示 tab1 的内容
- def main_content(self, parent, tab_name):
- # 创建右侧内容区域
- right_panel = wx.Panel(parent)
- right_sizer = wx.BoxSizer(wx.HORIZONTAL)
- if tab_name == "tab1":
- # tab1 的内容
- left_content_panel = wx.Panel(right_panel)
- left_content_sizer = wx.BoxSizer(wx.VERTICAL)
- form_panel = wx.Panel(left_content_panel)
- form_sizer = wx.GridBagSizer(5, 5)
- form_sizer.Add(wx.StaticText(form_panel, label="设置1:"), pos=(0, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
- form_sizer.Add(wx.TextCtrl(form_panel), pos=(0, 1), flag=wx.EXPAND)
- form_sizer.Add(wx.StaticText(form_panel, label="设置2:"), pos=(1, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
- form_sizer.Add(wx.TextCtrl(form_panel), pos=(1, 1), flag=wx.EXPAND)
- form_panel.SetSizer(form_sizer)
- left_content_sizer.Add(form_panel, 0, wx.EXPAND | wx.ALL, 5)
- self.log_text = wx.TextCtrl(left_content_panel, style=wx.TE_MULTILINE | wx.TE_READONLY)
- left_content_sizer.Add(self.log_text, 1, wx.EXPAND | wx.ALL, 5)
- left_content_panel.SetSizer(left_content_sizer)
- right_sizer.Add(left_content_panel, 1, wx.EXPAND | wx.ALL, 5)
- image_panel = wx.Panel(right_panel)
- image_sizer = wx.BoxSizer(wx.HORIZONTAL)
- current_dir = os.path.dirname(os.path.abspath(__file__))
- image_path = os.path.join(current_dir, "../../assets/img.png")
- img = wx.Image(image_path, wx.BITMAP_TYPE_PNG).Scale(200, 200)
- self.image_bitmap = wx.StaticBitmap(image_panel, wx.ID_ANY, wx.Bitmap(img))
- image_sizer.Add(self.image_bitmap, 1, wx.CENTER)
- image_panel.SetSizer(image_sizer)
- right_sizer.Add(image_panel, 0, wx.CENTER | wx.ALL, 5)
- elif tab_name == "tab2":
- # tab2 的内容
- text = wx.StaticText(right_panel, label="这是 tab2 的特殊内容")
- right_sizer.Add(text, 1, wx.CENTER)
- elif tab_name == "tab3":
- # tab3 的内容
- button = wx.Button(right_panel, label="点击我")
- right_sizer.Add(button, 1, wx.CENTER)
- else:
- # 其他 tab 的内容
- text = wx.StaticText(right_panel, label=f"这是 {tab_name} 的默认内容")
- right_sizer.Add(text, 1, wx.CENTER)
- right_panel.SetSizer(right_sizer)
- return right_panel
- def on_tab_selected(self, event):
- selected_tab = self.navigation_list.GetStringSelection()
- self.show_tab_content(selected_tab)
- def show_tab_content(self, tab_name):
- for name, panel in self.tab_panels.items():
- if name == tab_name:
- panel.Show()
- else:
- panel.Hide()
- self.Layout() # 重新布局
- if __name__ == '__main__':
- app = wx.App()
- frame = MainFrame(None, "我的GUI布局")
- app.MainLoop()
|