Python GUI编程:wxPython模块之下拉列表和菜单
1. 下拉列表
下拉列表是由一个文本框和一个列表组成的,它有两种方法可以使用,一种是wx.ComboBox,一种是wx.Choice,前者的文本框是可变的,而后者的是固定的。
我们直接通过例子来看一下:
123456789101112131415161718192021222324252627 | import wx
class MyFrame(wx.Frame):
def __init__(
self
):
wx.Frame.__init__(
self
,
None
,
-
1
,
"下拉列表"
, size
=
(
300
,
300
))
self
.Centre()
panel
= wx.Panel(
self
)
#创建一个容器
box_one
= wx.BoxSizer(wx.HORIZONTAL)
text_one
= wx.StaticText(panel,label
=
'你喜欢的运动为:'
)
sports
= [
'篮球'
,
'足球'
,
'排球'
]
select_one
= wx.ComboBox(panel,
-
1
,value
= '足球'
,choices
= sports,style
= wx.CB_SORT)
box_one.Add(text_one,
1
,flag
=
wx.LEFT|wx.RIGHT|wx.FIXED_MINSIZE,border
= 7
)
box_one.Add(select_one,
1
,flag
= wx.
ALL
|wx.FIXED_MINSIZE)
box_two
= wx.BoxSizer(wx.HORIZONTAL)
text_two
= wx.StaticText(panel,label
=
'你喜欢的手机品牌为:'
)
phones
= [
'小米'
,
'华为'
,
'苹果'
]
select_two
= wx.Choice(panel,
-
1
,choices
= phones,style
= wx.CB_SORT)
box_two.Add(text_two,
1
,flag
=
wx.LEFT|wx.RIGHT|wx.FIXED_MINSIZE,border
= 7
)
box_two.Add(select_two,
1
,flag
= wx.
ALL
|wx.FIXED_MINSIZE)
bbox
= wx.BoxSizer(wx.VERTICAL)
bbox.Add(box_one,
1
,flag
= wx.
ALL
|wx.EXPAND,border
= 7
)
bbox.Add(box_two,
1
, flag
=
wx.
ALL | wx.EXPAND, border
=
7
)
panel.SetSizer(bbox)
if __name__
=
= "__main__"
:
app
= wx.App()
frame
= MyFrame()
frame.Show()
app.MainLoop() |
运行结果如下图:
我们可以看出两种列表的不同之处,选择使用wx.Choice的时候,选择框中的内容是固定的,只有从列表中选择,而使用wx.ComboBox的时候选择框中的内容不是固定的,关键语句:
12 | select_one
= wx.ComboBox(panel,
-
1
, value
=
'足球'
, choices
=
sports, style
=
wx.CB_SORT)
select_two
= wx.Choice(panel,
-
1
, choices
=
phones, style
=
wx.CB_SORT) |
2. 菜单
我们可以发现在日常生活中使用的大多图形用户界面都是有菜单项的,如下面的几张图:
点击其中一个菜单项还有多个选项供我们选择,下面我们来学习使用wxPython中的功能来实现菜单栏。
1) 创建一个菜单栏:menuBar = wx.MenuBar()。
2) 创建菜单: fileMenu = wx.Menu()
3) 创建菜单项: newItem = wx.MenuItem()
4) 添加菜单项到菜单中: fileMenu.AppendItem(newItem)
5) 添加菜单到菜单栏:menuBar.Append(fileMenu, title = "File")
6) 把菜单栏设置为界面的菜单栏:self.SetMenuBar(menuBar)
7) 绑定菜单事件:self.Bind(wx.EVT_MENT, self.menuHandler)
代码如下:
12345678910111213141516171819202122232425262728 | import wx
class MyFrame(wx.Frame):
def __init__(
self
):
super
().__init__(parent
=
None
, title
=
"wxPython"
, size
=
(
400
,
300
))
self
.Center()
self
.text
= wx.TextCtrl(
self
,
-
1
, style
=
wx.TE_MULTILINE)
vbox
= wx.BoxSizer(wx.VERTICAL)
self
.SetSizer(vbox)
vbox.Add(
self
.text,
1
, flag
=
wx.EXPAND | wx.
ALL
, border
=
1
)
menubar
= wx.MenuBar()
#对应步骤1
self
.SetMenuBar(menubar)
file_menu
= wx.Menu()
#对应步骤2
menubar.Append(file_menu,
'菜单'
)
#对应步骤4
file_menu.Append(
id
=
wx.ID_NEW, item
=
'新建'
, helpString
=
'new file'
)
file_menu.AppendSeparator()
edit_menu
= wx.Menu()
file_menu.AppendSubMenu(edit_menu,
"编辑"
)
copy_item
= wx.MenuItem(edit_menu,
100
, text
=
"复制"
, kind
=
wx.ITEM_NORMAL)
#对应步骤3
edit_menu.Append(copy_item)
cut_item
= wx.MenuItem(edit_menu,
101
, text
=
"剪切"
, kind
=
wx.ITEM_NORMAL)
edit_menu.Append(cut_item)
paste_item
= wx.MenuItem(edit_menu,
102
, text
=
"粘贴"
, kind
=
wx.ITEM_NORMAL)
edit_menu.Append(paste_item)
if __name__
=
= "__main__"
:
app
= wx.App()
frame
= MyFrame()
frame.Show()
app.MainLoop() |
运行结果如下: