cp8_1_1.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : cp8_1_1.py
# @Author: WRH
# @Date  : 2021/5/17
# @Edition:Python3.8.6
# 第8章:图形化界面设计
# 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口):是指采用图形方式显示的计算机操作用户界面
# python自带的tkinter模块,是一种流行的面向对象的GUI工具包Tk的Python编程接口,提供了便利地创建GUI程序的方法。
'''
Pyhton使用tkinter图形化编程的基本步骤通常包括:
1.导入tkinter模块;
2.创建GUI主窗体;
3.添加人机交互控件并编写相应的函数;
4.在主事件循环中等待用户触发事件响应。
'''

# 本章主要内容
'''
1.根窗体
2.常见控件
  控件的布局
  常见控件的共同属性
  常见控件特有的属性(注意是特有,不是独有)
3.事件响应
'''

# 8.1 窗体控件布局
# 8.1.1根窗体 :根窗体是图形化应用程序的根容器,是tkinter模块底层控件的实例

import tkinter
# 1.创建根窗体,并设置根窗体的属性
root = tkinter.Tk() # 调用tkinter.Tk()方法初始化一个根窗体实例对象root
root.title('按键实验') # 设置窗体标题,可选组件
root.geometry('320x240+10+100') # geometry()方法创建一个320×240像素大小的窗体,注意:乘号用小写英文字母x表示
# +10+100表示窗体的左上角位于桌面向右10像素,向下100像素处,可选组件

# 2.添加常见控件,并设置其布局方式、控件共有属性、控件特有属性,所有属性都可省略,根据需要自行添加
lb = tkinter.Label(root,  # 给实例化窗体root添加标签(Label)控件,并实例化对象为lb,
                   text='请按键',  # 给标签(Label)控件添加特有属性text
                   bg='#d3fbfb',  # 给标签(Label)控件添加共有属性背景色(bg),rgb颜色方式
                   fg='green',  # 给标签(Label)控件添加共有属性前景色(fg),颜色名称方式
                   font=('黑体', 48),  # 给标签(Label)控件添加共有属性字体(font)
                   # 并设定字体的主题、大小,字体的大小也决定了标签的高度
                   width=20,  # 给标签(Label)控件添加共有属性宽度(width)
                   relief=tkinter.SUNKEN # 给标签(Label)控件添加共有属性浮雕样式(relief)
                   )
lb.pack() # 控件的布局方法,默认不加参数

# 3.添加事件响应
def show(event):  # 定义show函数,并设置参数event
   s = event.keysym  # 设置event的属性keysym(表示字符或者字符型按键名称),
   lb.configure(text=s)  # 控件实例的方法configure()改变属性text的值,使显示的文本为s,方法configure()可写成config()
lb.bind('<Key>', show)  # 控件实例的方法bind()绑定键盘事件<key>(表示键盘任意键),并调用自定义函数show,注意函数不加括号
lb.focus_set()  # 控件实例的方法focus_set()获得焦点,以保持对事件的持续响应

root.mainloop()  # mainloop()用来循环前面的代码,进入消息循环,必须组件,
# 我们看到的图形化界面不是一个静态的东西,而是一直在循环运行的

# 8.1.2 tkinter常用控件
# 常用控件
'''
控件名称	    说明      
Button	    按钮控件,单击触发事件
Canvas	    画布控件,绘制图形或特殊控件
Checkbutton	多选框控件,用于提供多项选择框
Entry	    输入控件,接收单行文本输入
Frame	    框架控件,用于控件分组,定义一个窗体,以作为其他控件的容器
Label	    标签控件,定义一个文字或图片标签
Listbox	    列表框控件,定义一个下拉方块
Menu	    菜单控件,定义一个菜单栏、下拉菜单和弹出菜单
Message	    消息控件,定义一个对话框
Radiobutton	单选按钮控件,定义一个单选按钮
Scale	    范围控件,定义一个滑动条,以帮助用户设置数值
Scrollbar	滚动条控件,定义-一个滚动条
Text	    Text 文本控件,定义一个文本框
Topleve	    此控件与Frame控件类似,可以作为其他控件的容器。但是此控件有自己的最上层窗口,可以提供窗口管理接口
'''

# 添加控件及其属性的语法格式:
'''
控件实例名=tkinter.控件名称(根窗体实例化对象,控件属性名=值)
控件实例名.布局方法()
'''
import tkinter
root = tkinter.Tk() # 调用tkinter.Tk()方法初始化一个根窗体实例对象root
# 添加常见控件,并设置其布局方式、控件共有属性、控件特有属性,所有属性都可省略,根据需要自行添加
lb1 = tkinter.Button(root, relief=tkinter.SUNKEN)
lb1.pack()
lb2 = tkinter.Canvas(root, bg='#d3fbfb')
lb2.pack()
lb3 = tkinter.Checkbutton(root, bitmap='error')
lb3.pack()
tkinter.Entry(root, cursor='heart').pack() # 不用命名,直接实例化通过布局方法呈现,鼠标悬停在上面会由箭头变成心形

root.mainloop() # mainloop()用来循环前面的代码,进入消息循环,必须组件

# 常见控件的共同属性
'''
属性     说明	                        取值
anchor	文本起始位置                      CENTER(默认),N,NE,E,SE,S,SW,W,NW
bg      背景色
fg     前景色
bitmap  黑白二值图标                      见表8-3
cursor	鼠标悬停光标                      见表8-4
font	指定控件内部文本的字体	font
bd      加粗(默认2像素)
height  高(以行为单位)
image   显示图像
justify 多行文本的对齐方式                 CENTER(默认),LEFT,RIGHT,TOP,BOTTOM  
padx    水平扩展像素
pady    垂直扩展像素                  
relief  浮雕样式                         FLAT,RAISED,SUNKEN,GROOVE,RIDGE                              
state   控件实例状态是否可用               NORMAL(默认),DISABLED
width   宽(以行为单位)
'''

