Python-Tkinter 基础教程

介绍

Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。

注意:Python3.x 版本使用的库名为 tkinter,即首写字母 T小写

模块

导入方式

import tkinter

验证模块是否已安装

终端中运行命令:python -m tkinter ,运行后界面会弹出一个 tk 小窗口,表示安装成功,而且告诉你 Tcl/Tk 的版本号,通过这个版本号,你就可以参考对应的 Tcl/Tk 文档了。

API 使用

主窗口

创建 GUI 界面,作为根窗口:

# 创建主窗口
root = tk.Tk()
root.title("tk Root")  # 设置窗口名称
root.geometry('200x200')  # 设置窗口大小

运行窗口

# 运行
root.mainloop()

组件列表介绍

名称 简介
Toplevel 顶层 容器类,为其他组件提供单独容器
Button 按钮 按钮组件
Canvas 画布 提供绘图功能,包括:直线,矩形,椭圆,多边形,位图等
Checkbutton 复选框 可选的复选框
Entry 单行输入框 可输入内容
Frame 容器 装载其它GUI组件
Label 标签 显示不可编辑的文本或图标
LabelFrame 容器 容器组件,类似Frame支持添加标题
Listbox 列表框 列出多个选项,供选择
Menu 菜单 菜单组件
Menubutton 菜单按钮 包含菜单的按钮(下拉式,层叠式)
OptionMeny 菜单按钮 Menubutton的子类,可通过按钮打开一个菜单
Message 消息框 类似标签,但可以显示多行文本
PanedWindow 分区窗口 该容器会被划分成多个区域,每添加一个组件占一个区域,用户可以拖动分割线改变各区域大小
Radiobutton 单选钮 供用户点边的单选妞
Scale 滑动条 拖动滑动块可设定起始值和结束值,可显示当前位置的精确值
Spinbox 微调选择器 可通过该组件的向上、向下箭头选择不同的值
Scrollbar 滚动条 为组件提供滚动功能
Text 多行文本框 显示多行文本

Label 标签

属性说明:

width, height=宽高 font(name,size)=字体 image=图像(只支持GIF格式)

fg(foreground)=前景色 bg(background)=背景色 justify(left|center|right)=对齐方式

# 设置 label 属性
L = tk.Label(root,               # 窗口
             text='展示标签!',   # 描述
             bg='green',         # 背景
             borderwidth=5,   # 边界宽度
             relief="solid",  # 指定组件 3D 效果
             justify="right",  # 字体对齐方式
             font=('微软雅黑', 12),  # 字体
             width=15, height=2)  # 宽高
# 放置 label 控件在窗口中的位置
L.pack(side='right')    # 上top下bottom 左left右right
# 配置GIF图片方式
gifpath = r"D:\xxx\www.gif"
photo = tk.PhotoImage(file=gifpath)  # 实例化图片对象
lab = tk.Label(image=photo)          # 设置图片标签
lab.pack()

Button 按钮

# 定义空字符串变量,用于标签属性中接收数据
var = tk.StringVar()
# 设置 label 标签属性
L = tk.Label(root,               # 窗口
             # text='展示标签!',   # 描述
             textvariable=var,   # 接收外部传参
             bg='green',         # 背景
             font=('微软雅黑', 12),  # 字体
             width=15, height=2)  # 宽高
# 放置 label 位置
L.pack()    # 上下 左left右right

on_func = False  # 定义一个开关
# 按钮事件
def func():
    global on_func
    if on_func:
        on_func = False
        var.set('')
    else:
        on_func = True
        var.set('要显示内容')
# 设置 button 按钮属性
B = tk.Button(root,  text='按钮',  width=15, height=2,
              command=func)        # 设置按钮事件,函数
B.pack()

Options 属性选项

组件中的属性,可以通过 Options 设置组件对应的属性,从而控制组件的各种状态。比如:宽度、高度、背景色等等。

有三种方式设置 Options 选项,在各种 GUI 组件中用法都一致。

  1. 创建对象时,使用命名参数(也叫关键字参数):
fred = Button(width=15, height=2, bg="blue")
  1. 创建对象后,使用字典索引方式:
fred['fg'] = "red"
fred['bg'] = "blue"
  1. 创建对象后,使用 config() 方式:
fred.config(width=15, height=2, bg="blue")
  • 属性选项列表:
