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號程序不完全退出的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM