天天看点

14.Python常用第三方库—tkinter库的使用

目录

一、tkinter库介绍

二、tkinter常用控件介绍

三、tkinter布局方式

1.  tkinter布局方式表 

2   .grid()方法详解

四、canvas画布

1.  canvas属性方法表

2.  代码实例(小房子) 

五、tkinter应用程序开发基本流程 

六、tkinter代码实例演示

一、tkinter库介绍

        Python标准库tkinter是对Tcl/Tk的进一步封装,是一套完整的GUI开发模块的组合或套件,这些模块共同提供了强大的跨平台GUI编程的功能,所有的源码文件位于Python安装目录中lib\tkinter文件夹。

      tkinter与turtle类似,无需额外安装,使用起来非常方便。tkinter提供了很多控件和消息事件,可以很快入手,非常适合开发具有界面的轻量级应用程序。使用tkinter之前,需要导入tkinter模块:

import tkinter
           

二、tkinter常用控件介绍

      tkinter中的控件就是一些已经封装好的界面单元,可以直接使用,再复杂的应用程序都是由一个个控件单元组成。只要掌握了单个控件的使用方法,应用程序就可以如搭积木般创建出来。

(有感而发:想到老子的一句话:“道生一,一生二,二生三,三生万物。”)

控件名称 说明
Button 按钮,在界面中显示一个按钮
Canvas 画布,用于绘制直线、椭圆、多边形等各种图形
Checkbutton 复选框形式的按钮,用于在界面中提供多项选择功能,选择间没有互斥关系
Radiobutton 单选按钮,同一组中的单选钮任何时刻只能有一个处于选中状态
Entry 单行文本框
Text 多行文本框
Frame 框架,可作为其他组件的容器,常用来对组件进行分组
Label 标签,常用来显示单行文本
Listbox 列表框
Menu 菜单,用于显示菜单栏,包括下拉菜单和弹出菜单
Message 消息控件,可以根据自身大小将文本换行
Scale 滑动控件,显示一个数值刻度,为输出限定范围和数字之间,可以通过鼠标拖动改变数值
Scrollbar 滚动条控件,当内容超出可视化区域时使用
Toplevel 容器控件,常用来创建新的窗口
Spinbox 输入控件,与Entry类似,但是可以指定输入数值范围
PanedWindow 窗口布局管理插件,可以包含一个或多个子控件
LabelFrame 简单的容器控件,在复杂的窗口布局中使用
tkMessageBox 弹出消息框控件

三、tkinter布局方式

1.  tkinter布局方式表 

布局 参数 描述
pack after 将组件放置于其他组件后面
before 将组件放置于其他组件前面
anchor 组件的对齐方式:N(下/南)对齐,S(上/北)对齐,w(左/西)对齐,E(右/东)对齐
side 组件相对于主窗口的位置:TOP(上方),BOTTOM(下方),LEFT(左侧),RIGHT(右侧)
fill 填充方式,X:水平填充,Y:垂直填充
grid row 指定组件所在行
column 指定组件所在列
rowspan 跨越(合并)的行数
columnspan 跨越(合并)的列数
sticky 这个参数用来确定:在插件正常尺寸下,如何分配 单元 中多余的空间
place anchor 组件的对齐方式:N(下/南)对齐,S(上/北)对齐,w(左/西)对齐,E(右/东)对齐
x 组件左上角的x坐标
y 组件左上角的y坐标
relx 组件相对于窗口的x坐标,取值为0~1
rely 组件相对于窗口的y坐标,取值为0~1
width 组件宽度
height 组件高度
relwidth 组件相对于窗口的宽度,取值为0~1
relheight 组件相对于窗口的高度,取值为0~1

2   .grid()方法详解

以下语句可以在你的应用界面显示 w 插件:

w.grid(option=value , ...)
           

      这个方法使用 grid 结构管理器,登记了 w 插件。如果没有这条语句,将不会在屏幕中显示这个插件,而只存在于代码中。语句中的 option 项可查看下表,.grid() 结构管理器的参数。

.grid()结构管理器的参数

