Python图形界面设计 Tkinter GUI编程组件的使用

一、学习目标
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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第1张图片
2)Tkinter标签组件的使用

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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第2张图片
3)Tkinter文本框组件的使用

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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第3张图片
4) Tkinter单选框和复选框组件的使用

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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第4张图片
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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第5张图片
Python图形界面设计 Tkinter GUI编程组件的使用_第6张图片
6)利用菜单组件设计弹出式菜单

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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第7张图片
7)使用Canvas组件绘制多种图形

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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第8张图片
8)列表框的使用

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()

运行结果
Python图形界面设计 Tkinter GUI编程组件的使用_第9张图片
下面以一个任务为例子,代码示例如下:

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编程组件的使用_第10张图片
Python图形化界面设计可以调用不同的模块绘制各种场景使用的图形,尤其是游戏场景中的界面都是动态的。今天主要就是学习了如何使用Tkinter模块来实现动态界面设计,我们分别运用到了:GUI库、Tkinter库、导入Tkinter库、Tkinter窗口中显示中文以及Tkinter组件。

你可能感兴趣的:(Python,python)