tkinter模块

发布时间 2023-11-03 18:53:43作者: donfag

以下内容参考的是:Python GUI开发手册(化学工业出版社)
一、创建一个空白窗口:

from tkinter import *
win = Tk()
win.title("My GUI")
win.mainloop()

二、设置窗口属性:
1、设置窗口样式的相关方法及其含义:
title()
geoemetry("widthxheight")     设置窗口标题
maxsize()                设置窗口的大不上及位置,单位为pilex
minsize()               窗口的最大尺寸
configure(bg=color)                           窗口的最小尺寸
resizable(True,True)                         设置窗口大小是否可以更改,第一个表示是否可以更改宽度,第二个是高度,默认True
state("zoomed")                                将窗口最大化
iconify()                                             将窗口最小化
iconbitmap()                                      设置窗口的默认图标
示例:给窗口添加标题:

from tkinter import *
win = Tk()
win.title("My GUI")
txt = Label(win,text="\n\ngame over\n\n").pack()
win.mainloop()

三、设置窗口位置:

from tkinter import *
win = Tk()
win.title("My GUI")
win.configure(bg="#a7ea90")                                 #窗口背景颜色
winw = 300                                                  #窗口宽度
winh = 220                                                  #窗口高度
scrw = win.winfo_screenwidth()                              #获取屏幕宽度
scrh = win.winfo_screenheight()                             #获取屏幕高度
x = (scrw-winw)/2                                           #计算窗口的水平位置
y = (scrh-winh)/2                                           #计算窗口的垂直位置
win.geometry("%dx%d+%d+%d" %(winw,winh,x,y))                #设置窗口大小和位置
str = "\n\n登高\n\n风急天高猿啸哀,渚清沙白鸟飞回。\n\n无边落木萧萧下,不尽长江滚滚来。\n\n万里悲秋常作客,百年多病独登台。\n\n艰难苦恨繁霜鬓,潦倒新停浊酒杯。"
txt = Label(win,text=str,fg="red",bg="#a7ea90").pack()
win.mainloop()

四、tkinter组件分类:
1、文件类组件:
Label:标签组件。主要用于显示文本,添加提示信息
Entry:单行文本组件。只能添加单行文本
Spinbox:输入组件。可以理解为列表菜单与单行文本框的组合体,因为该组件既可以输入内容,也可以直接从现有的选项中选择值
Scale:数字范围组件。可以使用户拖动滑块选择数值,类似于HTML5表单中的range
2、按钮类组件:
Button:按钮组件
Radiobutton:单选组件
Checkbutton:复选框组件
3、选择列表类组件:
Listbox:列表框组件
Scrollbar:滚动条组件
OptionMenu:下拉列表
Combobox:组合框
4、容器类组件:
Frame:框架组件。用于将相关的组件放置在一起,以便于管理
LabelFrame:标签框架组件。将相关组件放置在一起,并给它们一个特定的名称
Toplevel:顶层窗口。重新打开一个新窗口,该窗口显示在根窗口的上方
PanelWindow:窗口布局管理。通过该组件可以手动修改其子组件的大小
Notebook:选项卡。选择不同的内容,窗口中可显示对应的内容
5、会话类组件:
Message:消息框。为用户显示一些短消息,与Label类似,但比Label更灵活
Messagebox:会话框。该组件提供了8种不同场景的会话框
6、菜单类组件:
Menu:菜单组件。可以为窗口添加菜单项以及二级菜单
Toolbar:工具栏。为窗口添加工具栏
Treeview:树菜单
7、进度条组件:
Progressbar:添加进度条

五、虽然tkinter模块中每个组件都有各自的属性,但有些属性是各组件通用的:
foreground或fg:设置组件中文字的颜色
background或bg:设置组件的背景颜色
width:设置组件的宽度
height:设置组件高度
anchor:文字在组件内输出的位置,默认为center
padx:组件的水平间距
pady:组件的垂直间距
font:组件的文字样式
relief:组件的边框样式,主要有:solid,raised,sunken,flat,groove,ridge
cursor:鼠标悬停在组件上时的样式
示例:

from tkinter import *
win = Tk()
win.title("My GUI")
win.configure(bg="#a7ea90")                                 #窗口背景颜色
winw = 300                                                  #窗口宽度
winh = 220                                                  #窗口高度
scrw = win.winfo_screenwidth()                              #获取屏幕宽度
scrh = win.winfo_screenheight()                             #获取屏幕高度
x = (scrw-winw)/2                                           #计算窗口的水平位置
y = (scrh-winh)/2                                           #计算窗口的垂直位置
win.geometry("%dx%d+%d+%d" %(winw,winh,x,y))                #设置窗口大小和位置
str = "\n\n登高\n\n风急天高猿啸哀,渚清沙白鸟飞回。\n\n无边落木萧萧下,不尽长江滚滚来。\n\n万里悲秋常作客,百年多病独登台。\n\n艰难苦恨繁霜鬓,潦倒新停浊酒杯。"
txt = Label(win,text=str,fg="red",bg="#a7ea90",width=260,height=260,anchor="nw").pack()
#anchor位置参数说明:
#nw:左上角;w:左中间;sw:左下角;n:上中间;s:下中间;ne:右上角;e:右中间;se:右下角
win.mainloop()

font属性的参数及含义:
family:设置字体,例如:Times New Roman
size:设置字号,单位px
weight:设置文字粗细,如bold
slant:设置斜体,如italic
underline:添加下划线,值为True或False
overstrike:添加删除线,值为True或False
示例1:

from tkinter import *
win = Tk()
win.title("My GUI")
win.configure(bg="#a7ea90")                                 #窗口背景颜色
winw = 300                                                  #窗口宽度
winh = 220                                                  #窗口高度
scrw = win.winfo_screenwidth()                              #获取屏幕宽度
scrh = win.winfo_screenheight()                             #获取屏幕高度
x = (scrw-winw)/2                                           #计算窗口的水平位置
y = (scrh-winh)/2                                           #计算窗口的垂直位置
win.geometry("%dx%d+%d+%d" %(winw,winh,x,y))                #设置窗口大小和位置
str = "\n\n登高\n\n风急天高猿啸哀,渚清沙白鸟飞回。\n\n无边落木萧萧下,不尽长江滚滚来。\n\n万里悲秋常作客,百年多病独登台。\n\n艰难苦恨繁霜鬓,潦倒新停浊酒杯。"
txt = Label(win,text=str,fg="red",bg="#C3DEEF",font=("华文新魏",16,"bold","italic","underline","overstrike"),padx=200,pady=10).pack()
win.mainloop()

示例2:

from tkinter import *
win = Tk()
win.title("My GUI")
win.configure(bg="#a7ea90")                                 #窗口背景颜色
winw = 300                                                  #窗口宽度
winh = 220                                                  #窗口高度
scrw = win.winfo_screenwidth()                              #获取屏幕宽度
scrh = win.winfo_screenheight()                             #获取屏幕高度
x = (scrw-winw)/2                                           #计算窗口的水平位置
y = (scrh-winh)/2                                           #计算窗口的垂直位置
win.geometry("%dx%d+%d+%d" %(winw,winh,x,y))                #设置窗口大小和位置
str = "\n\n登高\n\n风急天高猿啸哀,渚清沙白鸟飞回。\n\n无边落木萧萧下,不尽长江滚滚来。\n\n万里悲秋常作客,百年多病独登台。\n\n艰难苦恨繁霜鬓,潦倒新停浊酒杯。"
txt = Label(win,text=str,fg="red",bg="#C3DEEF",relief="groove",cursor="spider")
txt.pack(padx=260,pady=260,side=LEFT)
win.mainloop()