option 解释
column 插件布放的列数值,从0开始。默认值为0
columnspan 正常情况下,一个插件只占一个单元 。但是,你可以通过设置 columnspan 来合并一行中的多个邻近 单元 ,并用此 单元 放置本插件。比如, 

w.grid(row=0, column=2, columnspan=3)

 ,这会把插件 w 布置在 将第0行的2,3,4列合并后的 单元 中。
in_ 用 

in_=w2

 可以将 w 登记为 w2 的child插件。 w2 必须是 w 创建时指定parent插件的child插件。
ipadx x方向的内部填充。在插件内部,左右方向各填充指定长度的空间。
ipady y方向的内部填充。在插件内部,上下方向各填充指定长度的空间。
padx x方向的外部填充。在插件外部,左右方向各填充指定长度的空间。
pady y方向的内部填充。在插件内部,上下方向各填充指定长度的空间。
row 插件布放的行数值,从0开始。默认值 为 未布放行 的下一个数值。
rowspan 正常情况下,一个插件只占一个单元 。但是,你可以通过设置 rowspan 来合并一列中的多个邻近 单元 ,并用此 单元 放置本插件。比如, 

w.grid(row=3, column=2, rowspan=4, columnspan=3)

 ,这会把插件 w 布置在 合并了20个 单元 的区域中,也就是3-6行和2-6列。
sticky 这个参数用来确定:在插件正常尺寸下,如何分配 单元 中多余的空间。具体如下。
  • 如果没有声明sticky属性,默认将插件居中于 单元 中。
  • 通过设置 

    sticky=tk.NE

     (靠右上方),

    sticky=tk.SE

    (靠右下方),

    sticky=tk.SW

    (靠左下方),

    sticky=tk.NW

    (靠左上方),可以将插件布置在 单元 的某个角落。
  • 通过设置 

    sticky=tk.N

    (靠上方),

    sticky=tk.E

    (靠右方),

    sticky=tk.S

    (靠下方),

    sticky=tk.W

    (靠左方),可以将插件布置在 单元 的某个方向上。
  • 通过设置

    sticky=tk.N+tk.S

    ,在垂直方向上延伸插件,并保持水平居中。
  • 通过设置

    sticky=tk.E+tk.W

    ,在水平方向上延伸插件,并保持垂直居中。
  • 通过设置

    sticky=tk.N+tk.E+tk.W

    ,在水平和垂直方向上延伸插件,填满 单元 。
  • 也可以使用其他的组合。比如,

    sticky=tk.N+tk.S+tk.W

    ,在垂直方向上延伸插件,并靠左布放。

注:.grid()方法翻译自新墨西哥理工大学计算机中心

四、canvas画布

1.  canvas属性方法表

属性和方法 说明
控制参数 background,简称bg 背景色
foreground,简称fg 前景色
borderwidth 边框宽度
width 宽度
height 高度
bitmap 位图
image 图片
方法 create_arc 绘制圆弧
create_bitmap 绘制位图,支持xbmn格式
 create_image 绘制图片,支持gif格式
create_line 绘制直线
create_oval 绘制椭圆
create_ploygon 绘制多边形
create_rectangle  绘制矩形
create_text 绘制文本框
create_window 绘制窗口
delete 删除绘制的图形
itemconfig 修改图形属性
move 移动图形,如move(1,4,5),1为图像对象标识,4为水平移动像素,5为垂直移动像素
coords 重新设置图形位置
 update 刷新画布

2.  代码实例(小房子) 

代码实例

# coding=utf-8
import tkinter as tk      # 导入tkinter模块

root = tk.Tk()            # 创建一个顶级窗口
root.title('小房子1')     # 设置标题
canvas = tk.Canvas(root, bg='white', width=700, height=700)   # 在root窗口上创建画布canvas,白色背景,宽和高均为700像素
canvas.pack(anchor='center')   # canvas在root上居中显示

points = [(50, 250), (350, 50), (650, 250)]   # 三角形顶点坐标位置
canvas.create_polygon(points, fill='gray', outline='black', width=10)   # 白色填充,红色线条,线宽为10
canvas.create_rectangle((200, 250, 500, 550),
                        fill='white', outline='black', width=10)     # 绘制矩形,白色填充,绿色线条,线宽为10
