第六天 初涉GUI编程
在web编程的主流时代,GUI用的确实不多。学习这一块的目的计划承上启下,巩固下面向对象编程。学习项目及练习源码地址:
GitHub源码
关于Pytgon GUI
在昨天的学习内容里面有提及常用的几个GUI框架。
图形用户界面是由一个个组件组成,就像小孩“搭积木”一样最终组成了整个界面。有的组件还能在里面再放置其他组件,我们称为“容器”。
Tkinter编写一个GUI程序
一般步骤:
创建应用程序主窗口对象(也称:根窗口)
在主窗口中,添加各种可视化组件,比如:按钮(Button)、文本框(Label)等
通过几何布局管理器,管理组件的大小和位置
-
事件处理
在组件上绑定各种用户事件。如:按钮点击
from tkinter import * # 最好不要这样导入所有 from tkinter import messagebox # 为什么要这样导入一次,前面已经有*了? def btn_click(e): messagebox.showinfo("Message","按钮点击!") print("点击了按钮") root = Tk(screenName="Hello World") root.title("GUI开发练习") # 设置标题 root.geometry("500x400+100+200") # 设置画布大小 btn001 = Button(root) btn001['text'] = "按钮一" btn001.bind("<Button-1>",btn_click) btn001.pack() # 将按钮放在画布上 root.mainloop() # 不这样窗口打开后自动关闭
Tkinter常用类介绍
Misc和Wm:
Tkinter的GUI组件有两个根父类,它们都直接继承了object类:
- Misc:它是所有组件的根父类。
- Wm:它主要提供了一些与窗口管理器通信的功能函数。
Tk
Misc和Wm派生出子类Tk,它代表应用程序的主窗口。一般应用程序都需要直接或间
接使用Tk。
Pack、Place、Grid
Pack、Place、Grid 是布局管理器。布局管理器管理组件的:大小、位置。通过布局管 理器可以将容器中的组件实现合理的排布。
BaseWidget
BaseWidget 是所有组件的父类
Widget
Widget是所有组件类的父类。Widget一共有四个父类:BaseWidget、Pack、Grid、
Place。意味着,所有GUI组件同时具备这四个父类的属性和方法。
GUI应用程序类的经典写法
使用面向对象的方式,可以更加合理的组织GUI应用程序的代码。
通过一个App类组织整个GUI程序,类App继承了Frame(一个容器组件)及通过继承拥有了父类的特性。通过构造函数 __init__()初始化窗口中的对象,通过createWidgets()方法创建窗口中的对象。示例代码
Label标签组件
Label(标签)主要用于显示文本信息,也可以显示图像。
如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。
Options选项
可以通过Options设置组件的属性,从而控制组件的各种状态。比如:宽度、高度、颜色、位置等等。
我们可以通过三种方式设置Options选项,这在各种GUI组件中用法都一致。
-
创建对象时,使用可变参数
btn = Button(self, fg="red", bg="blue")
-
创建对象后,使用字典索引方式
btn = Button(self) btn['fg'] = "red" btn['bg'] = "blue"
-
创建对象后,使用 config()方法
btn = Button(self) btn.config(fg="red", bg="blue")
常见组件属性一览
选项名(别名) | 含义 |
---|---|
activebackground | 指定组件处于激活状态时的背景色 |
activeforeground | 指定组件处于激活状态时的前景色 |
anchor | 指定组件内的信息(比如文本或图片)在组件中如何显示(当所在组件比信息大时,可以看出效果)。必须为下面的值之一:N、NE、E、SE、S、SW W、NW 或 CENTER。比如 NW(NorthWest)指定将信息显示在组件的左上角 |
background(bg) | 指定组件正常显示时的背景色 |
bitmap | 指定在组件上显示该选项指定的位图,该选项值可以是Tk_GetBitmap接收的任何形式的位图。位图的显示方式受anchor、justify选项的影响。如果同时指定了bitmap和text,那么 bitmap 覆盖文本;如果同时指定了bitmap和image,那么image覆bitmap |
borderwidth | 指定组件正常显示时的 3D 边框的宽度,该值可以是 Tk_GetPixels 接收的任 何格式 |
cursor | 指定光标在组件上的样式。该值可以是 Tk_GetCursors 接受的任何格式 |
command | 指定按组件关联的命令方法,该方法通常在鼠标离开组件时被触发调用 |
disabledforeground | 指定组件处于禁用状态时的前景色 |
font | 指定组件上显示的文本字体 |
foreground(fg) | 指定组件正常显示时的前景色 |
highlightbackground | 指定组件在高亮状态下的背景色 |
highlightcolor | 指定组件在高亮状态下的前景色 |
highlightthickness | 指定组件在高亮状态下的周围方形区域的宽度,该值可以是 Tk_GetPixels 接收的任何格式 |
height | 指定组件的高度,以 font 选项指定的字体的字符高度为单位,至少为 1 |
image | 指定组件中显示的图像,如果设置了 image 选项,它将会覆盖 text、bitmap 选项 |
justify | 指定组件内部内容的对齐方式,该选项支持 LEFT(左对齐)、CENTER(居 中对齐)或 RIGHT(右对齐)这三个值 |
padx | 指定组件内部在水平方向上两边的空白,该值可以是 Tk_GctPixels接收的任何格式 |
pady | 指定组件内部在垂直方向上两地的空白,该值可以是 Tk_GctPixels接收的任何格式指定组件的 3D 效果,该选项支持的值包括 RAISED、SUNKEN、FLAT、 relief RIDGE、SOLID、GROOVE。该值指出组件内部相对于外部的外观样式,比如 RAISED 表示组件内部相对于外部凸起 |
selectbackground | 指定组件在选中状态下的背景色 |
selectborderwidth | 指定组件在选中状态下的3D边框的宽度,该值可以是Tk_GetPixels接收的任何格式 |
selectforeground | 指定组在选中状态下的前景色 |
state | 指定组件的当前状态。该选项支持 NORMAL(正常)、DISABLE(禁用) 这两个值 |
takefocus | 指定组件在键盘遍历(Tab 或 Shift+Tab)时是否接收焦点,将该选项设为 1 表示接收焦点;设为 0 表示不接收焦点 |
text | 指定组件上显示的文本,文本显示格式由组件本身、anchor 及 justify 选 项决定 |
textvariable | 指定一个变量名,GUI 组件负责显示该变量值转换得到的字符串,文本显 示格式由组件本身、anchor 及 justify 选项决定 |
underline | 指定为组件文本的第几个字符添加下画线,该选项就相当于为组件绑定了 快捷键 |
width | 指定组件的宽度,以 font 选项指定的字体的字符高度为单位,至少为 1 |
wraplength | 对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过该 |
Button组件
Button(按钮)用来执行用户的单击操作。Button可以包含文本,也可以包含图像。按钮被单击后会自动调用对应事件绑定的方法。
Entry单行文本框
Entry用来接收一行字符串的控件。如果用户输入的文字长度长于Entry控件的宽度时, 文字会自动向后滚动
Text多行文本框
Text(多行文本框)的主要用于显示多行文本,还可以显示网页链接, 图片, HTML页面, 甚至 CSS 样式表,添加组件等。因此,也常被当做简单的文本处理器、文本编辑器或者 网页浏览器来使用。
Radiobutton单选按钮
Checkbutton复选按钮
canvas画布
canvas(画布)是一个矩形区域,可以放置图形、图像、 组件等。
布局管理器
tkinter提供的布局管理器帮助组织、管理在父组件中子组件的布局方式。tkinter提供了三种管理器:pack、grid、place。
grid布局管理器
grid表格布局,采用表格结构组织组件。子组件的位置由
行和列的单元格来确定,并且可以跨行和跨列,从而实现复
杂的布局
pack布局管理器
pack按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在父组件中自顶向下垂直添加组件。
place 布局管理器
place 布局管理器可以通过坐标精确控制组件的位置,适用
于一些布局更加灵活的场景
事件处理
一个GUI应用整个生命周期都处在一个消息循环 (event
loop) 中。它等待事件的发生,并作出相应的处理。
Tkinter提供了用以处理相关事件的机制. 处理函数可被绑 定给各个控件的各种事件。
widget.bind(event, handler)
如果相关事件发生, handler函数会被触发, 事件对象
event会传递给handler函数.
组件对象的绑定
-
通过command属性绑定(适合简单不需获取event对象)
Button(root,text=”登录”,command=login)
-
通过 bind()方法绑定(适合需要获取 event 对象)
c1 = Canvas(); c1.bind(“<Button-1>”,drawLine)
组件类的绑定
调用对象的bind_class函数,将该组件类所有的组件绑定事件:
w.bind_class(“Widget”,”event”,eventhanler)
菜单和工具栏
主菜单
主菜单一般包含:文件、编辑、帮助等,位于GUI窗口的上面。创建主菜单一般有如下4步:
-
创建主菜单栏对象
menubar = tk.Menu(root)
-
创建菜单,并添加到主菜单栏对象
file_menu = tk.Menu(menubar) menubar.add_cascade(label=”文件”,menu=file_menu)
-
添加菜单项到 2 步中的菜单
file_menu.add_command(label=”打开”) file_menu.add_command(label=”保 存”,accelerator=”^p command=mySaveFile) file_menu.add_separator() file_menu.add_command(label=”退出”)
-
将主菜单栏添加到根窗口
root[“menu”]=menubar
上下文菜单
快捷菜单(上下文菜单)是通过鼠标右键单击组件而弹出的菜单,一般是和这个组件相关的操作,比如:剪切、复制、粘贴、属性等。
-
创建菜单
menubar = tk.Menu(root) menubar.add_command(label=”字体”)
-
绑定鼠标右键单击事件
def test(event): menubar.post(event.x_root,event.y_root) #在鼠标右键单击坐标处显示菜单 root.bind(“<Button-3>”,test) # 在窗体绑定事件
其他组件
OptionMenu选择项
OptionMenu(选择项)用来做多选一,选中的项会在顶部显
示。
Scale移动滑块
Scale(移动滑块)用于在指定的数值区间,通过滑块的移动来选择值
颜色选择框
颜色选择框可以用来设置背景色、前景色、画笔颜色、字体颜色等等。
文件对话框
文件对话框帮助我们实现可视化的操作目录、操作文件。最后,将文件、目录的信息传入到程序中。
简单输入对话框
simpledialog(简单对话框)
通用消息框
messagebox(通用消息框)用于和用户简单的交互,用户点击确定、取消。
项目实战练习
编写一个记事本程序
需求分析
模仿windows的记事本,实现新建、保存等功能。
- 需要一个主菜单
- 需要一个右键菜单
- 最好能响应快捷