博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python学习笔记(图形用户界面)
阅读量:5172 次
发布时间:2019-06-13

本文共 3988 字,大约阅读时间需要 13 分钟。

GUI

python提供了多个图形开发界面的库,几个常用Python GUI库如下:

Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macintosh系统里.,Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。

wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。

Jython:Jython程序可以和Java无缝集成。除了一些标准模块,Jython使用Java的模块。Jython几乎拥有标准的Python中不依赖于C语言的全部模块。比如,Jython的用户界面将使用Swing,AWT或者SWT。Jython可以被动态或静态地编译成Java字节码。

安装:

本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口。这里介绍wxPython :

下载地址:

根据自己的操作系统下载相应版本。

安装过程非常简单,以win7系统为例,点击下载的exe 文件,保持安装目录与本机的python目录一致就OK了。

 

创建并显示一个框架

import wxapp=wx.App()win=wx.Frame(None)win.Show()app.MainLoop()

运行:

 

 

我们来创建一个文本编辑器,功能要求如下:

  * 它可以打开给定文件名的文本文件;

  * 它可以编辑文件文件

  * 它可以保存文本文件

  * 它可以正常退出程序

import wxapp=wx.App()win=wx.Frame(None,title='Simple Editor',size=(410,335))win.Show()loadButton=wx.Button(win,label='Open',pos=(225,5),size=(80,25))saveButton=wx.Button(win,label='Save',pos=(315,5),size=(80,25))filename=wx.TextCtrl(win,pos=(5,5),size=(210,25))contents=wx.TextCtrl(win,pos=(5,35),size=(390,260),style=wx.TE_MULTILINE| wx.HSCROLL)app.MainLoop()

结果:

更智能的布局

使用尺寸器

import wxapp=wx.App()win=wx.Frame(None,title='Simple Editor',size=(410,335))bkg=wx.Panel(win)loadButton=wx.Button(bkg,label='Open')saveButton=wx.Button(bkg,label='Save')filename=wx.TextCtrl(bkg)contents=wx.TextCtrl(bkg,style=wx.TE_MULTILINE| wx.HSCROLL)hbox=wx.BoxSizer()hbox.Add(filename,proportion=1,flag=wx.EXPAND)hbox.Add(loadButton,proportion=0,flag=wx.LEFT,border=5)hbox.Add(saveButton,proportion=0,flag=wx.LEFT,border=5)vbox=wx.BoxSizer(wx.VERTICAL)vbox.Add(hbox,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)vbox.Add(contents,proportion=1,flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT,border=5)bkg.SetSizer(vbox)win.Show()app.MainLoop()

运行结果:

运行这段代码,窗口会和上面的相同,但是使用了相对坐标而不是绝对坐标。

wx.BoxSizer的构造函数带有一个决定它是水平还是垂直的参数,默认为水平。

add方法有几个参数,proportion参数根据在窗口改变大小时所分配的空间设置比例。flag参数类似于构造函数中的style参数,可以使用按位或运算符连接构造符号常量。

事件处理

上面的界面做好了,但是我们点击按钮不起任何的作用。

在GUI术语中,用户执行的动作(比如 点击按钮)叫做事件。我们需要让程序注意这些事件并且作出反应。

假设写了一个负责打开文件的函数,并将其命令为load ,然后就可以像下面这样将函数作为loadButton的事件处理函数:

loadButton.Bind(wx.EVT_BUTTON,load)

完成了的程序

让我们来完成剩下的工作,现在需要的就是两个事件处理函数:load(打开)和save(保存)。当事件被调用时,它会收到一个事件对象作为它唯一的参数,其中包括发生了什么事情的信息,但是在这里可以忽略这方法的事情,因为程序只关心点击时发生的事情。

def load(event):    file=open(filename.GetValue())    contents.SetValue(file.read())    file.close()

上节刚刚学过文件的打开/读取,文件名使用filename对象GetValue方法获取。为了将文本引入文本区,只要使用contents.SetValue即可。

 

save函数和load类似,除了它需要写入(‘w’),以及用于文件处理部分的write方法,GetValue用于从文本区获得信息。

def save(event):    file=open(filename.GetValue(),'w')    file.write(contents.GetValue())    file.close()

最终的GUI程序

import wxdef load(event):    file=open(filename.GetValue())    contents.SetValue(file.read())    file.close()def save(event):    file=open(filename.GetValue(),'w')    file.write(contents.GetValue())    file.close()    app=wx.App()win=wx.Frame(None,title='Simple Editor',size=(410,335))bkg=wx.Panel(win)loadButton=wx.Button(bkg,label='Open')loadButton.Bind(wx.EVT_BUTTON,load)saveButton=wx.Button(bkg,label='Save')saveButton.Bind(wx.EVT_BUTTON,save)filename=wx.TextCtrl(bkg)contents=wx.TextCtrl(bkg,style=wx.TE_MULTILINE| wx.HSCROLL)hbox=wx.BoxSizer()hbox.Add(filename,proportion=1,flag=wx.EXPAND)hbox.Add(loadButton,proportion=0,flag=wx.LEFT,border=5)hbox.Add(saveButton,proportion=0,flag=wx.LEFT,border=5)vbox=wx.BoxSizer(wx.VERTICAL)vbox.Add(hbox,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)vbox.Add(contents,proportion=1,flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT,border=5)bkg.SetSizer(vbox)win.Show()app.MainLoop()

运行结果:

使用步骤:

下面玩转这个小程序步骤:

1、文本框输入hello8.txt 

2、文本区输入Hello.world!

3、点击保存(不会有保存成功的提示,但它已经成功了)

4、关闭编辑器,重新运行打开。

5、文件框输入hello8.txt ,点击“打开”按钮,上次编辑的内容(Hello.world!)在文本区出现了。

 

窗口含有一个‘hello’标签按钮,点击hello,会在文本框中显示'Hello,world!'

import wxdef hello(event):    print 'Hello,world!'app=wx.App()win=wx.Frame(None,title='Hello,wxPython!',size=(200,100))button=wx.Button(win,label='Hello')button.Bind(wx.EVT_BUTTON,hello)win.Show()app.MainLoop()

 

转载于:https://www.cnblogs.com/whats/p/4742422.html

你可能感兴趣的文章
[UVA 10529]Dumb Bones
查看>>
地铁开发进度04
查看>>
Memcache 缓存系统
查看>>
Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误
查看>>
Java语法基础学习DayTwo
查看>>
eclipse启动tomcat无法访问的解决方法(转)
查看>>
Mac端SVN工具CornerStone详解
查看>>
Opengl es2.0 学习笔记(十)VBO、IBO和FBO
查看>>
KVM通过qemu实现USB重定向
查看>>
2015年7月15日 JS第一课(JS,声明变量,数据类型)
查看>>
poj3683 Priest John's Busiest Day 2011-12-26
查看>>
STM32串口通信(使用C8T6)
查看>>
netty使用(5)client_server一发一回阐释ByteBuffer的使用
查看>>
Eclipse中经常出现的问题解决方案
查看>>
CSS
查看>>
Mysql之左连接右连接内连接——示例
查看>>
孪生素数问题--nyoj26
查看>>
Cheatsheet: 2016 02.01 ~ 02.29
查看>>
万能数据库查询分析器 5.05发布,本人为之撰写的相关技术文章达65篇
查看>>
剑指offer【书】之简历抒写
查看>>