赞
踩
目录
一、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布局方式
布局 | 参数 | 描述 |
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 |
以下语句可以在你的应用界面显示 w 插件:
w.grid(option=value , ...)
这个方法使用 grid 结构管理器,登记了 w 插件。如果没有这条语句,将不会在屏幕中显示这个插件,而只存在于代码中。语句中的 option 项可查看下表,.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=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画布
属性和方法 | 说明 | |
控制参数 | 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 | 刷新画布 |
代码实例
- # 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() # 进入消息循环
运行结果
五、tkinter应用程序开发基本流程
- # 根据需要导入需要的模块
- 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()
运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。