wxPython簡介
wxPython是一個用于創(chuàng)建桌面GUI應用程序的跨平臺工具包晴叨。wxPython的主要作者是Robin Dunn。使用wxPython矾屯,開發(fā)人員可以在Windows兼蕊,Mac和各種Unix系統(tǒng)上創(chuàng)建應用程序。wxPython是wxWidgets的包裝器件蚕,它是一個成熟的跨平臺C ++庫孙技。
wxPython API文檔:https://docs.wxpython.org/
安裝wxPython
pip 是 Python 的包管理工具产禾,該工具提供了對Python 包的查找泣崩、下載莺债、安裝嗤疯、卸載的功能卜壕。在Python官網(wǎng)下載較新版本的Python烘跺,就會自帶pip贱除。
輸入命令行指令:
pip install wxpython
wxFormBuilder
wxFormBuilder是一款基于wxWidgets的GUI可視化編輯工具和敬,可用于Python的GUI設計视粮。
wxFormBuilder項目GitHUb:www.wxformbuilder.org/
第一個wxPython程序
接下來裳瘪,我們借助wxFormBuiler來編寫一個簡單的文本編輯器以此來熟悉wxPython的使用土浸。
第一步,打開wxFormBuilder彭羹,可見到如下界面黄伊。
界面主要分為四大區(qū):項目區(qū)Object Tree、控件區(qū)Component Palette派殷、編輯區(qū)Editor还最、屬性區(qū)Object Properties。
在控件區(qū)里點擊添加需要的控件愈腾,這些控件的效果會在編輯區(qū)里實時顯示憋活,并在屬性區(qū)顯示這些控件的屬性,項目區(qū)用于顯示控件間的層級關(guān)系虱黄。
第二步,讓我們開始創(chuàng)建一個GUI的基礎框架悦即,先從控件區(qū)里的Forms中添加一個Frame,這是GUI的輪廓基礎:
*第三步是在Frame下添加一個Layout中的wxBoxSizer橱乱,后續(xù)所有控件均是放在wxBoxSizer里的辜梳。
如果你覺得單個wxBoxSizer里的控件布局太單調(diào),你可以嵌套使用wxBoxSizer泳叠,這是實現(xiàn)GUI界面控件布局多樣化的關(guān)鍵作瞄。
本次編寫的文本編輯器就嵌套了wxBoxSizer,需要在第一個wxBoxSizer中再添加一個wxBoxSizer:
接著在右側(cè)的屬性區(qū)修改其相關(guān)的屬性危纫,將bSizer2的orient改為wxHORIZONTZL宗挥,proportion改為0。
這樣bSizer2中的控件就變成水平排列的了种蝶,而且bSizer2在bSizer1中的比例為保持bSizer2中的控件大小契耿,具體的效果會在后面顯示出來:
第四步,在bSizer2中添加Common中的1個wxTextCtrl螃征,2個wxButton:
現(xiàn)在就能看到第三步中對bSizer2的orient和proportion屬性設置的效果了搪桂,三個控件依次水平排列,且整個bSizer2的高度是與其中控件高度有關(guān)的盯滚。
接下來分別修改m_textCtrl1踢械、m_button和m_button2的屬性酗电,將其name依次改名為filePath、open和save内列,將textCtrl的proportion改為1撵术,兩個button的label改為“打開”和“保存”,最終效果為:
第五步德绿,在bSizer1下再添加一個wxTextCtrl荷荤,并將name修改為content,proportion改為1移稳,flag下勾選wx.EXPAND蕴纳,其效果為:
flag=wx.EXAPND和proportion=1使得整個文本框填充了bSizer1的剩余空間,這樣一個文本編輯框的UI就初步完成了个粱。
接下點擊Editor下的Python標簽古毛,就能看到UI對應的源碼了,將其復制起來:
打開你的python IDE都许,創(chuàng)建一個project稻薇,將源碼粘貼到里面。
為MyFrame1添加兩個方法胶征,分別用來打開和保存文本塞椎,需傳入event來綁定按鍵:
defopen(self, event):# 打開文件# 彈出文件選擇對話框dlg = wx.FileDialog(self,u'選擇要打開的txt文件', style=wx.DD_DEFAULT_STYLE)ifdlg.ShowModal() == wx.ID_OK:# 按下OK后的邏輯self.fileName.SetValue(dlg.GetPath())# 將選擇文件的路徑輸出到fileName里file = open(self.fileName.GetValue())# 以只讀打開選中文件self.textEdit.SetValue(file.read())# 將文件中的文本輸出到textEdit里file.close()# 關(guān)閉文件dlg.Destroy()# 關(guān)閉對話框defsave(self, event):# 保存文件file = open(self.fileName.GetValue(),'w')# 打開選中文件,可編輯file.write(self.textEdit.GetValue())# 將textEdit中的文本寫入文件file.close()# 關(guān)閉文件
在MyFrame1.__init__()下為兩個方法綁定對應按鍵:
self.openFile.Bind(wx.EVT_BUTTON,self.open)self.saveFile.Bind(wx.EVT_BUTTON,self.save)
在此python文件下添加以下代碼:
if__name__ =='__main__':? ? app = wx.App()# 創(chuàng)建一個應用程序?qū)ο缶Φ汀C總€wxPython程序必須有一個應用程序?qū)ο蟀负荨rame = MyFrame1(None)# 創(chuàng)建一個MyFrame1對象frame.Show()# 調(diào)用該對象的 Show()方法以在屏幕上實際顯示它# 進入主循環(huán)。主循環(huán)是一個無盡的循環(huán)钱雷。它捕獲并發(fā)送應用程序生命周期中存在的所有事件骂铁。app.MainLoop()
到此,一個文本編輯器就寫完了罩抗,運行效果如下:
源碼
# -*- coding: utf-8 -*-importwx############################################################################# Class MyFrame1###########################################################################classMyFrame1(wx.Frame):def__init__(self, parent):wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"文本編輯器", pos=wx.DefaultPosition, size=wx.Size(600,400),? ? ? ? ? ? ? ? ? ? ? ? ? style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)? ? ? ? self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)? ? ? ? bSizer1 = wx.BoxSizer(wx.VERTICAL)? ? ? ? bSizer2 = wx.BoxSizer(wx.HORIZONTAL)? ? ? ? self.fileName = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize,0)? ? ? ? bSizer2.Add(self.fileName,1, wx.ALL,5)? ? ? ? self.openFile = wx.Button(self, wx.ID_ANY,u"打開", wx.DefaultPosition, wx.DefaultSize,0)? ? ? ? bSizer2.Add(self.openFile,0, wx.ALL,5)? ? ? ? self.saveFile = wx.Button(self, wx.ID_ANY,u"保存", wx.DefaultPosition, wx.DefaultSize,0)? ? ? ? bSizer2.Add(self.saveFile,0, wx.ALL,5)? ? ? ? bSizer1.Add(bSizer2,0, wx.EXPAND,5)? ? ? ? bSizer3 = wx.BoxSizer(wx.VERTICAL)? ? ? ? self.textEdit = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize,0)? ? ? ? bSizer3.Add(self.textEdit,1, wx.ALL | wx.EXPAND,5)? ? ? ? bSizer1.Add(bSizer3,1, wx.EXPAND,5)? ? ? ? self.SetSizer(bSizer1)? ? ? ? self.Layout()? ? ? ? self.Centre(wx.BOTH)? ? ? ? self.openFile.Bind(wx.EVT_BUTTON, self.open)? ? ? ? self.saveFile.Bind(wx.EVT_BUTTON, self.save)def__del__(self):passdefopen(self, event):# 打開文件# 彈出文件選擇對話框dlg = wx.FileDialog(self,u'選擇要打開的txt文件', style=wx.DD_DEFAULT_STYLE)ifdlg.ShowModal() == wx.ID_OK:# 按下OK后的邏輯self.fileName.SetValue(dlg.GetPath())# 將選擇文件的路徑輸出到fileName里file = open(self.fileName.GetValue())# 以只讀打開選中文件self.textEdit.SetValue(file.read())# 將文件中的文本輸出到textEdit里file.close()# 關(guān)閉文件dlg.Destroy()# 關(guān)閉對話框defsave(self, event):# 保存文件file = open(self.fileName.GetValue(),'w')# 打開選中文件拉庵,可編輯file.write(self.textEdit.GetValue())# 將textEdit中的文本寫入文件file.close()# 關(guān)閉文件if__name__ =='__main__':? ? app = wx.App()? ? frame = MyFrame1(None)? ? frame.Show()? ? app.MainLoop()
作者:1vxy
鏈接:http://www.reibang.com/p/fcca035b04b6
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處套蒂。