wxpython 学习之-MenuBar和StatusBar
#coding:utf-8 import wx import os class MyApp(wx.App): def __init__(self): super(MyApp,self).__init__() class MyFrame(wx.Frame): def __init__(self,title='test',size=wx.DefaultSize): super(MyFrame,self).__init__(None,wx.ID_ANY,title=title,size=size,style=wx.DEFAULT_FRAME_STYLE^wx.MINIMIZE_BOX) self.Center() #self.SetSize(700,700) #self.SetTitle('aaa') self.InitMenuBar() self.InitStatusBar() def InitMenuBar(self): #创建一个menubar menuBar = wx.MenuBar() #创建两个menu filemenu = wx.Menu() aboutmenu = wx.Menu() #filemenu添加一个menuopen,关联的ID为wx.ID_OPEN,名字为Open,如果有状态栏,则状态栏里显示‘打开文件’ menuopen = filemenu.Append(wx.ID_OPEN,'Open','打开文件') #filemenu添加一个menu分隔符 filemenu.AppendSeparator() menusave = filemenu.Append(wx.ID_SAVE,'Save','保存当前设置') filemenu.AppendSeparator() menuexit = filemenu.Append(wx.ID_EXIT,'Exit','退出程序') menuBar.Append(filemenu,'File') menuabout = aboutmenu.Append(wx.ID_ABOUT,'Info','Information') menuBar.Append(aboutmenu,'Info') #将menu与函数绑定 self.Bind(wx.EVT_MENU,self.Exit,menuexit) self.Bind(wx.EVT_MENU,self.Info,menuabout) self.Bind(wx.EVT_MENU,self.Open,menuopen) self.Bind(wx.EVT_MENU,self.Save,menusave) self.SetMenuBar(menuBar) def Exit(self,event): self.Close() def Open(self,event): self.dirname='' self.filename='' dlg = wx.FileDialog(self,'选择文件',self.dirname,'','*.csv*',wx.FD_OPEN) if dlg.ShowModal() == wx.ID_OK: self.filename = dlg.GetFilename() self.dirname = dlg.GetDirectory() self.FilePath = os.path.join(self.dirname,self.filename) return self.FilePath def Save(self): #可以将要保存的东西放入本地磁盘 pass def Info(self,event): self.messageinfo='Author:testuser\nDate:2019/5/21\nVersion:0.1' message = wx.MessageDialog(self,self.messageinfo,'INFO',wx.OK) message.ShowModal() message.Destroy() def InitStatusBar(self): #创建状态栏 statusbar = self.CreateStatusBar() #将状态栏分割为3个部分 statusbar.SetFieldsCount(3) #分割状态栏的比例为3:2:1,用负数表示 statusbar.SetStatusWidths([-3,-2,-1]) #每部分状态栏显示的值,当鼠标停在menu上时,0号状态栏会临时显示上面menu里的提示信息 statusbar.SetStatusText('1111',0) statusbar.SetStatusText('2222',1) statusbar.SetStatusText('3333',2) if __name__ == '__main__': app = MyApp() frame = MyFrame(title='wx-test',size=(400,300)) frame.Show() app.MainLoop()
运行结果:
##这里需要说明的是,当点击右上角的X关闭时,是不会去调用到写的Exit函数的,上次遇到一个问题就是:
当点menu里面Exit退出时,程序正常退出,当点击右上角X退出时,程序里面有线程在跑,虽然UI界面时退出了,但是程序仍然没有退出。
遇到这种情况,我是这样做的:
class MyFrame(wx.Frame):
def __init__(self,title,size):
super(MyFrame,self).__init__(None,wx.ID_ANY,title=title,size=size)
...中间省略...
self.Bind(wx.EVT_CLOSE,self.Exit,self)
这样当点击X关闭窗口,会调用到写的Exit函数,但是这样会出现一个错误:
RuntimeError: maximum recursion depth exceeded
因为wx.EVT_CLOSE会触发Exit函数,而Exit函数里又有去调用self.Close(),self.Close()又会触发wx.EVT_CLOSE,然后又去调用Exit函数,陷入死循环,所以会出现上面的这种错误。
这时我修改了Exit,不去调用self.Close()了,而是直接os._exit()
def Exit(self,event):
#self.Close()
os._exit(0)
不管怎样,算是解决了点击X号程序不完全退出的问题。