1
0

test03.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import wx
  2. import os
  3. class MainFrame(wx.Frame):
  4. def __init__(self, parent, title):
  5. super().__init__(parent, title=title, size=(800, 600))
  6. # 创建菜单栏
  7. menubar = wx.MenuBar()
  8. menu1 = wx.Menu()
  9. menu1.Append(wx.ID_EXIT, "退出")
  10. menubar.Append(menu1, "菜单1")
  11. menu2 = wx.Menu()
  12. menu2.Append(wx.ID_ANY, "选项1")
  13. menu2.Append(wx.ID_ANY, "选项2")
  14. menubar.Append(menu2, "菜单2")
  15. menu3 = wx.Menu()
  16. menu3.Append(wx.ID_ANY, "设置")
  17. menubar.Append(menu3, "菜单3")
  18. menu4 = wx.Menu()
  19. menu4.Append(wx.ID_ANY, "关于")
  20. menubar.Append(menu4, "菜单4")
  21. self.SetMenuBar(menubar)
  22. # 创建主面板和布局
  23. main_panel = wx.Panel(self)
  24. main_sizer = wx.BoxSizer(wx.HORIZONTAL)
  25. # 创建左侧导航栏
  26. left_panel = wx.Panel(main_panel)
  27. left_sizer = wx.BoxSizer(wx.VERTICAL)
  28. self.navigation_list = wx.ListBox(left_panel, choices=["tab1", "tab2", "tab3", "tab4", "..."], style=wx.LB_SINGLE)
  29. left_sizer.Add(self.navigation_list, 1, wx.EXPAND | wx.ALL, 5)
  30. left_panel.SetSizer(left_sizer)
  31. main_sizer.Add(left_panel, 0, wx.EXPAND | wx.ALL, 5)
  32. # 创建右侧内容区域
  33. right_panel = wx.Panel(main_panel)
  34. right_sizer = wx.BoxSizer(wx.HORIZONTAL)
  35. # 创建 tab 对应的右侧内容面板
  36. self.tab_panels = {}
  37. for tab_name in ["tab1", "tab2", "tab3", "tab4", "..."]:
  38. tab_panel = wx.Panel(right_panel)
  39. tab_sizer = wx.BoxSizer(wx.VERTICAL)
  40. # 将 main_content 创建的内容添加到 tab 面板中
  41. content = self.main_content(tab_panel, tab_name)
  42. tab_sizer.Add(content, 1, wx.EXPAND | wx.ALL, 5)
  43. tab_panel.SetSizer(tab_sizer)
  44. self.tab_panels[tab_name] = tab_panel
  45. right_sizer.Add(tab_panel, 1, wx.EXPAND | wx.ALL, 5)
  46. tab_panel.Hide() # 初始隐藏所有面板
  47. right_panel.SetSizer(right_sizer)
  48. main_sizer.Add(right_panel, 1, wx.EXPAND | wx.ALL, 5)
  49. main_panel.SetSizer(main_sizer)
  50. # 绑定 ListBox 的选择事件
  51. self.navigation_list.Bind(wx.EVT_LISTBOX, self.on_tab_selected)
  52. self.Show(True)
  53. self.show_tab_content("tab1") # 初始显示 tab1 的内容
  54. def main_content(self, parent, tab_name):
  55. # 创建右侧内容区域
  56. right_panel = wx.Panel(parent)
  57. right_sizer = wx.BoxSizer(wx.HORIZONTAL)
  58. if tab_name == "tab1":
  59. # tab1 的内容
  60. left_content_panel = wx.Panel(right_panel)
  61. left_content_sizer = wx.BoxSizer(wx.VERTICAL)
  62. form_panel = wx.Panel(left_content_panel)
  63. form_sizer = wx.GridBagSizer(5, 5)
  64. form_sizer.Add(wx.StaticText(form_panel, label="设置1:"), pos=(0, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
  65. form_sizer.Add(wx.TextCtrl(form_panel), pos=(0, 1), flag=wx.EXPAND)
  66. form_sizer.Add(wx.StaticText(form_panel, label="设置2:"), pos=(1, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
  67. form_sizer.Add(wx.TextCtrl(form_panel), pos=(1, 1), flag=wx.EXPAND)
  68. form_panel.SetSizer(form_sizer)
  69. left_content_sizer.Add(form_panel, 0, wx.EXPAND | wx.ALL, 5)
  70. self.log_text = wx.TextCtrl(left_content_panel, style=wx.TE_MULTILINE | wx.TE_READONLY)
  71. left_content_sizer.Add(self.log_text, 1, wx.EXPAND | wx.ALL, 5)
  72. left_content_panel.SetSizer(left_content_sizer)
  73. right_sizer.Add(left_content_panel, 1, wx.EXPAND | wx.ALL, 5)
  74. image_panel = wx.Panel(right_panel)
  75. image_sizer = wx.BoxSizer(wx.HORIZONTAL)
  76. current_dir = os.path.dirname(os.path.abspath(__file__))
  77. image_path = os.path.join(current_dir, "../../assets/img.png")
  78. img = wx.Image(image_path, wx.BITMAP_TYPE_PNG).Scale(200, 200)
  79. self.image_bitmap = wx.StaticBitmap(image_panel, wx.ID_ANY, wx.Bitmap(img))
  80. image_sizer.Add(self.image_bitmap, 1, wx.CENTER)
  81. image_panel.SetSizer(image_sizer)
  82. right_sizer.Add(image_panel, 0, wx.CENTER | wx.ALL, 5)
  83. elif tab_name == "tab2":
  84. # tab2 的内容
  85. text = wx.StaticText(right_panel, label="这是 tab2 的特殊内容")
  86. right_sizer.Add(text, 1, wx.CENTER)
  87. elif tab_name == "tab3":
  88. # tab3 的内容
  89. button = wx.Button(right_panel, label="点击我")
  90. right_sizer.Add(button, 1, wx.CENTER)
  91. else:
  92. # 其他 tab 的内容
  93. text = wx.StaticText(right_panel, label=f"这是 {tab_name} 的默认内容")
  94. right_sizer.Add(text, 1, wx.CENTER)
  95. right_panel.SetSizer(right_sizer)
  96. return right_panel
  97. def on_tab_selected(self, event):
  98. selected_tab = self.navigation_list.GetStringSelection()
  99. self.show_tab_content(selected_tab)
  100. def show_tab_content(self, tab_name):
  101. for name, panel in self.tab_panels.items():
  102. if name == tab_name:
  103. panel.Show()
  104. else:
  105. panel.Hide()
  106. self.Layout() # 重新布局
  107. if __name__ == '__main__':
  108. app = wx.App()
  109. frame = MainFrame(None, "我的GUI布局")
  110. app.MainLoop()