canvas.create_oval((250, 300, 450, 500),
                   fill='yellow', outline='black', width=10)    # 绘制圆形,黄色填充,黄色线条,线宽为10

root.mainloop()   # 进入消息循环
           
运行结果
14.Python常用第三方库—tkinter库的使用

五、tkinter应用程序开发基本流程 

  1. 编写通用代码,例如数据库操作、程序中需要多次调用的函数,这需要在编写代码之间对软件的功能进行分析和整理,最终提炼出通用部分的代码封装成类或函数。
  2. 搭建界面,放置菜单、标签、按钮、输入框、选择框等组件,设置组件属性。
  3. 编写组件的事件处理代码。
# 根据需要导入需要的模块
import tkinter
import tkinter.ttk
import tkinter.messagebox
import tkinter.simpledialog

# 这里编写通用代码,或单独放置到另外的模块中再导入

# 创建tkinter应用程序主窗口
root = tkinter.Tk()

# 此处编写设置窗口属性的代码

# 此处编写创建窗口上各种组件的代码

# 以及按钮、组合框等交互式组件的事件代码

# 启动消息主循环,启动应用程序
root.mainloop()
           

六、tkinter代码实例演示

个人介绍页面代码展示

#coding = utf-8
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox

'''全局变量的定义'''
# 顶层窗口
root = None
# 姓名和密码Entry控件
entry_name, entry_pwd = None, None
# 性别、学历控件绑定的值
sex, education = None, None
# 音乐、舞蹈控件绑定的值
music, dance = None, None
# 个人介绍Text控件绑定的值
text_remark = None

def radiobutton_clicked():
    '''
    Radiobutton单选按钮控件点击触发事件
    :return:
    '''
    global sex
    print("sex : " + str(sex.get()))

def checkbutton_clicked():
    '''
    Checkbutton多选按钮点击触发事件
    :return:
    '''
    global music, dance
    print("music : " + str(music.get()))
    print("dance : " + str(dance.get()))

def printInfo():
    '''
    获取和打印页面信息
    :return:
    '''
    print("submit is called......")
    global entry_name, entry_pwd, text_remark, \
        sex, music, dance, education
    print('name : %s' % (entry_name.get()))
    print('pwd : %s' % (entry_pwd.get()))
    print('remark : %s' % (text_remark.get('0.0', 'end')))
    print('sex : %s' % (sex.get()))
    print('pwd : %s' % (entry_pwd.get()))
    print("education : %s" % (education.get()))

def close():
    '''
    关闭窗口
    :return:
    '''
    print("close is called......")
    global root
    root.quit()

def showDlg():
    '''
    显示对话框
    :return:
    '''
    global entry_name
    messagebox.showinfo(title='对话框事例', message=entry_name.get())

