要求如下:
图标: 使用17APLab3自己画的图标
菜单: 动态设计一个菜单控制动态改变图标(3选1单选),在四个位置显示文字(复选),“关于”
加速键: 每个菜单项都有加速键
消息框: 改变图标前确认是否要修改
选择图标3时复选菜单灰化
代码如下:
#_*_coding:utf-8_*_
import wx
import os
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, u"17APLab4:WX资源基本使用", size=(800, 600))
self.SetBackgroundColour(u"Gray")
self.menuBar = wx.MenuBar()
self.panel = wx.Panel(self,-1)
self.icon1 = wx.Icon(name=os.path.join(os.path.dirname(__file__),'icon1.ico'), type=wx.BITMAP_TYPE_ICO)
self.icon2 = wx.Icon(name=os.path.join(os.path.dirname(__file__),'icon2.ico'), type=wx.BITMAP_TYPE_ICO)
self.icon3 = wx.Icon(name=os.path.join(os.path.dirname(__file__),'icon3.ico'), type=wx.BITMAP_TYPE_ICO)
self.SetIcon(self.icon1)
self.IconWord = wx.StaticText(self.panel, -1, u"", pos=(100, 100))
self.IconWord.SetLabel(u"当前使用的图标是:图标1")
self.IconWord.SetFont(wx.Font(15, wx.SWISS, wx.NORMAL, wx.BOLD, False))
menu = wx.Menu()
menu.Append(wx.ID_EXIT, u"Exit\tCtrl+Shift+Delete", u"Exit this simple sample")
self.Bind(wx.EVT_MENU, self.OnClose, id=wx.ID_EXIT)
self.menuBar.Append(menu, u"&File")
self.IconList = [self.icon1,self.icon2,self.icon3]
self.icon = wx.Menu()
for num in range(3):
self.icon.Append(num+201, u"图标%d\tCtrl+%d"%(num+1,num+1), u"将图标更换成icon%d.ico"%(num+1), wx.ITEM_RADIO)
self.Bind(wx.EVT_MENU_RANGE, self.OnIcon,id=201,id2=203)
self.IconEnsured = 201
self.menuBar.Append(self.icon, u"图标(&I)")
self.menuBar.Check(self.IconEnsured,True)
control = wx.Menu()
for num in range(4):
control.Append(num+301, u"显示%d\tCtrl+Shift+%d"%(num+1,num+1), u"改变显示的文字", wx.ITEM_CHECK)
self.menuBar.Append(control, u"显示(&D)")
self.Bind(wx.EVT_MENU_RANGE, self.OnIndicate,id=301,id2=304)
self.Indicate = []
for num in range(4):
self.Indicate.append(wx.StaticText(self.panel, -1, u"", pos=((1+num%2)*200,(1+num/2)*200)))
self.Indicate[num].SetFont(wx.Font(15, wx.SWISS, wx.NORMAL, wx.BOLD, False))
self.IndicateControl = [False,False,False,False]
menu = wx.Menu()
IdAbout = menu.Append(-1, u"程序信息\tF1", u"点击查看程序信息")
# bind the menu event to an event handler
self.Bind(wx.EVT_MENU, self.OnHelp, IdAbout)
# and put the menu on the menubar
self.menuBar.Append(menu, u"关于(&A)")
self.SetMenuBar(self.menuBar)
# self.AcceleratorTable = []
# self.AcceleratorTable.Append((wx.ACCEL_CTRL,ord('1'),201))
# MyAccelerator=wx.AcceleratorTable([ (wx.ACCEL_CTRL,ord('1'),201),
# (wx.ACCEL_CTRL,ord('2'),202),
# (wx.ACCEL_CTRL,ord('3'),203)
# (wx.ACCEL_CTRL+wx.ACCEL_SHIFT,ord('1'),301),
# (wx.ACCEL_CTRL+wx.ACCEL_SHIFT,ord('2'),302),
# (wx.ACCEL_CTRL+wx.ACCEL_SHIFT,ord('3'),303),
# (wx.ACCEL_CTRL+wx.ACCEL_SHIFT,ord('4'),304)])
# self.SetAcceleratorTable(MyAccelerator)
self.CreateStatusBar()
# self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnIcon(self, evt):
IconIdSelected = evt.GetId()
if wx.MessageBox(u"确定要修改么?", u"Confirmation", wx.YES_NO | wx.ICON_INFORMATION, self) == wx.YES:
self.IconEnsured = IconIdSelected
self.SetIcon(self.IconList[self.IconEnsured-201])
self.IconWord.SetLabel(u"当前使用的图标是:图标"+str(self.IconEnsured-200))
if IconIdSelected == 203:
self.GetMenuBar().EnableTop(2,False)
else:
self.GetMenuBar().EnableTop(2,True)
else:
self.menuBar.Check(self.IconEnsured, True)
self.Refresh()
def OnIndicate(self, evt):
IndicateIdSelected = evt.GetId()-301
self.IndicateControl[IndicateIdSelected] = not self.IndicateControl[IndicateIdSelected]
if(self.IndicateControl[IndicateIdSelected]):
self.Indicate[IndicateIdSelected].SetLabel(u"显示"+str(IndicateIdSelected+1))
else:
self.Indicate[IndicateIdSelected].SetLabel(u"")
self.Refresh()
def OnHelp(self, evt):
wx.MessageBox(u"17APLab4:WX资源基本使用\n图标、菜单、加速键、消息框\n\n\
作者:1017510****\n姓名:XXX",
u"17APLab4(WX)", wx.OK | wx.ICON_INFORMATION, self)
def OnClose(self, evt):
self.Close()
if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
frame.Show(True)
app.MainLoop()
好像python会根据文字自己加上快捷键……所以代码中的快捷键好像没有必要加了,所以注释掉了