原文: http://zetcode.com/wxpython/skeletons/

在本节中,我们将创建一些应用框架。 我们的脚本将制定出接口,但不会实现该功能。 目的是展示如何在 wxPython 中完成几个众所周知的 GUI 界面。

文件管理器

文件监视器是文件管理器的骨架。 它复制了 Krusader 的监视,Krusader 是 Unix 系统上可用的文件管理器。 如果我们双击拆分器小部件,它将把文件监视器分成宽度相同的两个部分。 如果我们调整主窗口的大小,也会发生同样的情况。

file_hunter.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode wxPython tutorial
  5. This program creates a skeleton
  6. of a file manager UI.
  7. author: Jan Bodnar
  8. website: zetcode.com
  9. last edited: May 2018
  10. """
  11. import wx
  12. import os
  13. import time
  14. ID_BUTTON=100
  15. ID_EXIT=200
  16. ID_SPLITTER=300
  17. class MyListCtrl(wx.ListCtrl):
  18. def __init__(self, parent):
  19. wx.ListCtrl.__init__(self, parent, style=wx.LC_REPORT)
  20. images = ['images/empty.png', 'images/folder.png', 'images/source-py.png',
  21. 'images/image.png', 'images/pdf.png', 'images/up16.png']
  22. self.InsertColumn(0, 'Name')
  23. self.InsertColumn(1, 'Ext')
  24. self.InsertColumn(2, 'Size', wx.LIST_FORMAT_RIGHT)
  25. self.InsertColumn(3, 'Modified')
  26. self.SetColumnWidth(0, 220)
  27. self.SetColumnWidth(1, 70)
  28. self.SetColumnWidth(2, 100)
  29. self.SetColumnWidth(3, 420)
  30. self.il = wx.ImageList(16, 16)
  31. for i in images:
  32. self.il.Add(wx.Bitmap(i))
  33. self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
  34. j = 1
  35. self.InsertItem(0, '..')
  36. self.SetItemImage(0, 5)
  37. files = os.listdir('.')
  38. for i in files:
  39. (name, ext) = os.path.splitext(i)
  40. ex = ext[1:]
  41. size = os.path.getsize(i)
  42. sec = os.path.getmtime(i)
  43. self.InsertItem(j, name)
  44. self.SetItem(j, 1, ex)
  45. self.SetItem(j, 2, str(size) + ' B')
  46. self.SetItem(j, 3, time.strftime('%Y-%m-%d %H:%M', time.localtime(sec)))
  47. if os.path.isdir(i):
  48. self.SetItemImage(j, 1)
  49. elif ex == 'py':
  50. self.SetItemImage(j, 2)
  51. elif ex == 'jpg':
  52. self.SetItemImage(j, 3)
  53. elif ex == 'pdf':
  54. self.SetItemImage(j, 4)
  55. else:
  56. self.SetItemImage(j, 0)
  57. if (j % 2) == 0:
  58. self.SetItemBackgroundColour(j, '#e6f1f5')
  59. j = j + 1
  60. class Example(wx.Frame):
  61. def __init__(self, *args, **kw):
  62. super(Example, self).__init__(*args, **kw)
  63. self.InitUI()
  64. def InitUI(self):
  65. self.splitter = wx.SplitterWindow(self, ID_SPLITTER, style=wx.SP_BORDER)
  66. self.splitter.SetMinimumPaneSize(50)
  67. p1 = MyListCtrl(self.splitter)
  68. p2 = MyListCtrl(self.splitter)
  69. self.splitter.SplitVertically(p1, p2)
  70. self.Bind(wx.EVT_SIZE, self.OnSize)
  71. self.Bind(wx.EVT_SPLITTER_DCLICK, self.OnDoubleClick, id=ID_SPLITTER)
  72. filemenu= wx.Menu()
  73. filemenu.Append(ID_EXIT, "E&xit"," Terminate the program")
  74. editmenu = wx.Menu()
  75. netmenu = wx.Menu()
  76. showmenu = wx.Menu()
  77. configmenu = wx.Menu()
  78. helpmenu = wx.Menu()
  79. menuBar = wx.MenuBar()
  80. menuBar.Append(filemenu, "&File")
  81. menuBar.Append(editmenu, "&Edit")
  82. menuBar.Append(netmenu, "&Net")
  83. menuBar.Append(showmenu, "&Show")
  84. menuBar.Append(configmenu, "&Config")
  85. menuBar.Append(helpmenu, "&Help")
  86. self.SetMenuBar(menuBar)
  87. self.Bind(wx.EVT_MENU, self.OnExit, id=ID_EXIT)
  88. tb = self.CreateToolBar( wx.TB_HORIZONTAL | wx.NO_BORDER |
  89. wx.TB_FLAT)
  90. tb.AddTool(10, 'Previous', wx.Bitmap('images/previous.png'), shortHelp='Previous')
  91. tb.AddTool(20, 'Up', wx.Bitmap('images/up.png'), shortHelp='Up one directory')
  92. tb.AddTool(30, 'Home', wx.Bitmap('images/home.png'), shortHelp='Home')
  93. tb.AddTool(40, 'Refresh', wx.Bitmap('images/refresh.png'), shortHelp='Refresh')
  94. tb.AddSeparator()
  95. tb.AddTool(50, 'Edit text', wx.Bitmap('images/textedit.png'), shortHelp='Edit text')
  96. tb.AddTool(60, 'Terminal', wx.Bitmap('images/terminal.png'), shortHelp='Terminal')
  97. tb.AddSeparator()
  98. tb.AddTool(70, 'Help', wx.Bitmap('images/help.png'), shortHelp='Show help')
  99. tb.Realize()
  100. self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
  101. button1 = wx.Button(self, ID_BUTTON + 1, "F3 View")
  102. button2 = wx.Button(self, ID_BUTTON + 2, "F4 Edit")
  103. button3 = wx.Button(self, ID_BUTTON + 3, "F5 Copy")
  104. button4 = wx.Button(self, ID_BUTTON + 4, "F6 Move")
  105. button5 = wx.Button(self, ID_BUTTON + 5, "F7 Mkdir")
  106. button6 = wx.Button(self, ID_BUTTON + 6, "F8 Delete")
  107. button7 = wx.Button(self, ID_BUTTON + 7, "F9 Rename")
  108. button8 = wx.Button(self, ID_EXIT, "F10 Quit")
  109. self.sizer2.Add(button1, 1, wx.EXPAND)
  110. self.sizer2.Add(button2, 1, wx.EXPAND)
  111. self.sizer2.Add(button3, 1, wx.EXPAND)
  112. self.sizer2.Add(button4, 1, wx.EXPAND)
  113. self.sizer2.Add(button5, 1, wx.EXPAND)
  114. self.sizer2.Add(button6, 1, wx.EXPAND)
  115. self.sizer2.Add(button7, 1, wx.EXPAND)
  116. self.sizer2.Add(button8, 1, wx.EXPAND)
  117. self.Bind(wx.EVT_BUTTON, self.OnExit, id=ID_EXIT)
  118. self.sizer = wx.BoxSizer(wx.VERTICAL)
  119. self.sizer.Add(self.splitter,1,wx.EXPAND)
  120. self.sizer.Add(self.sizer2,0,wx.EXPAND)
  121. self.SetSizer(self.sizer)
  122. # size = wx.DisplaySize()
  123. # self.SetSize(size)
  124. sb = self.CreateStatusBar()
  125. sb.SetStatusText(os.getcwd())
  126. self.SetTitle("File Hunter")
  127. self.Center()
  128. def OnExit(self, e):
  129. self.Close(True)
  130. def OnSize(self, e):
  131. size = self.GetSize()
  132. self.splitter.SetSashPosition(size.x / 2)
  133. e.Skip()
  134. def OnDoubleClick(self, e):
  135. size = self.GetSize()
  136. self.splitter.SetSashPosition(size.x / 2)
  137. def main():
  138. app = wx.App()
  139. ex = Example(None)
  140. ex.Show()
  141. app.MainLoop()
  142. if __name__ == '__main__':
  143. main()

该示例创建一个两面板文件管理器的 UI。

  1. class MyListCtrl(wx.ListCtrl):
  2. def __init__(self, parent):
  3. wx.ListCtrl.__init__(self, parent, style=wx.LC_REPORT)

应用的主要区域被wx.ListCtrl小部件占据。

  1. self.il = wx.ImageList(16, 16)
  2. for i in images:
  3. self.il.Add(wx.Bitmap(i))
  4. self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)

列表控件包含一个列表图像,用于指示文件类型。

  1. files = os.listdir('.')
  2. for i in files:
  3. (name, ext) = os.path.splitext(i)
  4. ex = ext[1:]
  5. size = os.path.getsize(i)
  6. sec = os.path.getmtime(i)
  7. ...

我们获取当前工作目录的内容,并确定文件扩展名,大小和最后修改时间。

  1. if os.path.isdir(i):
  2. self.SetItemImage(j, 1)
  3. elif ex == 'py':
  4. self.SetItemImage(j, 2)
  5. elif ex == 'jpg':
  6. self.SetItemImage(j, 3)
  7. elif ex == 'pdf':
  8. self.SetItemImage(j, 4)
  9. else:
  10. self.SetItemImage(j, 0)

根据文件扩展名选择文件的图像。

  1. self.splitter = wx.SplitterWindow(self, ID_SPLITTER, style=wx.SP_BORDER)
  2. self.splitter.SetMinimumPaneSize(50)
  3. p1 = MyListCtrl(self.splitter)
  4. p2 = MyListCtrl(self.splitter)
  5. self.splitter.SplitVertically(p1, p2)

我们有两个列表控件,这些控件由拆分器小部件垂直拆分。

  1. menuBar = wx.MenuBar()
  2. menuBar.Append(filemenu, "&File")
  3. menuBar.Append(editmenu, "&Edit")
  4. ...

我们有一个菜单栏。

  1. tb = self.CreateToolBar( wx.TB_HORIZONTAL | wx.NO_BORDER |
  2. wx.TB_FLAT)
  3. tb.AddTool(10, 'Previous', wx.Bitmap('images/previous.png'), shortHelp='Previous')
  4. tb.AddTool(20, 'Up', wx.Bitmap('images/up.png'), shortHelp='Up one directory')
  5. ...

我们有一个工具栏。

  1. self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
  2. button1 = wx.Button(self, ID_BUTTON + 1, "F3 View")
  3. button2 = wx.Button(self, ID_BUTTON + 2, "F4 Edit")
  4. button3 = wx.Button(self, ID_BUTTON + 3, "F5 Copy")
  5. button4 = wx.Button(self, ID_BUTTON + 4, "F6 Move")
  6. ...

八个按钮放置在水平大小调整器中,该大小调整器添加到窗口底部。

wxPython 中的应用框架 - 图1

图:文件管理器

电子表格

下面的示例创建电子表格应用的 UI。

spreadsheet.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode wxPython tutorial
  5. This program creates a SpreadSheet UI.
  6. author: Jan Bodnar
  7. website: zetcode.com
  8. last edited: May 2018
  9. """
  10. from wx.lib import sheet
  11. import wx
  12. class MySheet(wx.grid.Grid):
  13. def __init__(self, *args, **kw):
  14. super(MySheet, self).__init__(*args, **kw)
  15. self.InitUI()
  16. def InitUI(self):
  17. nOfRows = 55
  18. nOfCols = 25
  19. self.row = self.col = 0
  20. self.CreateGrid(nOfRows, nOfCols)
  21. self.SetColLabelSize(20)
  22. self.SetRowLabelSize(50)
  23. self.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnGridSelectCell)
  24. for i in range(nOfRows):
  25. self.SetRowSize(i, 20)
  26. for i in range(nOfCols):
  27. self.SetColSize(i, 75)
  28. def OnGridSelectCell(self, e):
  29. self.row, self.col = e.GetRow(), e.GetCol()
  30. control = self.GetParent().GetParent().position
  31. value = self.GetColLabelValue(self.col) + self.GetRowLabelValue(self.row)
  32. control.SetValue(value)
  33. e.Skip()
  34. class Example(wx.Frame):
  35. def __init__(self, *args, **kw):
  36. super(Example, self).__init__(*args, **kw)
  37. self.InitUI()
  38. def InitUI(self):
  39. fonts = ['Times New Roman', 'Times', 'Courier', 'Courier New', 'Helvetica',
  40. 'Sans', 'verdana', 'utkal', 'aakar', 'Arial']
  41. font_sizes = ['10', '11', '12', '14', '16']
  42. box = wx.BoxSizer(wx.VERTICAL)
  43. menuBar = wx.MenuBar()
  44. menu1 = wx.Menu()
  45. menuBar.Append(menu1, '&File')
  46. menu2 = wx.Menu()
  47. menuBar.Append(menu2, '&Edit')
  48. menu3 = wx.Menu()
  49. menuBar.Append(menu3, '&Edit')
  50. menu4 = wx.Menu()
  51. menuBar.Append(menu4, '&Insert')
  52. menu5 = wx.Menu()
  53. menuBar.Append(menu5, 'F&ormat')
  54. menu6 = wx.Menu()
  55. menuBar.Append(menu6, '&Tools')
  56. menu7 = wx.Menu()
  57. menuBar.Append(menu7, '&Data')
  58. menu8 = wx.Menu()
  59. menuBar.Append(menu8, '&Help')
  60. self.SetMenuBar(menuBar)
  61. toolbar1 = wx.ToolBar(self, style= wx.TB_HORIZONTAL)
  62. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/new.png'))
  63. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/open.png'))
  64. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/save.png'))
  65. toolbar1.AddSeparator()
  66. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/cut.png'))
  67. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/copy.png'))
  68. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/paste.png'))
  69. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/delete.png'))
  70. toolbar1.AddSeparator()
  71. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/undo.png'))
  72. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/redo.png'))
  73. toolbar1.AddSeparator()
  74. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/asc.png'))
  75. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/desc.png'))
  76. toolbar1.AddSeparator()
  77. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/chart.png'))
  78. toolbar1.AddSeparator()
  79. toolbar1.AddTool(wx.ID_ANY, '', wx.Bitmap('images/exit.png'))
  80. toolbar1.Realize()
  81. toolbar2 = wx.ToolBar(self, wx.TB_HORIZONTAL | wx.TB_TEXT)
  82. self.position = wx.TextCtrl(toolbar2)
  83. font = wx.ComboBox(toolbar2, value='Times', choices=fonts, size=(100, -1),
  84. style=wx.CB_DROPDOWN)
  85. font_height = wx.ComboBox(toolbar2, value='10', choices=font_sizes,
  86. size=(50, -1), style=wx.CB_DROPDOWN)
  87. toolbar2.AddControl(self.position)
  88. toolbar2.AddControl(font)
  89. toolbar2.AddControl(font_height)
  90. toolbar2.AddSeparator()
  91. toolbar2.AddCheckTool(wx.ID_ANY, '', wx.Bitmap('images/text-bold.png'))
  92. toolbar2.AddCheckTool(wx.ID_ANY, '', wx.Bitmap('images/text-italic.png'))
  93. toolbar2.AddCheckTool(wx.ID_ANY, '', wx.Bitmap('images/text-underline.png'))
  94. toolbar2.AddSeparator()
  95. toolbar2.AddTool(wx.ID_ANY, '', wx.Bitmap('images/align-left.png'))
  96. toolbar2.AddTool(wx.ID_ANY, '', wx.Bitmap('images/align-center.png'))
  97. toolbar2.AddTool(wx.ID_ANY, '', wx.Bitmap('images/align-right.png'))
  98. box.Add(toolbar1, border=5)
  99. box.Add((5,5) , 0)
  100. box.Add(toolbar2)
  101. box.Add((5,10) , 0)
  102. toolbar2.Realize()
  103. self.SetSizer(box)
  104. notebook = wx.Notebook(self, style=wx.RIGHT)
  105. sheet1 = MySheet(notebook)
  106. sheet2 = MySheet(notebook)
  107. sheet3 = MySheet(notebook)
  108. sheet1.SetFocus()
  109. notebook.AddPage(sheet1, 'Sheet1')
  110. notebook.AddPage(sheet2, 'Sheet2')
  111. notebook.AddPage(sheet3, 'Sheet3')
  112. box.Add(notebook, 1, wx.EXPAND)
  113. self.CreateStatusBar()
  114. self.SetSize((550, 550))
  115. self.SetTitle("SpreadSheet")
  116. self.Centre()
  117. def main():
  118. app = wx.App()
  119. ex = Example(None)
  120. ex.Show()
  121. app.MainLoop()
  122. if __name__ == '__main__':
  123. main()

该代码示例创建电子表格应用的 UI。 我有一个菜单栏,工具栏和一个中央网格小部件。

  1. class MySheet(wx.grid.Grid):
  2. def __init__(self, *args, **kw):
  3. super(MySheet, self).__init__(*args, **kw)
  4. self.InitUI()
  5. def InitUI(self):
  6. nOfRows = 55
  7. nOfCols = 25
  8. self.row = self.col = 0
  9. self.CreateGrid(nOfRows, nOfCols)
  10. ...

我们创建一个自定义的wx.grid.Grid小部件。 我们的每个工作表将有 55 行和 25 列。 用CreateGrid()方法创建一个单元格网格。

  1. control = self.GetParent().GetParent().position

位置文本控件显示了网格小部件的选定单元格。 它是第二个工具栏的第一个小部件。 在Example类内部,我们需要获取对文本控件的引用,该引用在Example类中定义。 MySheet是笔记本的子项。 笔记本是Example的子项。 因此,通过两次调用GetParent()方法,我们设法到达了位置文本控件。

  1. notebook = wx.Notebook(self, style=wx.RIGHT)
  2. sheet1 = MySheet(notebook)
  3. sheet2 = MySheet(notebook)
  4. sheet3 = MySheet(notebook)
  5. sheet1.SetFocus()
  6. notebook.AddPage(sheet1, 'Sheet1')
  7. notebook.AddPage(sheet2, 'Sheet2')
  8. notebook.AddPage(sheet3, 'Sheet3')