六、tkinter布局管理
1、pack()方法。它是常用的一种布局方式,其参数及含义如下:
side:设置组件水平展示或垂直展示,主要有四个属性值:
top:指组件从上到下依次排列,默认值
bottom:指组件从下到上依次排列
left:指组件从左到右依次排列
right:指组件从右到左依次排列
padx:设置组件距离窗口的水平距离
pady设置组件距离窗口的垂直距离
ipadx:设置组件内的文字距离组件边界的水平距离
ipady:设置组件内的文字距离组件边界的垂直距离
fill:设置组件填充所在的空白空间的方式,主要有四个属性值:
x:表示完全填充水平方向的空白空间
y:表示完全填充垂直方向的空白空间
both:表示水平和垂直方向的空白空间都完全填充
none:表示不填充空白空间,默认值
expand:设置组件是否完全填充其余空间(父容器的额外空间),其值为True(1)或False(0)
anchor:设置组件在窗口中的位置,其值如下:
nw:左上角;w:左中间;sw:左下角;n:上中间;s:下中间;ne:右上角;e:右中间;se:右下角
before:设置该组件应该位于指定组件的前面
after:设置该组件应该位于指定组件的后面
示例1:

from tkinter import *
win = Tk()
txt1 = "春风吹又生"
txt2 = "夏浅蝉未多"
txt3 = "秋到天空阔"
txt4 = "冬钓寒江雪"
Label(win,text=txt1,bg="#F5DFCC").pack(side="top",padx=20,pady=5,ipadx=10,ipady=5,fill="both")
Label(win,text=txt2,bg="#EDB584").pack(side="top",padx=20,pady=5,ipadx=10,ipady=5)
Label(win,text=txt3,bg="#EF994C").pack(side="top",padx=20,pady=5,ipadx=10,ipady=5)
Label(win,text=txt4,bg="#A7EA90").pack(side="top",padx=20,pady=5,ipadx=10,ipady=5,fill="both")
win.mainloop()

示例2:

from tkinter import *
win = Tk()
txt = "野火烧不尽,春风吹又生"
Label(win,text=txt,bg="#E6F5C8",fg="red",font=14).pack(side="top",fill="x",expand=1,anchor="nw")
win.mainloop()

示例3:

from tkinter import *
win = Tk()
win.geometry("350x150")     #设置窗口大小
win.title("退出窗口提示")
win.resizable(False,False)  #不可更改窗口大小
txt1 = Label(win,text="确定退出本窗口吗?")
txt2 = Label(win,text="果断退出",bg="#c1ffc1")
txt3 = Label(win,text="我再想想",bg="#cdb5cd")
txt1.pack(fill="x",padx=20)
txt2.pack(side="right",anchor="se",padx=10,pady=20,ipadx=6)
txt3.pack(side="right",anchor="se",padx=10,pady=20,ipadx=6)
win.mainloop()

示例4:

from tkinter import *
win = Tk()
win.title("动力象棋")
txt1 = Label(win,text="象吃狮",bg="#f1c5c5",font=14)
txt4 = Label(win,text="豹吃狼",bg="#f1c5c5",font=14)
txt3 = Label(win,text="虎吃豹",bg="#cdb5cd",font=14)
txt2 = Label(win,text="狮吃虎",bg="#c1ffc1",font=14)
txt6 = Label(win,text="狗吃猫",bg="#cdb5cd",font=14)
txt7 = Label(win,text="猫吃鼠",bg="#f1c5c5",font=14)
txt5 = Label(win,text="狼吃狗",bg="#c1ffc1",font=14)
txt8 = Label(win,text="鼠吃象",bg="#c1ffc1",font=14)
txt1.pack(side="left",padx=10,ipadx=6,fill="y",expand=1)
#将txt2放在txt1前面
txt2.pack(side="left",padx=10,ipadx=6,fill="y",expand=1,before=txt1)
txt3.pack(side="left",padx=10,ipadx=6,fill="y",expand=1,before=txt2)
txt4.pack(side="left",padx=10,ipadx=6,fill="y",expand=1,before=txt3)
txt5.pack(side="left",padx=10,ipadx=6,fill="y",expand=1,before=txt4)
txt6.pack(side="left",padx=10,ipadx=6,fill="y",expand=1,before=txt5)
txt7.pack(side="left",padx=10,ipadx=6,fill="y",expand=1,before=txt6)
txt8.pack(side="left",padx=10,ipadx=6,fill="y",expand=1,before=txt7)
win.mainloop()

