wxPython學(xué)習(xí)——寫(xiě)一個(gè)文本編輯器

wxPython簡(jiǎn)介

wxPython是一個(gè)用于創(chuàng)建桌面GUI應(yīng)用程序的跨平臺(tái)工具包壶硅。wxPython的主要作者是Robin Dunn场躯。使用wxPython剩蟀,開(kāi)發(fā)人員可以在Windows,Mac和各種Unix系統(tǒng)上創(chuàng)建應(yīng)用程序猖辫。wxPython是wxWidgets的包裝器,它是一個(gè)成熟的跨平臺(tái)C ++庫(kù)砚殿。

wxPython API文檔:https://docs.wxpython.org/

安裝wxPython

pip 是 Python 的包管理工具啃憎,該工具提供了對(duì)Python 包的查找、下載似炎、安裝辛萍、卸載的功能。在Python官網(wǎng)下載較新版本的Python羡藐,就會(huì)自帶pip贩毕。

輸入命令行指令:

pip install wxpython

wxFormBuilder

wxFormBuilder是一款基于wxWidgets的GUI可視化編輯工具,可用于Python的GUI設(shè)計(jì)仆嗦。

wxFormBuilder項(xiàng)目GitHUb:www.wxformbuilder.org/

下載地址:wxFormBuilder_win32.zip

第一個(gè)wxPython程序

接下來(lái)辉阶,我們借助wxFormBuiler來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的文本編輯器以此來(lái)熟悉wxPython的使用。

  • 第一步,打開(kāi)wxFormBuilder谆甜,可見(jiàn)到如下界面垃僚。

界面主要分為四大區(qū):項(xiàng)目區(qū)Object Tree、控件區(qū)Component Palette规辱、編輯區(qū)Editor谆棺、屬性區(qū)Object Properties。

控件區(qū)里點(diǎn)擊添加需要的控件罕袋,這些控件的效果會(huì)在編輯區(qū)里實(shí)時(shí)顯示改淑,并在屬性區(qū)顯示這些控件的屬性,項(xiàng)目區(qū)用于顯示控件間的層級(jí)關(guān)系浴讯。

  • 第二步,讓我們開(kāi)始創(chuàng)建一個(gè)GUI的基礎(chǔ)框架溅固,先從控件區(qū)里的Forms中添加一個(gè)Frame,這是GUI的輪廓基礎(chǔ):

*第三步是在Frame下添加一個(gè)Layout中的wxBoxSizer兰珍,后續(xù)所有控件均是放在wxBoxSizer里的侍郭。

如果你覺(jué)得單個(gè)wxBoxSizer里的控件布局太單調(diào),你可以嵌套使用wxBoxSizer掠河,這是實(shí)現(xiàn)GUI界面控件布局多樣化的關(guān)鍵亮元。

本次編寫(xiě)的文本編輯器就嵌套了wxBoxSizer,需要在第一個(gè)wxBoxSizer中再添加一個(gè)wxBoxSizer:

接著在右側(cè)的屬性區(qū)修改其相關(guān)的屬性唠摹,將bSizer2的orient改為wxHORIZONTZL爆捞,proportion改為0。

這樣bSizer2中的控件就變成水平排列的了勾拉,而且bSizer2在bSizer1中的比例為保持bSizer2中的控件大小煮甥,具體的效果會(huì)在后面顯示出來(lái):

  • 第四步,在bSizer2中添加Common中的1個(gè)wxTextCtrl藕赞,2個(gè)wxButton:

現(xiàn)在就能看到第三步中對(duì)bSizer2的orient和proportion屬性設(shè)置的效果了成肘,三個(gè)控件依次水平排列,且整個(gè)bSizer2的高度是與其中控件高度有關(guān)的斧蜕。

接下來(lái)分別修改m_textCtrl1双霍、m_button和m_button2的屬性,將其name依次改名為filePath批销、open和save洒闸,將textCtrl的proportion改為1,兩個(gè)button的label改為“打開(kāi)”和“保存”均芽,最終效果為:

  • 第五步丘逸,在bSizer1下再添加一個(gè)wxTextCtrl,并將name修改為content掀宋,proportion改為1深纲,flag下勾選wx.EXPAND羞反,其效果為:

flag=wx.EXAPND和proportion=1使得整個(gè)文本框填充了bSizer1的剩余空間,這樣一個(gè)文本編輯框的UI就初步完成了囤萤。

接下點(diǎn)擊Editor下的Python標(biāo)簽昼窗,就能看到UI對(duì)應(yīng)的源碼了,將其復(fù)制起來(lái):

打開(kāi)你的python IDE涛舍,創(chuàng)建一個(gè)project澄惊,將源碼粘貼到里面。

