wxPython:一曲MFC的挽歌,理想主义的绝唱( 八 )


importwxclassMainFrame(wx.Frame):"""从wx.Frame派生主窗口类"""def__init__(self,parent):"""构造函数"""wx.Frame.__init__(self,parent,style=wx.DEFAULT_FRAME_STYLE)self.SetTitle('相册')self.SetIcon(wx.Icon('res/wx.ico'))self.SetBackgroundColour((224,224,224))#设置窗口背景色self.SetSize((980,680))self._init_ui()self.Center()def_init_ui(self):"""初始化界面"""self.curr=0self.photos=('res/DSC03363.jpg','res/DSC03394.jpg','res/DSC03402.jpg')bmp=wx.Bitmap(self.photos[self.curr])self.album=wx.StaticBitmap(self,-1,bmp,pos=(280,10))btn_1=wx.Button(self,-1,',size=(80,30),name='prev')btn_2=wx.Button(self,-1,'>',size=(80,30),name='next')btn_1.Bind(wx.EVT_BUTTON,self.on_btn)btn_2.Bind(wx.EVT_BUTTON,self.on_btn)sizer_btn=wx.BoxSizer()sizer_btn.Add(btn_1,0,wx.RIGHT,20)sizer_btn.Add(btn_2,0,wx.LEFT,20)sizer_max=wx.BoxSizer(wx.VERTICAL)sizer_max.Add(self.album,1,wx.EXPAND|wx.ALL,10)sizer_max.Add(sizer_btn,0,wx.ALIGN_CENTER|wx.BOTTOM,20)self.SetSizer(sizer_max)self.Layout()defon_btn(self,evt):"""响应按键"""name=evt.GetEventObject().GetName()ifname==':self.curr=(self.curr-1)%len(self.photos)else:self.curr=(self.curr+1)%len(self.photos)self.album.SetBitmap(wx.Bitmap(self.photos[self.curr]))if__name__=='__main__':app=wx.App()frame=MainFrame(None)frame.Show()app.MainLoop()代码运行界面如下图所示 。
wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
6.2.会弹琴的计算器几乎所有的GUI课程都会用计算器作为例子 , wxPython怎能缺席呢?下面这个计算器除了常规的计算外 , 按下每个键都会发出不同的音调 , 粗通乐理就可以弹奏出乐曲 。 此外 , 代码中使用了wx.lib控件库的按键 , 略带3D风格 。
importwximportwx.lib.buttonsaswxbtnimportwinsoundclassMainFrame(wx.Frame):"""桌面程序主窗口类"""def__init__(self):"""构造函数"""wx.Frame.__init__(self,parent=None,style=wx.CAPTION|wx.SYSTEM_MENU|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SIMPLE_BORDER)self.SetTitle('会弹琴的计算器')self.SetIcon(wx.Icon('res/wx.ico',wx.BITMAP_TYPE_ICO))self.SetBackgroundColour((217,228,241))self.SetSize((287,283))self._init_ui()self.Center()def_init_ui(self):"""初始化界面"""#定义按键排列顺序和名称keys=[['(',')','Back','Clear'],['7','8','9','/'],['4','5','6','*'],['1','2','3','-'],['0','.','=','+']]#指定每个按键声音的频率 , 523赫兹就是C调中音self.keySound={'(':392,')':440,'0':494,'1':523,'2':587,'3':659,'4':698,'5':784,'6':880,'7':988,'8':1047,'9':1175,'.':1318,'+':523,'-':587,'*':659,'/':698,'Clear':784,'Back':880,'=':2000}#用输入框控件作为计算器屏幕 , 设置为只读(wx.TE_READONLY)和右齐(wx.ALIGN_RIGHT)self.screen=wx.TextCtrl(self,-1,'',pos=(10,10),size=(252,45),style=wx.TE_READONLY|wx.ALIGN_RIGHT)self.screen.SetFont(wx.Font(20,wx.DEFAULT,wx.NORMAL,wx.NORMAL,False,'微软雅黑'))#设置字体字号self.screen.SetBackgroundColour((0,0,0))#设置屏幕背景色self.screen.SetForegroundColour((0,255,0))#设置屏幕前景色#按键布局参数btn_size=(60,30)#定义按键的尺寸 , 便于统一修改x0,y0=(10,65)#定义按键区域的相对位置dx,dy=(64,34)#定义水平步长和垂直步长#生成所有按键foriinrange(len(keys)):forjinrange(len(keys[i])):key=keys[i][j]btn=wxbtn.GenButton(self,-1,key,pos=(x0+j*dx,y0+i*dy),size=btn_size,name=key)ifkeyin['0','1','2','3','4','5','6','7','8','9','.']:btn.SetBezelWidth(1)#设置3D效果btn.SetBackgroundColour(wx.Colour(217,228,241))#定义按键的背景色elifkeyin['(',')','Back','Clear']:btn.SetBezelWidth(2)btn.SetBackgroundColour(wx.Colour(217,220,235))btn.SetForegroundColour(wx.Colour(224,60,60))elifkeyin['+','-','*','/']:btn.SetBezelWidth(2)btn.SetBackgroundColour(wx.Colour(246,225,208))btn.SetForegroundColour(wx.Colour(60,60,224))else:btn.SetBezelWidth(2)btn.SetBackgroundColour(wx.Colour(245,227,129))btn.SetForegroundColour(wx.Colour(60,60,224))btn.SetToolTip(u"显示计算结果")self.Bind(wx.EVT_BUTTON,self.on_button)#将按钮事件绑定在所有按钮上defon_button(self,evt):"""响应鼠标左键按下"""obj=evt.GetEventObject()#获取事件对象(哪个按钮被按)key=obj.GetName()#获取事件对象的名字self.PlayKeySound(key)#播放按键对应频率的声音ifself.screen.GetValuehttps://pcff.toutiao.jxnews.com.cn/p/20220506/=='Error':self.screen.SetValue('')ifkey=='Clear':#按下了清除键 , 清空屏幕self.screen.SetValue('')elifkey=='Back':#按下了回退键 , 去掉最后一个输入字符content=self.screen.GetValue()ifcontent:self.screen.SetValue(content[:-1])elifkey=='=':#按下了等号键 , 则计算try:result=str(eval(self.screen.GetValue()))except:result='Error'self.screen.SetValue(result)else:#按下了其他键 , 追加到显示屏上self.screen.AppendText(key)defPlayKeySound(self,key,Dur=100):"""播放按键声音"""winsound.Beep(self.keySound[key],Dur)if__name__=='__main__':app=wx.App()frame=MainFrame()frame.Show()app.MainLoop()代码运行界面如下图所示 。