wxPython笔记

wxPython简介

wxPython是一个用于创建桌面GUI应用程序的跨平台工具包。wxPython的主要作者是Robin Dunn。使用wxPython,开发人员可以在Windows,Mac和各种Unix系统上创建应用程序。wxPython是wxWidgets的包装器,它是一个成熟的跨平台C ++库。

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

安装wxPython

pip 是 Python 的包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。在Python官网下载较新版本的Python,就会自带pip。

输入命令行指令:

pip install wxpython

wxFormBuilder

wxFormBuilder是一款基于wxWidgets的GUI可视化编辑工具,可用于Python的GUI设计。

wxFormBuilder项目GitHUb:www.wxformbuilder.org/

下载地址:wxFormBuilder_win32.zip

第一个wxPython程序

接下来,我们借助wxFormBuiler来编写一个简单的文本编辑器以此来熟悉wxPython的使用。

第一步,打开wxFormBuilder,可见到如下界面。

界面主要分为四大区:项目区Object Tree、控件区Component Palette、编辑区Editor、属性区Object Properties。

控件区里点击添加需要的控件,这些控件的效果会在编辑区里实时显示,并在属性区显示这些控件的属性,项目区用于显示控件间的层级关系。

第二步,让我们开始创建一个GUI的基础框架,先从控件区里的Forms中添加一个Frame,这是GUI的轮廓基础:

*第三步是在Frame下添加一个Layout中的wxBoxSizer,后续所有控件均是放在wxBoxSizer里的。

如果你觉得单个wxBoxSizer里的控件布局太单调,你可以嵌套使用wxBoxSizer,这是实现GUI界面控件布局多样化的关键。

本次编写的文本编辑器就嵌套了wxBoxSizer,需要在第一个wxBoxSizer中再添加一个wxBoxSizer:

接着在右侧的属性区修改其相关的属性,将bSizer2的orient改为wxHORIZONTZL,proportion改为0。

这样bSizer2中的控件就变成水平排列的了,而且bSizer2在bSizer1中的比例为保持bSizer2中的控件大小,具体的效果会在后面显示出来:

第四步,在bSizer2中添加Common中的1个wxTextCtrl,2个wxButton:

现在就能看到第三步中对bSizer2的orient和proportion属性设置的效果了,三个控件依次水平排列,且整个bSizer2的高度是与其中控件高度有关的。

接下来分别修改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,创建一个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()# 关闭文件dlg.Destroy()# 关闭对话框defsave(self, event):# 保存文件file = open(self.fileName.GetValue(),'w')# 打开选中文件,可编辑file.write(self.textEdit.GetValue())# 将textEdit中的文本写入文件file.close()# 关闭文件

在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()# 创建一个应用程序对象。每个wxPython程序必须有一个应用程序对象。frame = MyFrame1(None)# 创建一个MyFrame1对象frame.Show()# 调用该对象的 Show()方法以在屏幕上实际显示它# 进入主循环。主循环是一个无尽的循环。它捕获并发送应用程序生命周期中存在的所有事件。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()# 关闭文件dlg.Destroy()# 关闭对话框defsave(self, event):# 保存文件file = open(self.fileName.GetValue(),'w')# 打开选中文件,可编辑file.write(self.textEdit.GetValue())# 将textEdit中的文本写入文件file.close()# 关闭文件if__name__ =='__main__':    app = wx.App()    frame = MyFrame1(None)    frame.Show()    app.MainLoop()

作者:1vxy

链接:https://www.jianshu.com/p/fcca035b04b6

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容