MyFrame1添加兩個(gè)方法富雅,分別用來(lái)打開(kāi)和保存文本掸驱,需傳入event來(lái)綁定按鍵:

    def open(self, event): # 打開(kāi)文件
        # 彈出文件選擇對(duì)話框
        dlg = wx.FileDialog(self, u'選擇要打開(kāi)的txt文件', style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK: 
            # 按下OK后的邏輯
            self.fileName.SetValue(dlg.GetPath()) # 將選擇文件的路徑輸出到fileName里
            file = open(self.fileName.GetValue()) # 以只讀打開(kāi)選中文件
            self.textEdit.SetValue(file.read()) # 將文件中的文本輸出到textEdit里
            file.close() # 關(guān)閉文件
        dlg.Destroy() # 關(guān)閉對(duì)話框

    def save(self, event): # 保存文件
        file = open(self.fileName.GetValue(), 'w') # 打開(kāi)選中文件,可編輯
        file.write(self.textEdit.GetValue()) # 將textEdit中的文本寫(xiě)入文件
        file.close() # 關(guān)閉文件

MyFrame1.__init__()下為兩個(gè)方法綁定對(duì)應(yīng)按鍵:

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)建一個(gè)應(yīng)用程序?qū)ο竺挥印C總€(gè)wxPython程序必須有一個(gè)應(yīng)用程序?qū)ο蟆?
    frame = MyFrame1(None) # 創(chuàng)建一個(gè)MyFrame1對(duì)象
    frame.Show() # 調(diào)用該對(duì)象的 Show()方法以在屏幕上實(shí)際顯示它
     # 進(jìn)入主循環(huán)毕贼。主循環(huán)是一個(gè)無(wú)盡的循環(huán)。它捕獲并發(fā)送應(yīng)用程序生命周期中存在的所有事件蛤奢。
    app.MainLoop() 
   

到此鬼癣,一個(gè)文本編輯器就寫(xiě)完了,運(yùn)行效果如下:

源碼

# -*- coding: utf-8 -*-

import wx

###########################################################################
## Class MyFrame1
###########################################################################

class MyFrame1(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"打開(kāi)", 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):
        pass

    def open(self, event): # 打開(kāi)文件
        # 彈出文件選擇對(duì)話框
        dlg = wx.FileDialog(self, u'選擇要打開(kāi)的txt文件', style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK: # 按下OK后的邏輯
            self.fileName.SetValue(dlg.GetPath()) # 將選擇文件的路徑輸出到fileName里
            file = open(self.fileName.GetValue()) # 以只讀打開(kāi)選中文件
            self.textEdit.SetValue(file.read()) # 將文件中的文本輸出到textEdit里
            file.close() # 關(guān)閉文件
        dlg.Destroy() # 關(guān)閉對(duì)話框

    def save(self, event): # 保存文件
        file = open(self.fileName.GetValue(), 'w') # 打開(kāi)選中文件啤贩,可編輯
        file.write(self.textEdit.GetValue()) # 將textEdit中的文本寫(xiě)入文件
        file.close() # 關(guān)閉文件

if __name__ == '__main__':

    app = wx.App()
    frame = MyFrame1(None)
    frame.Show()

    app.MainLoop()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末待秃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痹屹,更是在濱河造成了極大的恐慌章郁,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件志衍,死亡現(xiàn)場(chǎng)離奇詭異暖庄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)楼肪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)培廓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淹辞,你說(shuō)我怎么就攤上這事医舆。” “怎么了象缀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爷速。 經(jīng)常有香客問(wèn)我央星,道長(zhǎng),這世上最難降的妖魔是什么惫东? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任莉给,我火速辦了婚禮毙石,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颓遏。我一直安慰自己徐矩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布叁幢。 她就那樣靜靜地躺著滤灯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曼玩。 梳的紋絲不亂的頭發(fā)上鳞骤,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音黍判,去河邊找鬼豫尽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛顷帖,可吹牛的內(nèi)容都是我干的美旧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贬墩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陈症!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起震糖,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤录肯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吊说,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體论咏,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年颁井,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厅贪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雅宾,死狀恐怖养涮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眉抬,我是刑警寧澤贯吓,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蜀变,受9級(jí)特大地震影響悄谐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜库北,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一爬舰、第九天 我趴在偏房一處隱蔽的房頂上張望们陆。 院中可真熱鬧,春花似錦情屹、人聲如沸坪仇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)椅文。三九已至,卻和暖如春蜡镶,著一層夾襖步出監(jiān)牢的瞬間雾袱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工官还, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芹橡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓望伦,卻偏偏與公主長(zhǎng)得像林说,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屯伞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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