<<Python基础教程>>学习笔记 | 第12章 | 图形用户界面
Python支持的工具包非常多。但没有一个被觉得标准的工具包。用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/
------
丰富的平台:
Tkinter实际上类似于标准,由于它被用于大多数正式的Python GUI程序。并且它是Windows二进制公布版的一部分。
可是在UNIX上要自己编译安装。
还有一个越来越受欢迎的工具是wxPython。
这是个成熟并且特性丰富的包,也是Python之父,Guido van Rossum的最爱
------
下载安装wxPython
http://wxpython.org/download.php
NOTE:
1. 注意选择跟自己PC的二进制版本号相应的Python版本号
2. 下载wxPython后,强烈建议下载演示版本号(demo),演示样例程序很具体
------
创建演示样例GUI程序
最简单的演示样例程序例如以下:
>>> import wx #导入模块
>>> app = wx.App() #初始化主要的引用程序类
>>> app.MainLoop() #wx中的包方法大写开头,与Python习惯相反
窗体和组件
窗体也称为框架,它是wx.Frame类的实例。wx框架中的部件都是由它们的父部件作为构造函数的第一个參数创建的。假设正在创建的一个单独的窗体,就不须要考虑父部件,使用None就可以。
并且在调用app.MainLoop前须要调用窗体的
Show方法--否则它会一直隐藏.
- 程序清单1:
import wx
app = wx.App()
win = wx.Frame(None)
win.Show()
app.MainLoop()
- 程序清单2: 在框架上加入button
#在框架上加入button也非常easy,仅仅要使用win作为父參数实例化wx.Button就可以.
import wx
app = wx.App()
win = wx.Frame(None)
btn = wx.Button(win)
win.Show()
app.MainLoop()
- 程序清单3: 使用keyword參数添加标签和标题
import wx
app = wx.App()
win = wx.Frame(None,title="Simple Editor")
loadButton = wx.Button(win,label='Open')
saveButton = wx.Button(win,label='Save')
win.Show()
app.MainLoop()
看样子丢了一个button,实际上隐藏了。假设要显示出来,里面的post,size就得用上.
- 程序清单4: 设置button位置
import wx app = wx.App()
win = wx.Frame(None,title="Simple Editor",size=(410,335))
win.Show()
#位置坐标,x与y的值
loadButton = wx.Button(win,label='Open',pos=(225,5),size=(80,25))
saveButton = wx.Button(win,label='Save',pos=(315,5),size=(80,25))
#文本框(wx.TextCtrl的对象),默认可编辑。无滚动栏
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)
#style參数,能够使用按位或OR联合wx模块中具有特殊名字的风格来指定
#wx.TE_MULTILINE 垂直滚动栏
#wx.HSCROLL 水平滚动栏
app.MainLoop()
------
更智能的布局
在wx内进行布局的最简单方法是使用尺寸器(sizer),最easy使用的工具是wx.BoxSizer。尺寸器会管理组件的尺寸。仅仅要将部件加入到尺寸器上,再加上一些布局參数。然后让尺寸器自己去管理父组件的尺寸。在上面的样例中,须要添加背景组件(wx.Panel)。创建一些嵌套的wx.BoxSizer,然后使用面板的SetSizer方法设定它的尺寸器。
- 程序清单5: 使用尺寸器
#代码的执行效果和上例同样,仅仅只是用相对坐标而不是绝对坐标
import wx app = 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)
#wx.BoxSizer两个參数wx.HORIZONTAL(垂直),wx.VERTICAL(水平,默认)
#Add方法有几个參数,proportion參数依据在窗体改变大小时所分配空间设置比例
#比如:水平的BoxSizer中,filename组件在改变大小时获取所有的额外空间
#假设这3个部件都把proprotion设置为1,那么都会获取相等的空间
#能够讲proportion设定为不论什么数
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) #flag參数相似于style參数,能够使用|或者OR连接构造符号常量对其进行构造
#wx.EXPAND标记确保组件会扩展到所有分配的空间中。而wx.LEFT,wx.RIGHT,wx.TOP,
#wx.BOTTOM和wx.ALL标记决定边框參数应用于哪个边。用于设置边缘宽度
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()
布局已经好了,但点击button后什么反应也没有
------
完毕了的程序
剩下的工作,须要两个处理函数:load和save。
当事件处理函数被调用时。事件对象event是唯一的參数
#文件名称使用filename对象的GetValue方法获取
#为了将文本引入文本区,仅仅要使用contents.SetValue就可以.
def load(event):
file = open(filename.GetValue())
contents.SetValue(file.read())
file.close()
#save函数差点儿和load一样,除了它有个'w'属性以及write方法.
#GetValue用于从文本区获得信息
def save(event):
file = open(filename.GetValue(),'w')
file.write(contents.GetValue())
file.close()
- 程序清单6: 终于的程序
import wx def 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()
------
其它工具包
能够看以下最简单样例,仅仅有一个窗体,带有Hello标签的button,点击button时。它会打印文本"Hello,World!"
代码例如以下:
import wx
def 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()
------
使用Tkinter
Python自带的,以下是使用Tkinter实现的GUI程序
from Tkinter import * def hello():
print ('Hello,World!') win = Tk()
win.title('Hello,Tkinter!')
win.geometry('200x100') btn = Button(win,text='Hello',command=hello)
btn.pack(expand=YES,fill=BOTH) mainloop()
------
其它还能够使用Jython和Swing
Jython: Python的Java实现,类似于wxPython和Tkinter这种包就不能用了。唯一可用的GUI工具包是Java标准库包
中的AWT和Swing。
<<Python基础教程>>学习笔记 | 第12章 | 图形用户界面的更多相关文章
- <<Python基础教程>>学习笔记 | 第10章 | 充电时刻
第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...
- <<Python基础教程>>学习笔记 | 第11章 | 文件和素材
打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...
- <<Python基础教程>>学习笔记 | 第04章 | 字典
第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...
- <<Python基础课程>>学习笔记 | 文章13章 | 数据库支持
备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...
- CSS3秘笈第三版涵盖HTML5学习笔记9~12章
第9章,装饰网站导航 限制访问,处于隐私方面考虑,浏览器已经开始限制可以对伪类:visited应用哪些CSS属性了.其中包括对已访问过的链接定义color.background-color.borde ...
- Python基础教程(第3版) 笔记(三)
1.9.1让脚本像普通程序一样在UNIX中运行脚本,只需将下面的代码作为脚本的第一行, 就可在UNIX中轻松运行脚本: #!/usr/bin/env python 要像普通程序一样运行脚本,还必须将其 ...
- Python基础教程(第3版) 笔记(二)
1.8模块Python提供了完成(某人的年 龄为32.9,并想将这个值向下圆整为32,因为他还没有满33岁)这种任务的函 数floor.导入模块,可以使用特殊命令import.函数floor包含在模块 ...
- Python基础教程(第3版) 笔记(一)
1.1 数和表达式: 除法运算的结果为小数,即浮点数 >>>1/2 0.5 除法运算为整数,使用双斜杠 >>>1//2 0 >>>5.0//2.4 ...
- Python基础教程思维导图笔记
说明:直接查看图片可能不太清楚,用浏览器打开后,按住 Ctrl ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- IOS系统兼容input keyup事件
最近在做移动端模糊搜索功能,js监听input的keyup事件,在chrom模拟器和android手机环境运行都没有问题,到了ios手机却出现bug,没法实现功能: 查了好一会资料,发现keyup事件 ...
- 加密中加salt的意思
所谓加Salt,就是加点“佐料”.当用户首次提供密码时(通常是注册时),由系统自动往这个密码里加一些“Salt值”,这个值是由系统随机生成的,并且只有系统知道.然后再散列.而当用户登录时,系统为用户提 ...
- 【JavaEE WEB 开发】Tomcat 具体解释 Servlet 入门
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/47146817 一. Tomcat 下载安装配置 1. Tomcat 下载 T ...
- 实践补充 Installing Tomcat 7.0.x on OS X
我的 Mac 下是1.6的 SDK,下载 Tomcat 8.0 执行后,訪问 http://127.0.0.1:8080 并无反应,并且关闭脚本会报错 : Unsupported major.mino ...
- Cocos2d-x-lua学习点滴
Lua下的方法.自己项目经验,个人见解,不能确保正确. Sprite: local Light = CCSprite:create("light.png") ...
- 开发者了解NET的15个特性
NET 开发者了解的15个特性 本文列举了 15 个值得了解的 C# 特性,旨在让 .NET 开发人员更好的使用 C# 语言进行开发工作. ObsoleteAttribute ObsoleteAttr ...
- javascript系列-class9.DOM(上)
欢迎加入前端交流群交流知识获取视频资料:749539640 1.文档对象模型DOM(document Object Model) 所谓DOM就是以家族的形式描述HTML 节点 ...
- python 3.x 学习笔记14 (socket_ssh and socket_文件传输)
ssh服务端 import socket,os server = socket.socket() server.bind(('localhost',6666)) server.listen() con ...
- Codeforces 982 B. Bus of Characters(模拟一个栈)
解题思路: 排序之后模拟一个栈(也可以用真的栈),时间复杂度o(n). 代码: #include <bits/stdc++.h> using namespace std; typedef ...
- SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持
1. Hystrix对Feign的支持 添加Feign中IUserBiz的实现类HystrixFallBack: package com.wangx.cloud.springcloud02consum ...