一、学习目标
1.GUI库
2.Tkinter库
3.导入Tkinter库
4.4.Tkinter窗口中显示中文
5.Tkinter 组件
二、重点知识
1.GUI库
GU1(Graphical User Interface,图形用户界面)是指采用图形方式显示的计算机操作用户界面。例如,运行Python 的 IDLE就是一种GUI,生活中登录网页的浏览器也是一种GUI,所以GUI应用广泛,可以实现可视化编程。
2.Tkinter库
Tkinter是 Python的标准GUI库,Python 使用 Tkinter 可以创建完整的GUI程序。在Tkinter中,可以直接使用命令按钮、文本框、标签、单选按钮等组件进行GUI编程,实现可视化效果。
3.导入Tkinter库
Tkinter库是 Python 安装包中内置的库,所以只要安装好 Python之后就能直接导入,而且运行Python的 IDLE(集成开发环境)也是用Tkinter编写而成的。导入 Tkinter库,直接借助命令import tkinter(全部小写字母)即可实现。
4.Tkinter窗口中显示中文
如果需要在组件中显示中文,则需要在编写的程序中首行添加“#-* - coding: UTF-8-*-”,用来指明字符编码为UTF-8格式。
5.Tkinter 组件
用 Tkinter创建的窗口如同一个容器,可以根据需要添加各种组件,便于使用。Tkinter 包含15种核心组件,用以实现不同的功能。各种组件及含义如表5-1所示。
控件 | 含义 |
---|---|
Button | 按钮控件,用于显示按钮 |
Canvas | 画布控件,显示图形元素,例如线条或文本 |
Checkbutton | 多选框控件,用于在程序中提供多项选择框 |
Entry | 输入控件,用于显示简单的文本内容 |
Frame | 框架控件,在屏幕上显示一个矩形区域,多用来作为容器 |
Label | 标签控件,可以显示文本或位图 |
Listbox | 列表框控件,用来显示一个选择列表 |
Menubutton | 菜单按钮控件,用于显示菜单项 |
Menu | 菜单控件,显示菜单栏、下拉菜单和弹出菜单 |
Message | 消息控件,用来显示多行文本,与Label类似 |
Radiobutton | 单选按钮控件,显示一个单选的按钮状态 |
Scale | 范围控件,显示一个数值刻度,用于设置输出限定范围的数字区间 |
Scrollbar | 滚动条控件,当内容超过可视化区域时使用,例如列表框 |
Text | 文本控件,用于显示多行文本 |
Toplevel | 容器控件,用来提供一个单独的对话框,和Frame类似 |
Spinbox | 输入控件,与Entry 类似,但是可以指定输入范围值 |
PanedWindow | 窗口布局管理插件,可以包含一个或者多个子控件 |
LabelFrame | 简单的容器控件,常用于复杂的窗口布局 |
tkMessageBox | 用于显示应用程序的消息框 |
三、实际运用
1.常用 Tkinter 组件
(1)按钮
Tkinter按钮组件用于在 Python应用程序中添加按钮,按钮上可以是文本或图像,按钮可用于监听用户的行为,使用tkinter,Button可以创建按钮。按钮的常用属性有前景、背景颜色、高度、宽度、文本内容等。
按钮控件的常用参数及含义如图:
参数 | 含义 |
---|---|
activebackground | 当鼠标放上去时,按钮的背景色 |
activeforeground | 当鼠标放上去时,按钮的前景色 |
anchor | 控制文本的位置,默认为中心 |
bd | 按钮边框的大小,默认为 2像素 |
bg | 指定按钮的背景颜色 |
command | 按钮关联的函数,当按钮被单击时,执行该函数 |
fg | 按钮的前景色(按钮文本的颜色) |
font | 文本字体 |
height | 按钮的高度 |
image | 按钮上要显示的图片 |
state | 设置按钮组件状态,可选的有NORMAL、ACTIVE、DISAB |
underline | 下画线。默认按钮上的文本都不带下画线。取值表示带下画线的字符串位置索引,例如为0时,第一个字符带下画线;为1时,前两个字符带下画线,以此类推 |
width | 按钮的宽度,如未设置此项,其大小自动适应按钮的内容(文本或图片的大小) |
wraplength | 限制按钮每行显示的字符数量 |
text | 按钮的文本内容 |
1)Tkinter按钮组件的使用
import tkinter
root = tkinter.Tk()
def hello_click():
your_button = tkinter.Button(root,anchor = tkinter.N,
text = '单击确定时的显示按钮',
bd = 3,
underline = 3,
activebackground = 'green',
fg = 'red')
your_button.pack()
my_button = tkinter.Button(root,anchor = tkinter.E,
text = '确定',
bg = 'red',
width = 4,
height = 3,
command = hello_click)
my_button.pack()
root.mainloop()
import tkinter
root = tkinter.Tk()
def hello_click():
my_label = tkinter.Label(root,anchor = tkinter.W,
text = '小标签',
bd = 3,
bg = 'yellow',
height = 3,
width = 20,
fg = 'green')
my_label.pack()
my_button = tkinter.Button(root,anchor = tkinter.E,
text = '单击按钮,显示标签',
bg = 'green',
width = 20,
height = 3,
command = hello_click)
my_button.pack()
root.mainloop()
import tkinter
root = tkinter.Tk()
def hello_click():
my_label = tkinter.Label(root,anchor = tkinter.W,
text = '我是标签',
bd = 3,
bg = 'pink',
height = 3,
width = 20,
fg = 'white')
my_label.pack()
my_text = tkinter.Text(root,font = '黑体',
height = 2,
relief = 'groove'
)
my_text.pack()
my_button = tkinter.Button(root,anchor = tkinter.E,
text = '单击按钮,显示标签和文本框',
bg = 'red',
width = 20,
height = 3,
command = hello_click)
my_button.pack()
root.mainloop()
import tkinter
root = tkinter.Tk()
root.title("单选框和复选框")
my_label1 = tkinter.Label(root,anchor = tkinter.N,
text = '请选择你的性别',
fg = 'red')
my_label1.pack()
my_label2 = tkinter.Label(root,text='',fg='green')
my_label2.pack(anchor = tkinter.E)
def xuanze_my_radio():
mystr = ''
mystr += "你的选择是"+str(r.get())
my_label2.config(text = mystr)
r = tkinter.StringVar()
r.set('1')
my_radio1 = tkinter.Radiobutton(root,variable = r,
value = '1',
text = '男',
command = xuanze_my_radio)
my_radio1.pack()
my_radio2 = tkinter.Radiobutton(root,variable = r,
value = '2',
text = '女',
command = xuanze_my_radio)
my_radio2.pack()
flag1 = False
count = 0
listcontent = ['你选择的语言是']
language = ['Python']
my_label3 = tkinter.Label(root,text='')
def click_1():
global flag1,count
flag1 = not flag1
if count % 2 == 1:
my_check1['onvalue']=1
my_check1['fg']='green'
count += 1
else:
my_check1['variable']=c
my_check1['fg']='red'
count += 1
if flag1:
listcontent.append(language[0])
my_check1.deletecommand
else:
listcontent.remove(language[0])
my_label3['text'] = listcontent
c = tkinter.IntVar()
c.set(1)
my_check1 = tkinter.Checkbutton(root,text = 'Python',variable = c,onvalue = 0,command = click_1)
my_check1.pack(anchor = tkinter.E)
my_label3.pack()
root.mainloop()
运行结果
5) 调用Tkinter菜单组件制作顶级菜单和下拉菜单
from tkinter import *
root = Tk()
root.title("顶级菜单和下拉菜单")
menu_main = Menu(root)
menu1 = Menu(menu_main,tearoff = 0)
menu1.add_command(label = '新文件',accelerator = 'Ctrl+N')
menu1.add_command(label = '打开',accelerator = 'Ctrl+O')
menu1.add_command(label = '保存',accelerator = 'Ctrl+S')
menu1.add_command(label = '另存为')
menu1.add_separator()
menu1.add_command(label = '关闭')
menu_main.add_cascade(label = '文件',menu = menu1)
menu1 = Menu(menu_main,tearoff = 0)
for i in ["复制","剪切","粘贴"]:
menu1.add_radiobutton(label = i)
menu1.add_separator()
menu1.add_command(label = 'About')
menu_main.add_cascade(label = "编辑",menu = menu1)
root.config(menu = menu_main)
root.mainloop()
import tkinter as tk
root = tk.Tk()
root.title("弹出式菜单的使用")
def click():
pass
menubar = tk.Menu(root)
menubar.add_command(label = '复制',command = click)
menubar.add_command(label = '剪切',command = click)
menubar.add_separator()
menubar.add_command(label = '粘贴',command = click)
def popup(event):
menubar.post(event.x_root,event.y_root)
root.bind("" ,popup)
root.mainloop()
import tkinter as tk
root = tk.Tk()
root.title("Canvas绘图组件的使用")
canvas = tk.Canvas(root,
width = 600,
height = 600,
bg = 'grey',
bd = 10,
)
canvas.create_line(300,100,400,100,fill = "red",width = 3)
canvas.create_oval(50,50,200,200,fill = 'white',width = 5)
canvas.create_arc(0,240,240,400,start = 0,extent = 120,fill = "red",width = 5)
points = [320,280,380,260,370,200]
canvas.create_polygon(points,outline = 'pink',
fill = 'yellow',width = 2)
canvas.create_rectangle(80,350,180,450,width = 3)
canvas.create_text(260,30,text = "使用tkinter.canvas组件",font = "time 10 bold underline",fill = 'black',tags = "string")
canvas.create_oval(280,320,400,450,fill = 'white',width = 5)
canvas.pack()
root.mainloop()
from tkinter import *
root = Tk()
root.title("Tkinter列表框的使用")
my_listbox = Listbox(root,selectmode = MULTIPLE,height = 15)
my_listbox.pack()
list_items = [11,22,33,44]
for item in list_items:
my_listbox.insert(END,item)
my_button1 = Button(root,text = '删除',command = lambda x = my_listbox:x.dalete(ACTIVE))
my_button2 = Button(root,text = '增加',command = lambda x = my_listbox:x.insert('end','增加的新内容'))
my_button1.pack()
my_button2.pack()
for item in list_items:
my_listbox.insert('end',item)
mainloop()
import time
tk = Tk()
tk.title('tkinter Canvas组件的灵活应用')
tk.resizable(0,0)
my_picture = Canvas(tk,width = 600,height = 600,bg = 'pink')
my_picture.pack()
my_picture.create_text(320,20,text = "使用tkinter.canvas组件",font = ("Arial",20),\
fill = 'blue',tags = "string")
my_picture.create_oval(40,40,600,600,width = 3,fill = "purple")
my_picture.create_line(40,300,600,300,width = 1.5,fill = "red",dash = 6)
my_picture.create_line(300,40,300,600,width = 1.5,fill = "red",dash = 6)
moving_picture = my_picture.create_rectangle(10,10,110,110,outline = 'yellow',\
stipple = 'gray12',fill = 'red')
def move_obj(my_picture,idx,pos):
if pos == 1:
my_picture.coords(idx,(130,330,270,470))
elif pos == 2:
my_picture.coords(idx,(130,330,270,270))
elif pos == 3:
my_picture.coords(idx,(330,130,470,270))
elif pos == 4:
my_picture.coords(idx,(330,330,470,470))
else:
return 0
i = 5
while i:
move_obj(my_picture,moving_picture,1)
time.sleep(0.3)
tk.update_idletasks()
tk.update()
move_obj(my_picture,moving_picture,2)
time.sleep(0.3)
tk.update_idletasks()
tk.update()
move_obj(my_picture,moving_picture,3)
time.sleep(0.3)
tk.update_idletasks()
tk.update()
move_obj(my_picture,moving_picture,4)
tk.update_idletasks()
tk.update()
i = i - 1
动感地带结果展示:
Python图形化界面设计可以调用不同的模块绘制各种场景使用的图形,尤其是游戏场景中的界面都是动态的。今天主要就是学习了如何使用Tkinter模块来实现动态界面设计,我们分别运用到了:GUI库、Tkinter库、导入Tkinter库、Tkinter窗口中显示中文以及Tkinter组件。