将创建三张纸并将其放置在笔记本小部件中。

wxPython 中的应用框架 - 图2

图:电子表格

播放器

以下示例是典型视频播放器的框架。

player.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode wxPython tutorial
  5. This program creates a Player UI.
  6. author: Jan Bodnar
  7. website: zetcode.com
  8. last edited: May 2018
  9. """
  10. import wx
  11. class Example(wx.Frame):
  12. def __init__(self, *args, **kw):
  13. super(Example, self).__init__(*args, **kw)
  14. self.InitUI()
  15. def InitUI(self):
  16. self.CreateMenuBar()
  17. panel = wx.Panel(self)
  18. pnl1 = wx.Panel(self)
  19. pnl1.SetBackgroundColour(wx.BLACK)
  20. pnl2 = wx.Panel(self)
  21. slider1 = wx.Slider(pnl2, value=18, minValue=0, maxValue=1000)
  22. pause = wx.BitmapButton(pnl2, bitmap=wx.Bitmap('images/pause.png'))
  23. play = wx.BitmapButton(pnl2, bitmap=wx.Bitmap('images/play.png'))
  24. forw = wx.BitmapButton(pnl2, bitmap=wx.Bitmap('images/forw.png'))
  25. back = wx.BitmapButton(pnl2, bitmap=wx.Bitmap('images/back.png'))
  26. vol = wx.BitmapButton(pnl2, bitmap=wx.Bitmap('images/volume.png'))
  27. slider2 = wx.Slider(pnl2, value=1, minValue=0, maxValue=100,
  28. size=(120, -1))
  29. vbox = wx.BoxSizer(wx.VERTICAL)
  30. hbox1 = wx.BoxSizer(wx.HORIZONTAL)
  31. hbox2 = wx.BoxSizer(wx.HORIZONTAL)
  32. hbox1.Add(slider1, proportion=1)
  33. hbox2.Add(pause)
  34. hbox2.Add(play, flag=wx.RIGHT, border=5)
  35. hbox2.Add(forw, flag=wx.LEFT, border=5)
  36. hbox2.Add(back)
  37. hbox2.Add((-1, -1), proportion=1)
  38. hbox2.Add(vol)
  39. hbox2.Add(slider2, flag=wx.TOP|wx.LEFT, border=5)
  40. vbox.Add(hbox1, flag=wx.EXPAND|wx.BOTTOM, border=10)
  41. vbox.Add(hbox2, proportion=1, flag=wx.EXPAND)
  42. pnl2.SetSizer(vbox)
  43. sizer = wx.BoxSizer(wx.VERTICAL)
  44. sizer.Add(pnl1, proportion=1, flag=wx.EXPAND)
  45. sizer.Add(pnl2, flag=wx.EXPAND|wx.BOTTOM|wx.TOP, border=10)
  46. self.SetMinSize((350, 300))
  47. self.CreateStatusBar()
  48. self.SetSizer(sizer)
  49. self.SetSize((350, 200))
  50. self.SetTitle('Player')
  51. self.Centre()
  52. def CreateMenuBar(self):
  53. menubar = wx.MenuBar()
  54. filem = wx.Menu()
  55. play = wx.Menu()
  56. view = wx.Menu()
  57. tools = wx.Menu()
  58. favorites = wx.Menu()
  59. help = wx.Menu()
  60. filem.Append(wx.ID_ANY, '&Quit', 'Quit application')
  61. menubar.Append(filem, '&File')
  62. menubar.Append(play, '&Play')
  63. menubar.Append(view, '&View')
  64. menubar.Append(tools, '&Tools')
  65. menubar.Append(favorites, 'F&avorites')
  66. menubar.Append(help, '&Help')
  67. self.SetMenuBar(menubar)
  68. def main():
  69. app = wx.App()
  70. ex = Example(None)
  71. ex.Show()
  72. app.MainLoop()
  73. if __name__ == '__main__':
  74. main()

为了构建界面,我们使用了位图按钮,滑块,面板和菜单栏。

  1. pnl1 = wx.Panel(self)
  2. pnl1.SetBackgroundColour(wx.BLACK)

应用的主要区域由黑色背景的面板占据。

  1. slider1 = wx.Slider(pnl2, value=18, minValue=0, maxValue=1000)

wx.Slider用于显示胶片的进度。

  1. pause = wx.BitmapButton(pnl2, bitmap=wx.Bitmap('images/pause.png'))
  2. play = wx.BitmapButton(pnl2, bitmap=wx.Bitmap('images/play.png'))

位图按钮用于控制按钮。

  1. self.SetMinSize((350, 300))

在这里,我们设置播放器的最小大小。 将窗口缩小到某个值以下没有太大意义。

wxPython 中的应用框架 - 图3

图:播放器

浏览器

在下面的示例中,我们模仿经典浏览器 UI 的外观。

browser.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode wxPython tutorial
  5. This program creates a browser UI.
  6. author: Jan Bodnar
  7. website: zetcode.com
  8. last edited: May 2018
  9. """
  10. import wx
  11. from wx.lib.buttons import GenBitmapTextButton
  12. class Example(wx.Frame):
  13. def __init__(self, *args, **kw):
  14. super(Example, self).__init__(*args, **kw)
  15. self.InitUI()
  16. def InitUI(self):
  17. self.CreateMenuBar()
  18. panel = wx.Panel(self)
  19. # panel.SetBackgroundColour('white')
  20. vbox = wx.BoxSizer(wx.VERTICAL)
  21. hbox1 = wx.BoxSizer(wx.HORIZONTAL)
  22. hbox2 = wx.BoxSizer(wx.HORIZONTAL)
  23. line1 = wx.StaticLine(panel)
  24. vbox.Add(line1, 0, wx.EXPAND)
  25. toolbar1 = wx.Panel(panel, size=(-1, 30))
  26. back = wx.BitmapButton(toolbar1, bitmap=wx.Bitmap('images/back.png'),
  27. style=wx.NO_BORDER)
  28. forward = wx.BitmapButton(toolbar1, bitmap=wx.Bitmap('images/forw.png'),
  29. style=wx.NO_BORDER)
  30. refresh = wx.BitmapButton(toolbar1, bitmap=wx.Bitmap('images/refresh.png'),
  31. style=wx.NO_BORDER)
  32. stop = wx.BitmapButton(toolbar1, bitmap=wx.Bitmap('images/stop.png'),
  33. style=wx.NO_BORDER)
  34. home = wx.BitmapButton(toolbar1, bitmap=wx.Bitmap('images/home.png'),
  35. style=wx.NO_BORDER)
  36. address = wx.ComboBox(toolbar1, size=(50, -1))
  37. go = wx.BitmapButton(toolbar1, bitmap=wx.Bitmap('images/play.png'),
  38. style=wx.NO_BORDER)
  39. text = wx.TextCtrl(toolbar1, size=(150, -1))
  40. hbox1.Add(back)
  41. hbox1.Add(forward)
  42. hbox1.Add(refresh)
  43. hbox1.Add(stop)
  44. hbox1.Add(home)
  45. hbox1.Add(address, 1, wx.TOP, 3)
  46. hbox1.Add(go, 0, wx.TOP | wx.LEFT, 3)
  47. hbox1.Add(text, 0, wx.TOP | wx.RIGHT, 3)
  48. toolbar1.SetSizer(hbox1)
  49. vbox.Add(toolbar1, 0, wx.EXPAND)
  50. line = wx.StaticLine(panel)
  51. vbox.Add(line, 0, wx.EXPAND)
  52. toolbar2 = wx.Panel(panel, size=(-1, 30))
  53. bookmark1 = wx.BitmapButton(toolbar2, bitmap=wx.Bitmap('images/love.png'),
  54. style=wx.NO_BORDER)
  55. bookmark2 = wx.BitmapButton(toolbar2, bitmap=wx.Bitmap('images/book.png'),
  56. style=wx.NO_BORDER)
  57. bookmark3 = wx.BitmapButton(toolbar2, bitmap=wx.Bitmap('images/sound.png'),
  58. style=wx.NO_BORDER)
  59. hbox2.Add(bookmark1, flag=wx.RIGHT, border=5)
  60. hbox2.Add(bookmark2, flag=wx.RIGHT, border=5)
  61. hbox2.Add(bookmark3)
  62. toolbar2.SetSizer(hbox2)
  63. vbox.Add(toolbar2, 0, wx.EXPAND)
  64. line2 = wx.StaticLine(panel)
  65. vbox.Add(line2, 0, wx.EXPAND)
  66. panel.SetSizer(vbox)
  67. self.CreateStatusBar()
  68. self.SetTitle("Browser")
  69. self.Centre()
  70. def CreateMenuBar(self):
  71. menubar = wx.MenuBar()
  72. file = wx.Menu()
  73. file.Append(wx.ID_ANY, '&Quit', '')
  74. edit = wx.Menu()
  75. view = wx.Menu()
  76. go = wx.Menu()
  77. bookmarks = wx.Menu()
  78. tools = wx.Menu()
  79. help = wx.Menu()
  80. menubar.Append(file, '&File')
  81. menubar.Append(edit, '&Edit')
  82. menubar.Append(view, '&View')
  83. menubar.Append(go, '&Go')
  84. menubar.Append(bookmarks, '&Bookmarks')
  85. menubar.Append(tools, '&Tools')
  86. menubar.Append(help, '&Help')
  87. self.SetMenuBar(menubar)
  88. def main():
  89. app = wx.App()
  90. ex = Example(None)
  91. ex.Show()
  92. app.MainLoop()
  93. if __name__ == '__main__':
  94. main()

为了创建一个较大的组合框,我们不能使用wx.Toolbar。 我们基于wx.Panel创建自定义工具栏。

  1. toolbar1 = wx.Panel(panel, size=(-1, 40))

我们创建一个普通的wx.Panel

  1. hbox1 = wx.BoxSizer(wx.HORIZONTAL)
  2. ...
  3. hbox1.Add(back)
  4. hbox1.Add(forward)
  5. hbox1.Add(refresh)

我们创建一个水平大小调整器,并添加所有必要的按钮。

  1. hbox1.Add(address, 1, wx.TOP, 4)

然后,将组合框添加到大小调整器。 这种组合框通常称为地址栏。 请注意,这是唯一将比例设置为 1 的小部件。这是使其可调整大小的必要条件。

  1. line2 = wx.StaticLine(panel)
  2. vbox.Add(line2, 0, wx.EXPAND)

工具栏由一行分隔。

wxPython 中的应用框架 - 图4

图:浏览器 UI

在 wxPython 教程的这一部分中,我们创建了一些应用框架。