属性名 简介
activebackground 指定组件处于激活状态时的背景色
activeforeground 指定组件处于激活状态时的前景色
disabledforeground 指定组件处于禁用状态时的前景色
anchor 指定组件内的字符在组件中显示位置,选项值(N,NE,E,SE,S,SW,W,NW,CENTER)
background 组件正常的背景色(bg)
foreground 组件正常的前景色(fg)
bitmap 指定在组件上显示该选项指定的位图,位图的显示方式受anchor、justify影响。如果同时指定bitmap和text,那么bitmap覆盖文本;如果同时指定bitmap和image,那么image覆盖bitmap。
relief 组件的3D效果,支持: raised(凸起),sunken(凹陷),flat(平坦),ridge(隆起),solid(实心),groove(凹槽)
borderwidth 指定组件正常显示的3D边框宽度
cursor 指定光标在组件上的样式
command 指定组件关联的命令方法。该方法在组件离开组件时触发
font 组件上显示的文字字体
highlightbackground 指定组件在高亮状态下的背景色
highlightcolor 指定组件在高亮状态下的前景色
highlightthickness 指定组件在高亮状态下的周围方形区域的宽度
state 组件的当前状态,支持:NORMAL(正常),DISABLE(禁用)
height 组件的高度
width 组件的宽度
wraplength 对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过设定自动换行
image 组件中显示的图片
justify 组件内部内容对齐方式,支持(小写):LEFT(左对齐),CENTER(居中),RIGHT(右对齐)
padx 组件内部在水平方向上两边的空白
pady 组件内部在垂直方向上两边的空白
takefocus 指定组件在键盘遍历(Tab或Shift+Tab)时是否接收焦点,将选项设为1:接收焦点;设为0:不接受焦点
text 组件显示的文本
textvariable 指定一个变量名,组件负责显示该变量值转换得到的字符串
underline 指定组件文本的第几个字符添加下划线,该选项相当于为组件绑定了快捷键
xscrollcommand 通常用于将组件的水平滚动改变与水平滚动条的 set 方法关联,从而让组件的水平滚动改变传递到水平滚动条
yscrollcommand 通常用于将组件的垂直滚动改变与垂直滚动条的 set 方法关联,从而让组件的垂直滚动改变传递到垂直滚动条

文本框

Entry 单行文本框

Entry 用来接收一行字符串的控件,如果用户输入的内容长度超过 Entry 控件的宽度时,文字会自动换行。

简单示例:

def login():
    print('名称:'+entry1.get())  # 接收文本框的内容
labe = tk.Label(root, text="名称:")
labe.pack()
 
v1 = tk.StringVar() # 设置空字符串变量,属性value='可设置默认值'
# 单行文本框
# show属性可将输入的内容转为指定字符方式显示,比如输入密码
entry1 = tk.Entry(root, textvariable=v1, show='*')
entry1.pack()
v1.set('设置初始值...')  # 方式二:单独设置默认值
tk.Button(root, text='发送文本中内容', command=login).pack()  

Text 多行文本框

主要用来显示多行文本,还可以显示网页链接、图片、HTML、CSS样式表、添加组件等等。

wrap=换行方式,word:单词换行
undo,True:开启撤销功能, False:不开启

示例:

''' Text 多行文本框  '''
tk.Label(root, text='文本框:', width=30).pack(anchor='w')
# 创建多行文本
tex = tk.Text(root, width=40, height=12)
tex.pack()
  • insert(index, ‘str’) 插入属性

index:位置,可数字表示(行从1起,列从0起),或INSERT(开始)、END(结尾)
str:需要插入的内容
规则:不包头,包尾

tex.insert('insert', 'ABCD\nEFG') # 在第一行第0列位置插入内容
tex.insert(2.2, '12345')  # 在第二行第3列位置插入内容
'''结果:
ABCD
EF12345G
'''
  • get(insert, end) 获取内容属性

insert:起始位置,int类型,用1.0表示(行从1起,列从0起);
end:结尾,str类型或 int类型,用1.0表示(行从1起,列从0起);

tex.get(3.2, 3.7)  # 指定范围内
tex.get(3.2, 'end')  # 指定起始位置至结尾
  • 在文本框中放入图片:
gifpath1 = r"D:\xxxx\www.gif"
photo1 = tk.PhotoImage(file=gifpath1)
tex.image_create('end', image=photo1)  # 在结尾放入图片

文本框属性:

background, bd, bg, borderwidth, cursor,exportselection, fg, font, foreground, ighlightbackground,
highlightcolor, highlightthickness, insertbackground,insertborderwidth, insertofftime, insertontime,
insertwidth,invalidcommand, invcmd, justify, relief, selectbackground,selectborderwidth,
electforeground, show, state, takefocus,textvariable, validate, validatecommand, vcmd, width,xscrollcommand

选择框

Radiobutton 单选框

value: 定义单选按钮返回的内容

''' 单选按钮 '''
def confirm():
    messagebox.showinfo('测试', '选择的内容:' + var.get())
var = tk.StringVar()
var.set("J")
tk.Label(root, text='单选: ', width=10).pack(anchor='w')
radio1 = tk.Radiobutton(root, text='Python', value='P', variable=var)
radio2 = tk.Radiobutton(root, text='Java', value='J', variable=var)
radio1.pack(anchor='w');  radio2.pack(anchor='w')
tk.Button(root, text='确认', command=confirm).pack()

Checkbutton 多选框

onvalue=1 # 1 表示默认选状态,0 表示不选
offvalue=0 # 未选择的返回值

def check():
    if code.get() == 1 and vide.get() == 1:
        messagebox.showinfo('多选', '选择:python, java')
    elif vide.get() == 1:
        messagebox.showinfo('多选', '选择:java')
    elif code.get() == 1:
        messagebox.showinfo('多选', '选择:python')
    else:
        messagebox.showinfo('多选', '都没选择!')
