wxPython筆記

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/

下載地址:wxFormBuilder_win32.zip

第一個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)并注明出處套蒂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞支,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子操刀,更是在濱河造成了極大的恐慌伸辟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馍刮,死亡現(xiàn)場離奇詭異,居然都是意外死亡窃蹋,警方通過查閱死者的電腦和手機卡啰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門静稻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匈辱,你說我怎么就攤上這事振湾。” “怎么了亡脸?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵押搪,是天一觀的道長。 經(jīng)常有香客問我浅碾,道長大州,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任垂谢,我火速辦了婚禮厦画,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滥朱。我一直安慰自己根暑,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布徙邻。 她就那樣靜靜地躺著排嫌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缰犁。 梳的紋絲不亂的頭發(fā)上淳地,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音民鼓,去河邊找鬼薇芝。 笑死,一個胖子當著我的面吹牛丰嘉,可吹牛的內(nèi)容都是我干的夯到。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饮亏,長吁一口氣:“原來是場噩夢啊……” “哼耍贾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起路幸,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤荐开,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后简肴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晃听,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了能扒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佣渴。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖初斑,靈堂內(nèi)的尸體忽然破棺而出辛润,到底是詐尸還是另有隱情,我是刑警寧澤见秤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布砂竖,位于F島的核電站,受9級特大地震影響鹃答,放射性物質(zhì)發(fā)生泄漏乎澄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一挣跋、第九天 我趴在偏房一處隱蔽的房頂上張望三圆。 院中可真熱鬧,春花似錦避咆、人聲如沸舟肉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽路媚。三九已至,卻和暖如春樊销,著一層夾襖步出監(jiān)牢的瞬間整慎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工围苫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裤园,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓剂府,卻偏偏與公主長得像拧揽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腺占,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容