<<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 ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- 数据库ifnull方法
IFNULL(expr1,expr2)如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2.IFNULL()返回一个数字或字符串值.例如: ifnull() 如果sum(t ...
- 笔试中java的输入输出
一,输入 import java.util.*; import java.io.*; public class Main { public static void main(String[] args ...
- 第八章 Servlet概述
第八章 Servlet概述 主要内容: 了解servlet: 掌握servlet实现: 掌握servlet的生命周期. servlet概念 Servlet是运行在服务器端用Java语言编写的应用程序, ...
- Tarjan强联通分量【模板】
#include <algorithm> #include <cstdio> using namespace std; ); int n,m,v,u; int edgesum, ...
- Leetcode_num1_Single Number
好久没有做题啦.从今天開始刷Leetcode的题.希望坚持的时间能长一点. 先从ac率最高的Single Number開始吧. 题目: Given an array of integers, ever ...
- Android解决ScrollView视图导致其底部的布局栏被推到上边的问题
近期有个xml布局文件,我说下大概意思: <ScrollView> ...... </ScrollView> <RelativeLayout> ...... < ...
- poj_1952最大下降子序列,统计个数
其实不算难的一道题,但憋了我好久,嗯,很爽. #include<iostream> #include<cstdio> #include<string.h> #inc ...
- kentico api
http://devnet.kentico.com/docs/10_0/api/html/R_Project_Kentico_API.htm ScriptHelper.RegisterClientSc ...
- [codeforces 1037D] Valid BFS? 解题报告(验证bfs序,思维题)
题目链接:http://codeforces.com/problemset/problem/1037/D 题目大意: 给出一棵树,询问一个序列是否可能为这棵树从节点1开始遍历的bfs序 题解: 对于每 ...
- Android VelocityTracker类和Scroller类
VelocityTracker类:用于跟踪触屏事件的速度,通常使用VelocityTracker的步骤如下: static VelocityTracker obtain():获取一个VelocityT ...