2、grid()方法。网格布局,使用row定义组件所在的行,使用column定义组件所在的列,其相关参数及其含义如下:
row:组件所在行,从0开始
column:组件所在列,从0开始
rowspan:组件横向合并的行数
columnspan:组件纵向合并的行数
sticky:组件填充所分配空间空白区域的方式,和anchor类似,不过它只有4个可选的参数:
N:上对齐
S:下对齐
W:左对齐
E:右对齐
也可以组合使用:
N+S:拉长组件高度,使组件的顶端和底端对齐
N+S+E:拉长组件高度,使组件的顶端和底端对齐,同时切齐右边
N+S+W:拉长组件高度,使组件的顶端和底端对齐,同时切齐左边
E+W:拉长组件宽度,使组件的左边和右边对齐
N+S+E+W:拉长组件高度,使组件的顶端和底端对齐,同时切齐左边和右边
padx,pady:组件距离窗口边界的水平方向及垂直方向的距离

示例1:

from tkinter import *
win = Tk()
win.title("乘法口诀")
Label(win,text="1 * 1=1",bg="#E0FFFF").grid(row=0,column=0,padx=10)
Label(win,text="1 * 2=2",bg="#E0FFFF").grid(row=1,column=0,padx=10)
Label(win,text="1 * 3=3",bg="#E0FFFF").grid(row=2,column=0,padx=10)
Label(win,text="1 * 4=4",bg="#E0FFFF").grid(row=3,column=0,padx=10)

Label(win,text="2 * 2=4",bg="#EEA9B8").grid(row=1,column=1,padx=10)
Label(win,text="2 * 3=6",bg="#EEA9B8").grid(row=2,column=1,padx=10)
Label(win,text="2 * 4=8",bg="#EEA9B8").grid(row=3,column=1,padx=10)

Label(win,text="3 * 3=9",bg="#F08080").grid(row=2,column=2,padx=10)
Label(win,text="3 * 4=12",bg="#F08080").grid(row=3,column=2,padx=10)

Label(win,text="4 * 4=16",bg="#FFE1FF").grid(row=3,column=3,padx=10)
win.mainloop()

合并网格示例:

from tkinter import *
win = Tk()
Label(win,text="横向合并4格",width=15,height=1,relief="groove",bg="#EDE19A").grid(row=0,column=0,columnspan=4,sticky="w")

Label(win,text="横向合并2格",width=15,height=1,relief="groove",bg="#EDBE9A").grid(row=1,column=0,columnspan=2,sticky="W")
Label(win,text="横向合并2格",width=15,height=1,relief="groove",bg="#EDBE9A").grid(row=1,column=1,columnspan=2,sticky="W")

Label(win,text="不合并",width=15,height=1,relief="groove",bg="#E5AEAE").grid(row=2,column=0)
Label(win,text="不合并",width=15,height=1,relief="groove",bg="#E5AEAE").grid(row=2,column=1)
Label(win,text="不合并",width=15,height=1,relief="groove",bg="#E5AEAE").grid(row=2,column=2)
Label(win,text="不合并",width=15,height=1,relief="groove",bg="#E5AEAE").grid(row=2,column=3)
win.mainloop()

3、rowconfigure()和columnconfigure()方法设置组件的缩放比例:
tkinter模块添加的窗口默认情况下都可以通过鼠标拖动改变大小的,而当窗口大小改变时,可以通过rowconfigure()和columnconfigure()方法改变某行或某列组件所占空间随窗口缩放的比例。需要注意的是,两个方法是设置在父容器上的,并不是设置在组件上的。用法如下:
rowconfigure(0,weight=1)
columnconfigure(1,weight=1)
0,1分别表示第一行和第二列。weight=1表示随窗口缩放的比例为1
示例:

from tkinter import *
win = Tk()
win.rowconfigure(0,weight=1)
win.columnconfigure(1,weight=1)
Label(win,width=15,height=2,relief="groove",bg="pink").grid(row=0,column=0,sticky=N+W) #第一行第一列
Label(win,width=15,height=2,relief="groove",bg="gray").grid(row=0,column=1,sticky=N+E) #第一行第二列
Label(win,width=15,height=2,relief="groove",bg="yellow").grid(row=1,column=0,sticky=N+S+W) #第二行第一列
Label(win,width=15,height=2,relief="groove",bg="blue").grid(row=1,column=1,sticky=N+S+E) #第二行第二列
win.mainloop()

4、place()方法。可以设置组件的大小以及组件在容器中的精确位置。其参数及含义如下:
x:设置组件距离窗口左侧的水平距离
y:设置组件距离窗口顶部的垂直距离
width:设置组件的宽度
height:设置组件的高度
relx:设置组件距离容器左侧的相对距离,数值范围0-1
rely:设置组件距离容器顶部的相对距离,数值范围0-1
relwidth:组件相对父容器的宽度,数值范围0-1
relheight:组件相对父容器的高度,数值范围0-1
示例1:

from tkinter import *
win = Tk()
win.title("华容道")
win.geometry("240x300")
Label(win,text="赵云",bg="#93edd4",relief="groove",font=14).place(width=60,height=120,x=0,y=0)
Label(win,text="曹操",bg="#a6e3a8",relief="groove",font=14).place(width=120,height=120,x=60,y=0)
Label(win,text="黄忠",bg="#93edd4",relief="groove",font=14).place(width=60,height=120,x=180,y=0)
Label(win,text="张飞",bg="#93edd4",relief="groove",font=14).place(width=60,height=120,x=0,y=120)
Label(win,text="关羽",bg="#93edd4",relief="groove",font=14).place(width=120,height=60,x=60,y=120)
Label(win,text="马超",bg="#93edd4",relief="groove",font=14).place(width=60,height=120,x=180,y=120)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(width=60,height=60,x=60,y=180)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(width=60,height=60,x=120,y=180)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(width=60,height=60,x=0,y=240)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(width=60,height=60,x=180,y=240)
win.mainloop()

示例2:

from tkinter import *
win = Tk()
win.title("华容道")
win.geometry("240x300")
Label(win,text="赵云",bg="#93edd4",relief="groove",font=14).place(relwidth=0.25,relheight=0.4,relx=0,rely=0)
Label(win,text="曹操",bg="#a6e3a8",relief="groove",font=14).place(relwidth=0.5,relheight=0.4,relx=0.25,rely=0)
Label(win,text="黄忠",bg="#93edd4",relief="groove",font=14).place(relwidth=0.25,relheight=0.4,relx=0.75,rely=0)
Label(win,text="张飞",bg="#93edd4",relief="groove",font=14).place(relwidth=0.25,relheight=0.4,relx=0,rely=0.4)
Label(win,text="关羽",bg="#93edd4",relief="groove",font=14).place(relwidth=0.5,relheight=0.2,relx=0.25,rely=0.4)
Label(win,text="马超",bg="#93edd4",relief="groove",font=14).place(relwidth=0.25,relheight=0.4,relx=0.75,rely=0.4)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(relwidth=0.25,relheight=0.2,relx=0.25,rely=0.6)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(relwidth=0.25,relheight=0.2,relx=0.5,rely=0.6)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(relwidth=0.25,relheight=0.2,relx=0,rely=0.8)
Label(win,text="",bg="#f3f5c4",relief="groove",font=14).place(relwidth=0.25,relheight=0.2,relx=0.75,rely=0.8)
win.mainloop()

七、tkinter常用组件:
1、文本类组件:
1.1、Label标签
示例代码:

