<<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 ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- C/C++ Swap without using extra variable
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50255379 对于可以线性运算的变量, ...
- spring boot pom
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)
转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...
- [poj3974] Palindrome 解题报告 (hash\manacher)
题目链接:http://poj.org/problem?id=3974 题目: 多组询问,每组给出一个字符串,求该字符串最长回文串的长度 数据范围支持$O(nlog n)$ 解法一: 二分+hash ...
- RGB颜色值与十六进制颜色码转换工具
RGB颜色值转换成十六进制颜色码: 十六进制颜色码转换成RGB颜色值: 颜色码对照表 颜色 英文代码 形象描述 十六进制 RGB LightPink 浅粉红 #FFB6C1 255, ...
- 阿里巴巴战略投资印度最大支付平台Paytm
腾讯科技讯 9月29日,据路透社报道,阿里巴巴和印度最大移动支付和商务平台Paytm今天发布联合声明,宣布阿里巴巴集团及其旗下金融子公司蚂蚁金服将向Paytm注入新资金.阿里称这是一项“战略性的”投资 ...
- CDR X6低价还能持续多久?官方回应18年元旦过后要涨价
目前,CDR X6特价活动,从双十二的到18年的元旦,火热程度一直屡刷新高,究其原因,其实不是大家不需要,只是这个平面设计软件价格实在太高(CDR X8/8200:CDR 2017/9500一套),尤 ...
- [SCOI2009]windy数 数位dp
Code: #include<cmath> #include<iostream> #include<cstdio> using namespace std; con ...
- 简洁的MVC思想框架——Nancy(Session的使用)
前文提到关于Nancy中GET和POST以及外部引用图片,css和JS的文件等操作.今天所讲的是Nancy关于Session相关操作. Session作为web开发中极其重要的一部分,而Nancy中S ...
- git clone 和 git pull 代码无响应
记录一下今天 git 拉代码遇到的一些异常情况: 无论是项目目录下 git pull 还是直接 git clone 都不能正常拉代码: 异常情况1 ssh: connect to host gitee ...