def createUI():
    '''
    创建窗口和控件
    :return:
    '''
    global root, entry_name, entry_pwd, sex, \
        education, music, dance, text_remark
    root = Tk()
    root.title("Register")
    sex = IntVar()
    music = IntVar()
    dance = IntVar()
    sex.set(1)      # 1:男性, 2:女性
    music.set(1)    # 1:选中, 0:不选中
    dance.set(0)    # 1:选中, 0:不选中

    # frame_head,其父窗口为root
    frame_head = Frame(root)
    frame_head.pack(side=TOP, fill=BOTH, expand=YES)

    # frame_account,其父窗口为frame_head
    frame_account = Frame(frame_head)
    frame_account.grid(row=0, column=0)
    label_name = Label(frame_account, text='姓名:', width=10)
    label_name.grid(row=0, column=0, padx=10, pady=5)
    entry_name = Entry(frame_account, foreground='blue', width=28)
    entry_name.insert(0, '简时刻')

    #entry_name.delete(3, END)
    entry_name.grid(row=0, column=1, padx=10, pady=5)
    label_pwd = Label(frame_account, text='密码:', width=10)
    label_pwd.grid(row=1, column=0, padx=10, pady=5)
    entry_pwd = Entry(frame_account, show="*",foreground='red', width=28)
    entry_pwd.insert(0, '123456')
    entry_pwd.grid(row=1, column=1, padx=10, pady=5)
    label_sex = Label(frame_account, text='性别:', width=10)
    label_sex.grid(row=2, column=0, padx=10, pady=5)
    frame_sex = Frame(frame_account)
    frame_sex.grid(row=2, column=1, padx=10, pady=5)

    # 1:选中, 0:不选中
    radio_btn_m = Radiobutton(frame_sex, variable=sex, text='男', value=1,
                              command=radiobutton_clicked)
    radio_btn_m.grid(row=0, column=0, padx=20, pady=5)
    radio_btn_f = Radiobutton(frame_sex, variable=sex, text='女', value=2,
                              command=radiobutton_clicked)
    radio_btn_f.grid(row=0, column=1, padx=20, pady=5)

    # frame_image,其父窗口为frame_head
    frame_image= Frame(frame_head)
    frame_image.grid(row=0, column=1)
    bm = PhotoImage(file="男孩.png")
    label_image = Label(frame_image,image=bm)
    label_image.bm = bm
    label_image.grid(row=0,column=1, padx=10, pady=5)

    # frame_info,其父窗口为root
    frame_info = Frame(root)
    frame_info.pack(side=TOP, fill=BOTH, expand=YES)
    label_education = Label(frame_info, text='学历:', width=10)
    label_education.grid(row=1, column=0, padx=10, pady=5)
    education = StringVar()
    comb_education = Combobox(frame_info,
                              textvariable=education, width=40)
    comb_education.grid(row=1, column=1, padx=10, pady=5)
    comb_education['value'] = ['专科','本科','硕士','博士']
    comb_education.current(2)
    label_hobby = Label(frame_info, text='爱好:', width=10)
    label_hobby.grid(row=2, column=0, padx=10, pady=5)
    frame_hobby = Frame(frame_info, width=40)
    frame_hobby.grid(row=2, column=1, padx=10, pady=5)
    check_btn_music = Checkbutton(frame_hobby, text='编程',
                                  variable=music,
                                  command=checkbutton_clicked)
    check_btn_music.grid(row=0, column=0, padx=20, pady=5)
    check_btn_dance = Checkbutton(frame_hobby, text='阅读',
                                  variable=dance,
                                  command=checkbutton_clicked)
    check_btn_dance.grid(row=0, column=1, padx=20, pady=5)
    check_btn_music = Checkbutton(frame_hobby, text='游戏',
                                  variable=music,
                                  command=checkbutton_clicked)
    check_btn_music.grid(row=0, column=2, padx=20, pady=5)

    # frame_remark,其父窗口是root
    frame_remark = Frame(root)
    frame_remark.pack(side=TOP, fill=BOTH, expand=YES)
    text_remark = Text(frame_remark, width=55,
                     height=5, foreground='green')
    text_remark.insert(1.0, '1. 简时刻就读于广州大学教育技术学专业\n')
    text_remark.insert(2.0, '2. 大二参加互联网比赛以及挑战杯\n')
    text_remark.insert(3.0, '3. 大三考取计算机二级office、python和教师资格证书\n')
    text_remark.insert(4.0, '4. 目前正在学习Python,水平菜鸟入门级')
    text_remark.grid(row=0, column=0, padx=10, pady=5)

    # frame_btn,其父窗口为root
    frame_btn = Frame(root, width=40)
    frame_btn.pack(side=BOTTOM, fill=BOTH, expand=YES)
    btn_submit = Button(frame_btn, text='获取信息', command=printInfo)
    btn_submit.grid(row=0, column=0, padx=20, pady=10)
    btn_quit = Button(frame_btn, text='关闭窗口', command=close)
    btn_quit.grid(row=0, column=1, padx=20, pady=10)
    btn_dlg = Button(frame_btn, text='对话框', command=showDlg)
    btn_dlg.grid(row=0,column=2, padx=20, pady=10)
    root.mainloop()

if __name__ == '__main__':
    createUI()
           

运行结果

14.Python常用第三方库—tkinter库的使用
14.Python常用第三方库—tkinter库的使用