简易文本编辑器

Python图形用户界面

Python如此强大,图形化编程做起来自然是毫不费力,并且实现方式多样,首先来看一下有哪些种方式可以实现Python图形化编程:

Tkinter 使用 TK 平台,版标准化

Wxpython 基于 wxwindows 跨平台

Pythonwin 使用用于 windows

Java swing 只用用于 jython

pyGTK 使用 GTK 平台 流行于linux

Pyqt 使用 QT 平台 跨平台

pip install wxpython

安装后进行测试,创建test.py文件,写入以下代码然后执行:

import wx

app = wx.App()

win = wx.Frame(None)

win.Show()

app.MainLoop()

如果出现灰白框表示运行成功,代码解释:

wx.App使用wx.App类创建一个应用程序对象;app.MainLoop()进入主循环。主循环是一个不停的捕捉你应用程序发生的事件的无穷循环。它对任何GUI应用程序来说都是一个完整的部分。接下来详细说一下wx.Frame,该方法创建一个框架构件。仅当调用一个构件的show方法,才会显示。窗口组件参数说明:

parent父组件,如果设置为None,代表该组件为顶级组件

id组件的编号,对组件的标识,同一窗口不能出现id相同的组件

title窗口的标题

pos窗口的位置,需要一个双元素元组,形成坐标系,来规定窗口距左距右距离

size窗口的大小,需要一个双元素元组,来规定窗口的长和高

style组件的样式

以做一个简易的文本阅读编辑器为例,对于所需要的组件,以需要的参数做主要讲解:

首先添加一个文本输入框,文本输入框的组件为wx.TextCtrl,该组件的参数:

parent:置于哪个Frame上

pos:参数为一个元组,该组件在Frame上的位置

size:参数为一个元组,该组件在Frame上展示的大小

其次添加两个按钮,按钮的组件为wx.Button,该组件的参数:

parent:置于哪个Frame上

label:参数为一个字符串,该组件显示的内容

pos:参数为一个元组,该组件在Frame上的位置

size:参数为一个元组,该组件在Frame上展示的大小

再次添加一个显示的文本框,添加之后的代码如下:

import wx

app = wx.App()

win = wx.Frame(None,title='SE',size=(500,600))

win.Show()

filename = wx.TextCtrl(win,pos = (5,5),size = (250,25))

bt1 = wx.Button(win,label='打开',pos=(260,5),size=(110,25))

bt1 = wx.Button(win,label='保存',pos=(370,5),size=(110,25))

content = wx.TextCtrl(win,pos=(5,35),size=(475,520),style=wx.TE_MULTILINEwx.HSCROLL)

app.MainLoop()

代码编写至此,可以发现,对于图形化的布局是非常困难的,所以引入一个wx.Panel,该组件可以理解为一个画布,然后将各种组件放置于画布上,这样对于布局会有非常明显的效果,而Panel的参数自然是一个Frame。

高效使用Panel,需要使用一个东西来管理布局,这个东西称之为尺寸器,也就是wx.BoxSizer组件,而位置的固定自然分为横向和纵向,而横向和纵向的区分自然根据定义组件时所传入的参数来区分。默认为横向尺寸器,传入wx.VERTICAL表示纵向尺寸器。

将基本组件添加到尺寸器中,使用尺寸器的add方法,该方法的参数如下:

proportion参数定义了构件在既定方向上所占空间的比例,是相对的,相对于其他组件

flag参数可以使用来产生组合的多个flags,flags参数定义了两个主要的行为:

第一个参数是窗口的边框:这个参数决定了边框的宽度,在此决定窗口某一侧添加边框的事件。

第二个参数决定了sizer事件的行为,当sizer改变时,空间的分配。并且分配的多少依赖于特定种类的sizer被使用。

Border定义宽度

经过再次处理之后的代码如下:

import wx

app = wx.App()

win =wx.Frame(None,title='SE',size=(500,600))

panel = wx.Panel(win)

obt = wx.Button(panel,label='打开')

sbt = wx.Button(panel,label='保存')

filename = wx.TextCtrl(panel)

content =wx.TextCtrl(panel,style = wx.TE_MULTILINEwx.HSCROLL)

sbox = wx.BoxSizer()

sbox.Add(filename,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

sbox.Add(obt,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

sbox.Add(sbt,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

vbox = wx.BoxSizer(wx.VERTICAL)

vbox.Add(sbox,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

vbox.Add(content,proportion=9,flag=wx.EXPANDwx.ALL,border=1)

panel.SetSizer(vbox)

win.Show()

app.MainLoop()

再次执行,可以看到一个最初定义的简易文本编辑器的样子,接下来就是使点击按钮能有相应的动作,这种动作我们称之为事件,定义事件时需要传入event,这是wx模块封装好的。

接下来就是事件的绑定,绑定事件使用组件的Bind方法来实现,具体绑定方式,看最终代码:

import wx

def ob(event):

path =filename.GetValue()

f =open(path,'r')

content.SetValue(f.read())

f.close()

def sb(event):

path =filename.GetValue()

f =open(path,'a')

f.write(content.GetValue())

f.close()

app = wx.App()

win = wx.Frame(None,title='SE',size=(500,600))

panel = wx.Panel(win)

obt = wx.Button(panel,label='打开')

obt.Bind(wx.EVT_BUTTON,ob)

sbt = wx.Button(panel,label='保存')

sbt.Bind(wx.EVT_BUTTON,sb)

filename = wx.TextCtrl(panel)

content = wx.TextCtrl(panel,style =wx.TE_MULTILINEwx.HSCROLL)

sbox = wx.BoxSizer()

sbox.Add(filename,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

sbox.Add(obt,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

sbox.Add(sbt,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

vbox = wx.BoxSizer(wx.VERTICAL)

vbox.Add(sbox,proportion=1,flag=wx.EXPANDwx.ALL,border=1)

vbox.Add(content,proportion=9,flag=wx.EXPANDwx.ALL,border=1)

panel.SetSizer(vbox)

win.Show()

app.MainLoop()

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180106G003AS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券