tk.Label(root, text='多选:', width=10).pack(anchor='w')
code = tk.IntVar();  vide = tk.IntVar()   # 接收int类型参数
check1 = tk.Checkbutton(root, text='python', onvalue=1, offvalue=0, variable=code)
check2 = tk.Checkbutton(root, text='Java', onvalue=1, offvalue=0, variable=vide)
check1.pack(anchor='w'); check2.pack(anchor='w')
tk.Button(root, text='多选确认', command=check).pack()

选择框属性:

activebackground, activeforeground, anchor,background, bd, bg, bitmap, borderwidth,
command, cursor,disabledforeground, fg, font, foreground, height,highlightbackground,
highlightcolor, highlightthickness, image,indicatoron, justify, offvalue, onvalue, padx, pady,
relief,selectcolor, selectimage, state, takefocus, text, textvariable,underline, variable, width, wraplength

通用消息弹窗

messagebox 消息弹框

Messagebox 用于显示弹出消息。Messagebox主要提供了7种消息提示,如:showinfo()、showerror()、showwarning()、askquestion()、askokcancel()、askyesno()、askretyrcancel()。

导入方式:

from tkinter import messagebox

消息对话框函数列表:

返回值:选择项

函数 说明
showinfo(title, message, **options) 消息提示框
showerror(title, message, **options) 错误提示框
showwarning(title, message, **options) 警告提示框
askquestion(title, message, **options) 疑问提示框
askokcancel(title, message, **options) 确定/取消
askyesno(title, message, **options) yes/No
askretrycancel(title, message, **options) 重试/取消

简单示例:

import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.title("TK title")
root.geometry("500x1000+100+200")
def msg1():
    messagebox.showinfo('information', 'Hi! You got a prompt.')
    messagebox.showerror('error', 'Something went wrong!')
    messagebox.showwarning('warning', 'accept T&C')
    messagebox.askquestion('Ask Question', 'Do you want to continue?')
    messagebox.askokcancel('Ok Cancel', 'Are You sure?')
    messagebox.askyesno('Yes|No', 'Do you want to proceed?')
    messagebox.askretrycancel('retry', 'Failed! want to try again?')
tk.Button(root, text='Click Me', command=msg1).pack(pady=50)

canvas 画布

canvas 画布是一个矩形区域,可以放置图形、图像、组件等等。

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        # 代表父类的定义,不是父类对象
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidget()
    def createWidget(self):
        self.canvas = tk.Canvas(self, width=300, height=200, bg='green')
        self.canvas.pack()
        # 画一条直线
        self.canvas.create_line(10,10,30,20,40,50)
        # 画一个矩形
        self.canvas.create_rectangle(50,50,100,100)
        # 画一个圆
        self.canvas.create_oval(50,50,100,100)
        # 加图片
        path = "D:\wangxin_m\selenium_py36\gui_tkinter\www.gif"
        global photo
        photo = tk.PhotoImage(file=path)
        self.canvas.create_image(110,300, image=photo)
if __name__ == '__main__':
    root = tk.Tk()
    root.title('画布练习')
    root.geometry('500x200+200+200')
    app = Application(master=root)
    root.mainloop()

布局管理

一个 GUI 应用程序必然有大量的组件,tkinter提供了布局管理器帮助我们组织、管理在父组件中子组件的布局方式。提供了三种管理器:pack、grid、place

grid 表格布局

采用表格结构组织组件;子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。

grid()方法提供的选项:
选项 说明
column 单元格的列号(从0开始)
columnspan 跨列
row 单元格的行号(从0开始)
rowspan 跨行
ipadx,ipady 设置子组件之间的间隔
padx,pady 并列的组件之间的间隔
sticky 组件紧贴所在单元格的某一角,对应对应东南西北及4个角
import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        # 代表父类的定义,不是父类对象
        super().__init__(master)
        self.master = master
        self.pack()
        self.gridWidget()    
    def gridWidget(self):
        self.labY = tk.Label(self, text='用户名')
        self.labP = tk.Label(self, text='iPhone')
        self.enrY = tk.Entry(self)
        self.enrP = tk.Entry(self)
        # 设置控件位置
        self.labY.grid(row=0, column=0) # row=0, column=0 表示:第1行第1列位置 
        self.enrY.grid(row=0, column=1)
        self.labP.grid(row=1, column=0)
        self.enrP.grid(row=1, column=1)
        tk.Button(self, text='登录').grid(row=2, column=0, sticky='w')
        tk.Button(self, text='取消').grid(row=2, column=1, sticky='e')
        # 跨行,多行文本框
        self.text = tk.Text(self, width=28, height=3)
        self.text.grid(row=3, column=0, columnspan=2)
if __name__ == '__main__':
    root = tk.Tk()
    root.title('画布练习')
    app = Application(master=root)
    root.mainloop()

计算器布局示例:

class Application(tk.Frame):
    def __init__(self, master=None):
        # 代表父类的定义,不是父类对象
        super().__init__(master)
        self.master = master
    
  • 7
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值