from tkinter import *
win=Tk()                           #添加标题
win.title("斗兽棋游戏的食物链")    #添加标题
# textd定义Label标签里的文本内容,bg表示Label的背景颜色
txt1=Label(win,text="",bg="#FFEBCD",width=5,padx=4,pady=4,font="10")
txt2=Label(win,text="",bg="#c1ffc1",width=5,padx=4,pady=4,font="10")
txt3=Label(win,text="",bg="#FFEBCD",width=5,padx=4,pady=4,font="10")
txt4=Label(win,text="",bg="#c1ffc1",width=5,padx=4,pady=4,font="10")
txt5=Label(win,text="",bg="#FFEBCD",width=5,padx=4,pady=4,font="10")
txt6=Label(win,text="",bg="#c1ffc1",width=5,padx=4,pady=4,font="10")
txt7=Label(win,text="",bg="#FFEBCD",width=5,padx=4,pady=4,font="10")
txt8=Label(win,text="",bg="#c1ffc1",width=5,padx=4,pady=4,font="10")
# foreground设置label组件的文字颜色
txtr1=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=1,column=2)
txtr2=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=1,column=4)
txtb1=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=2,column=5)
txtb2=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=4,column=5)
txtl1=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=5,column=4)
txtl2=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=5,column=2)
txtt1=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=4,column=1)
txtt2=Label(win,text="",padx=2,pady=2,foreground="#B22222").grid(row=2,column=1)
# 设置斗兽棋游戏的棋子的位置
txt1.grid(row=1,column=1)
txt2.grid(row=1,column=3)
txt3.grid(row=1,column=5)
txt4.grid(row=3,column=5)
txt5.grid(row=5,column=5)
txt6.grid(row=5,column=3)
txt7.grid(row=5,column=1)
txt8.grid(row=3,column=1)
win.mainloop()

示例-Label标签中添加图片:

from tkinter import *
from PIL import Image,ImageTk
win=Tk()
image = Image.open(f'D:\\temp\\6.png')
img = ImageTk.PhotoImage(image)
Label(win,image=img).pack()
win.mainloop()

如果Label组件中既有文字又有图片,则可以通过Label组件中的compound设置图片与文字的显示位置,具体参数如下:
top:图片位于文字上方
bottom;图片位于文字下方
left:图片位于文字左侧
right:图片位于文字右侧
center:文字位于图片上(图片与文字重叠,且文字在图片的上层)
1.2、Entry单行文本框
使用方法:Entry(win),示例1:

from tkinter import *
win=Tk()
Label(win,text="出发地:",font=14).grid(pady=10,row=0,column=0)
Entry(win).grid(row=0,column=1)
Label(win,text="目的地:",font=14).grid(pady=10,row=1,column=0)
Entry(win).grid(row=1,column=1)
win.mainloop()

如果是密码框,可以用以下方式:Entry(win,show="*")

示例2:

from tkinter import *
win=Tk()
Label(win,text="密码:",font=14).grid(pady=10,row=0,column=0)
Entry(win,show="*").grid(row=0,column=1)
win.mainloop()

示例3-登录窗口:

from tkinter import *
win=Tk()
win.configure(bg="#EFE5D2")
Label(win,text="用户:",font=14).grid(pady=10,row=0,column=0)
Entry(win).grid(row=0,column=1)
Label(win,text="密码:",font=14).grid(pady=10,row=1,column=0)
Entry(win,show="*").grid(row=1,column=1)
Label(win,text="确定",relief="groove").grid(row=2,columnspan=2,pady=10)
win.mainloop()

Entry提供的三个组件:
get():获取文本框的内容
insert():在文本框的指定位置添加内容,如:entry.insert(index,str)
delete():删除文本框中指定的内容,如:entry.delete(first,end)
示例4-相加计数器:

