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()
领取专属 10元无门槛券
私享最新 技术干货