# 8.1.3 控件布局

# 控件的布局通常有pack()、grid()和place()三种方法。
# 1.pack()方法
'''
方法pack()是一种简单的布局方法,如果用不加参数的默认方式,将按布局语句的先后,
以最小占用空间的方式自上而下地排列控件实例,并且保持控件本身的最小尺寸。
'''
# 例8-3 用pack()方法不加参数排列标签。为看清楚各控件实例所占用的空间大小,文本使用了不同长度的中英文,
#      并设置relief=tkinter.GROOVE的凹陷边缘属性
import tkinter
root = tkinter.Tk()  # 调用tkinter.Tk()方法初始化一个根窗体实例对象root

lbred = tkinter.Label(root, text="Red", fg="red", relief=tkinter.GROOVE)  # 添加Label控件,设置其属性
lbred.pack()  # 设置控件的布局方式(不加参数)

lbgreen = tkinter.Label(root, text="绿色", fg="green", relief=tkinter.GROOVE)
lbgreen.pack()

lbblue = tkinter.Label(root, text="蓝", fg="blue", relief=tkinter.GROOVE)
lbblue.pack()

root.mainloop()  # mainloop()用来循环前面的代码,进入消息循环,必须组件

'''
pack()方法可设置fill、side等属性参数
fill参数值可以是tkinter.X,tkinter.Y,tkinter.BOTH,
    分别表示允许控件实例向水平方向、垂直方向或二维方向伸展填充父容器未被占用的空间
side参数值可以是tkinter.TOP,tkinter.BOTTOM,tkinter.LEFT,tkinter.RIGHT,
    分别表示本控件实例的布局相对于下一个控件实例的方位
'''
# 例8-4  用pack()方法加参数排列标签
import tkinter
root = tkinter.Tk()

lbred = tkinter.Label(root, text="Red", fg="red", relief=tkinter.GROOVE)
lbred.pack()
lbgreen = tkinter.Label(root, text="绿色", fg="green", relief=tkinter.GROOVE)
lbgreen.pack(side=tkinter.RIGHT) # 本控件实例相对于下一个控件实例靠右放置
lbblue = tkinter.Label(root, text="蓝", fg="blue", relief=tkinter.GROOVE)
lbblue.pack(fill=tkinter.X) # 本控件实例向水平方向伸展填充父容器未被占用的空间

root.mainloop()

# 2.grid()方法
'''
grid()是基于网格的布局。先虚拟一个二维表格,再在该表格中布局控件实例。
由于在虚拟表格的单元格中所布局的控件实例大小不一,单元格也没有固定或均一的大小,因此其仅用于布局的定位。
grid()方法与pack()方法不能混合使用。
方法grid()常用的布局参数如下。
  column:控件实例的起始列,最左边为第0列。
  columnspan:控件实例所跨越的列数,默认为1列。
  row:控件实例的起始行,最上面为第0行。
  rowspan:控件实例所跨越的行数,默认为1行。
  ipadx, ipady:控件实例所呈现区域内部的像素数,用来设置控件实例的大小。 
  padx, pady:控件实例所占据空间的像素数,用来设置控件实例所在单元格的大小。
'''
# 例8-5 用grid()方法排列标签。
# 设想有一个3×4的表格,起始行、列序号均为0。将标签lbred置于第2列第0行;将标签lbgreen置于第0列第1行;
# 将标签lbblue置于第1列起跨2列第2行,占20像素宽
import tkinter
root = tkinter.Tk()

lbred = tkinter.Label(root, text="Red", fg="red", relief=tkinter.GROOVE)
lbred.grid(column=2, row=0)  # 将标签lbred置于第2列第0行
lbgreen = tkinter.Label(root, text="绿色", fg="green", relief=tkinter.GROOVE)
lbgreen.grid(column=0, row=1)  # 将标签lbgreen置于第0列第1行
lbblue = tkinter.Label(root, text="蓝", fg="blue", relief=tkinter.GROOVE)
lbblue.grid(column=1, columnspan=2, ipadx=20, row=2)  # 将标签lbblue置于第1列起跨2列第2行,占20像素宽

root.mainloop()

# 3.place()方法
'''
place()方法根据控件实例在父容器中的绝对或相对位置参数进行布局。
其常用布局参数如下:
  x, y:控件实例在根窗体中水平和垂直方向上布局的起始位置(单位为像素)。注意,根窗体左上角为0,0,水平向右、垂直向下为正方向。
  relx, rely:控件实例在根窗体中水平和垂直方向上起始布局的相对位置。即相对于根窗体宽和高的比例位置,取值在0.0~1.0之间。
  height, width:控件实例本身的高度和宽度(单位为像素)。
  relheight, relwidth:控件实例相对于根窗体的高度和宽度比例,取值在0.0~1.0之间。
利用place()方法配合relx, rely和relheight, relwidth参数所得到的界面可自适应根窗体尺寸的大小。
方法place()与方法grid()可以混合使用
'''
# 例8-6 用place()方法排列消息(多行标签)
import tkinter
root = tkinter.Tk()
root.geometry('320x240')

msg1 = tkinter.Message(root, text='''
我的水平起始位置为相对位置(根窗体宽度20%处),垂直起始位置为绝对位置80像素,我的高度是根窗体高度的40%,宽度为200像素
''', relief=tkinter.GROOVE)
msg1.place(relx=0.2, y=80, relheight=0.4, width=200)

root.mainloop()

上一篇:第十八章 GUI库:tkinter


下一篇:tkinter tk.grid