from tkinter import *
win=Tk()
win.configure(bg="#EFE5D2")
def add():
    res.delete(0,END)        #清空显示结果的文本框的内容
    add1 = int(op1.get())
    add2 = int(op2.get())
    res.insert(INSERT,add1+add2)        #INSERT表示从当前光标处开始插入
op1=Entry(win,width=5,relief="groove")
op1.grid(row=0,column=0)
Label(win,text="+").grid(row=0,column=1)
op2=Entry(win,width=5,relief="groove")
op2.grid(row=0,column=2)
Label(win,text="=").grid(row=0,column=3)
res = Entry(win,width=5,relief="groove")
res.grid(row=0,column=4)
Button(win,text="计算",command=add,relief="groove").grid(row=0,column=5,ipadx=10)
win.mainloop()

1.3、Text多行文本框
用法Text(win)。可以通过insert()方法添加初始文本。Text组件中添加图片需要创建PhotoImage()对象,然后通过image_create()引入图像。如:
photo = PhotoImage(file="D:\test\ico.png")
text.image_create(END,image=photo)
以上方法只能引入png格式的图片,如果要引入其它格式的请参考:示例-Label标签中添加图片。
示例-在文本框中添加图片、文字及按钮:

from tkinter import *
from PIL import Image,ImageTk
i = 0
def show():
    global i
    i += 1
    label.config(text="你点了我\t"+str(i)+"")
win = Tk()
text = Text(win,width=45,height=10,bg="#cae1ff",relief="solid")
image = Image.open(f'E:\\网页素材大全\\按钮\\0034.gif')
photo = ImageTk.PhotoImage(image)
text.image_create(END,image=photo)
text.insert(INSERT,"在这里添加文本:\n")
text.pack()
bt = Button(win,text="你点我试试",command=show,padx=10)
text.window_create("2.0",window=bt) #将按钮放在Text组件中的第2行第1列
label = Label(win,padx=10,text="你点了我0下")
text.window_create("2.end",window=label)    #将Label放在Text组件中的第2行最后一列
win.mainloop()

Text组件的索引方式有我种,以下是常见的几种:
line.column:如"2.3"表示第2行第4列
insert:在光标的位置插入,如上面的text.insert(INSERT,"在这里添加文本:\n")
end:最后一个字符的位置,如果字符串为end,表示所有文本的最后一个字符位置;如果字符串为line.end表示当前行的最后一个字符位置
+count chars:指定位置向后移动count个字符。如:"2.1+2 chars"表示第2行第4个字符的位置
-count chars:指定位置向前移动count个字符。如:"2.3-2 chars"表示第2行第2个字符的位置
注意:Text组件中获取字符串的索引位置时,第1行的索引为1,第1列的索引为0
示例:

from tkinter import *
win = Tk()
text = Text(win)
text.insert(INSERT,"I love python")
text.pack()
print(text.get(1.2,1.6)) #获取Text组件的第1行第3列到第1行第7列的字符(love)
win.mainloop()

Text组件提供了一些方法或以获取或编辑Text组件中的内容,常见方法如下:
delete():删除Text组件中的内容
get():获取文本内容
mark_set():添加标记
search():搜索文本
edit_undo():撤销操作
edit_separator():添加分割线。之后再进行撤销操作时不会撤销所有操作,只是撤销上一次的操作
示例-用Ctrl+z和Ctrl+y执行撤销和恢复操作:

from tkinter import *
win = Tk()
def undo1(event):
    text.edit_undo()    #撤销操作
def redo1(event):       #恢复操作
    text.edit_redo()
def callback(event):
    text.edit_separator()    #每单击一次键盘就添加一个分割线,否则会撤销或恢复所有操作
text = Text(win,width=50,height=30,undo=True,autoseparators=False)
text.pack()
#添加提示性文字
text.insert(INSERT,'在下方可以添加文本,通过Ctrl+z撤销,Ctrl+y恢复:\n\n')
text.bind('<Key>',callback)
text.bind('<Control-Z>',undo1)
text.bind('<Control-Y>',redo1)
win.mainloop()

待续......