上海交通大学 python程序设计课程PPT Ch8-1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

16
例:按钮
• 下例中按钮对应的函数是root对象的方法quit
>>> b=Button(root,text="Quit",command=root.quit) >>> b.pack() >>> root.mainloop() # 点击按钮退出主循环,回到>>>
• 下例中按钮对应的函数是自定义函数
图形用户界面
程序的用户界面
• 程序中与用户进行交互的部分
– 用户通过UI向程序输入数据或者请求程序执 行特定任务 – 程序通过UI向用户显示各种信息
• UI应该是用户友好的 • 两类UI
– 命令行界面 – 图形界面(GUI)
2
GUI构件
• 窗口Window
– 是容器:可以容纳其他构件的构件 – 程序有一个根窗口
20
常用构件:框架
• 类Frame:构件容器,用于窗口分隔
f = Frame(窗口,选项设置) – width,height,bd,relief – 框架中的子构件独立地进行布局
• 例如
>>> >>> >>> >>> >>> f = Frame(root,bd=4,relief="groove") f.pack() Checkbutton(f,text="Math").pack() Checkbutton(f,text="Python").pack() Checkbutton(f,text="English").pack()
from Tkinter import * root = Tk() root.mainloop()
9
在窗口ห้องสมุดไป่ตู้添加构件
• 两步:
– 创建 – 布局
• 例:eg8_2.py
from Tkinter import * root = Tk() aLabel = Label(root,text="Hello World") aLabel.pack() root.mainloop()
• • • •
标签Label 按钮Button 菜单Menu 框架Frame
– 也是容器
窗口W 框架F1 勾选钮C1 勾选钮C2 OK Cancel 框架F2
3
构件之间的关系
• 父子关系
– 在一个构件内创建另一个构件 – 界面上全体构件形成一个层次结构 – 顶层是根窗口
• 父构件内安排子构件:使用布局管理器
一组单选钮共用一个控制变量
>>> >>> >>> >>> >>> v = IntVar() v.set(1) Radiobutton(root,text="One",variable=v,value=1).pack() Radiobutton(root,text="Two",variable=v,value=2).pack() Radiobutton(root,text="Three",variable=v,value=3).pack()
4
事件驱动
• GUI程序的执行流程取决于与用户的实 时交互
– 例如:Word程序的执行
• 事件驱动编程
– 普通程序的执行:启动——做事——终止 – 事件驱动程序的执行:启动——事件循环
等待事件发生,然后处理 程序的终止也是由特定事件(如关闭窗口事件)引 起的
5
基本概念
• 事件:例如点击鼠标,按下键盘等. • 事件处理程序:对事件进行处理的代码. • 事件驱动编程:一种编程范型
–程序有一个事件循环
事件监测
OS功能,由工具包提供支持
事件处理
应用程序员只需编写自己的事件处理程序
6
GUI编程
• 需要GUI工具包
– 将低层细节对程序员隐藏 – 跨平台 – Python标准库:Tkinter
• GUI编程
– 设计界面外观 – 为每个构件定义事件处理代码 – 建立启动初始化和总控部分
21
常用构件:菜单
• 类Menu
– 创建菜单构件 – 与窗口关联 – 添加菜单项
菜单项:简单命令,级联式菜单,勾选钮,一组单选钮
• 例如
>>> >>> >>> >>> m = Menu(root) root.config(menu = m) m.add_command(label="File") m.add_command(label="Help")
22
菜单编程例:eg8_4.py
def callback(): print "hello from menu" root = Tk() m = Menu(root) root.config(menu = m) filemenu = Menu(m) m.add_cascade(label="File", menu=filemenu) filemenu.add_command(label="New", command=callback) filemenu.add_command(label="Open...", command=callback) filemenu.add_separator() filemenu.add_command(label="Exit", command=callback) helpmenu = Menu(m) m.add_cascade(label="Help", menu=helpmenu) helpmenu.add_command(label="About...", command=callback)
10
在窗口中添加构件
• 构件对象有很多属性(实例变量):
– 创建时设置属性的值
属性一般都有缺省值 用"命名参数"方式设置较方便:属性=属性值
– 创建时不设置,将来再设置或修改
利用构件类的config方法: 对象.config(属性=属性值) 对象视为字典: 对象[属性]=属性值
11
根窗口
24
布局
• 布局:界面元素在界面中的位置安排. • 布局管理器:程序员不需要了解底层显示 系统的细节, 在较高层次上考虑界面布局 • 构件都是先创建,再布局:
w = Constructor(parent,...) w.GeometryManager(...)
• Tkinter提供三种布局管理器:Pack,Grid 和Place
25
Pack布局管理器
• Pack以紧凑方式将构件在窗口中“打包”
– 设想窗口由弹性材料制成,放入构件时先把窗 口空间撑大到足够容纳该构件,然后将构件紧 贴内部的某条边(缺省是顶边)放入. – 缺省情形下放入同一个窗口的所有构件是沿 垂直方向自顶向下一个紧贴一个进行布置的
可以通过pack方法的side选项设置成沿水平方向 打包.
– 注意写法:对象创建与方法调用合二为一
15
常用构件:按钮
• 类:Button
btn = Button(窗口,选项设置) – text:按钮上的文本 – command:点击按钮时要执行的命令
需要提供一个函数或方法名f
注意不是函数调用f()
– – – –
height,width fg,bg relief:RAISED/FLAT/SUNKEN/GROOVE/ state:NORMAL/ACTIVE/DISABLED
7
Tkinter的常用构件类
• • • • • • • • • • • • Button Canvas Checkbutton Entry Frame Label Listbox Menu Message Radiobutton Text Toplevel
8
最简单的Tkinter程序
• • • • 导入Tkinter 建立根窗口 进入事件循环 例:eg8_1.py
程序中可以通过v.get()和v.set()来查询或设置勾 选钮的状态
>>> v = IntVar() >>> Checkbutton(root,text="Check",variable=v).pack()
18
常用构件:单选钮
• 类:Radiobutton
rb = Radiobutton(窗口,选项设置) – value:每个单选钮对应一个值,用于控制变量 – variable:控制变量,值为IntVar类的实例
23
常用构件:顶层窗口
• 类Toplevel
– 顶层窗口是根窗口的子构件,但有一定的独 立性:可以移动,改变大小. – 根窗口只有一个,顶层窗口可有多个.
• 例如
>>> >>> >>> >>> >>> >>> root = Tk() Label(root,text="hello").pack() top = Toplevel() Label(top,text="world").pack() top.title('hello toplevel') top.geometry('400x300')
27
Grid布局管理器
• Grid将窗口或框架视为由行和列构成的二维表 格,并将构件放入行列交叉处的单元格中
– 根据构件大小自动调整行列尺寸:列宽由该列中最宽 构件决定,行高由该行最高的构件决定.
• 构件都有grid()方法
– 选项row和column指定行列编号
– Tkinter自动维护这两个属性的值 – 编程时可利用这两个属性,例如: aLabel.master.title("My GUI")
13
界面设计过程
• 根据需要创建多个构件,然后在窗口中进 行布局. • 例:eg8_3.py
from Tkinter import * root = Tk() aLabel = Label(root,text="Hello World") aLabel.pack() aButton = Button(root,text="Click Me") aButton.pack() root.mainloop()
>>> Checkbutton(root,text="Math").pack() >>> Checkbutton(root,text="Python").pack() >>> Checkbutton(root,text="English").pack()
– variable:控制变量,值为IntVar类的实例
14
常用构件:标签
• 类:Label
lb = Label(窗口,选项设置) – text:标签文本内容 – width:标签宽度 – fg:前景色(文本颜色)
• 例如
>>> aLabel = Label(root,text="Hello World") >>> aLabel.pack() >>> Label(root,text='red color',fg='red').pack()
• 构件都有pack()方法
26
例:Pack布局管理器
>>> Label(root,text="Input a number:").pack() >>> Entry(root).pack() >>> Button(root,text="OK").pack()
>>> Label(root,text="Input a number:").pack(side="left") >>> Entry(root).pack(side="left") >>> Button(root,text="OK").pack(side="left")
19
常用构件:文本编辑区
• 类Entry:单行文本编辑
e = Entry(窗口,选项设置) – textvariable:控制变量,是StringVar类的实例
• 例如
>>> v = StringVar() >>> e = Entry(root,textvariable = v) >>> e.pack() >>> print v.get() hello >>> v.set('new text')
>>> def hiButton(): ... print 'hi there' ... >>> Button(root,text='print',command=hiButton).pack()
17
常用构件:勾选钮
• 类:Checkbutton
cb = Checkbutton(窗口,选项设置) – text
• 根窗口的标题设置
root.title("My GUI") – 缺省值为"Tk"
• 根窗口的尺寸设置
root.geometry("400x400") – 缺省值为200x200
12
构件间的父子关系
• GUI中的所有构件按父子关系构成树状 层次结构 • 每个构件都有master和children属性
相关文档
最新文档