Python tkinter(GUI编程)模块最完整教程(中)
上一篇: (GUI编程)模块全解(上) zzy的博客-CSDN博客
2 主模块 2.10
即多选框,用户可以勾选或取消勾选。可以绑定一个,一般是。拥有的参数之外,还可以有一些别的参数。
参考资料: ---(三)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, **kw)
参数
作用
与选择相关的
多选框选中时的值,默认为1
多选框未选中时的值,默认为0
选择方框的颜色
选中时的图片(须指定image参数)
是否显示为勾选框样式,默认为True
常用方法:
方法
作用
()
选中多选框
()
取消选中选框
()
切换选框的选中状态(反选选框)
()
调用的(无效)
flash()
使闪烁几次(在和几次切换)
创建
from tkinter import *root = Tk()
root.geometry("200x200")def tg():print("选中/取消选中")cb = Checkbutton(root, text="toogle", command=tg)
cb.pack()mainloop()
可以尝试点击,左边的方框就会打上勾或取消打勾。每次选择后都会打印"选中/取消选中"。
参数
from tkinter import *root = Tk()
root.geometry("200x200")def tg():print("当前状态为:", cb_var.get())cb_var = BooleanVar()
cb = Checkbutton(root, text="toogle", command=tg, variable=cb_var)
cb.pack()mainloop()
把多选按钮绑定到一个Var上,这样就可以获取的值。
参数
有两种样式,一种是上面的勾选框样式,还可以设置为一个按钮盒的样式。默认是显示为勾选框的样式,如果把设置为False也可以设置为按钮的样式。
from tkinter import *root = Tk()
root.geometry("200x200")cb = Checkbutton(root, text="toogle", indicatoron=False)
cb.pack()mainloop()
选中状态>>>
2.11
与多选框相对应,是单选框。多个单选框可以绑定一个,这个的值是选中的单选框的值。
参考资料: ---(四)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, cnf={}, **kw)
的参数和几乎完全一样,不同的是没有和这两个参数,而是由value这个参数代替。value参数的作用是:指定单选框选中时绑定的Var的值。
常用方法和介绍的几个基本一样,但是没有方法。
创建
一般情况下会出现多个,而只出现一个。
from tkinter import *root = Tk()
root.geometry("200x200")var = StringVar()
var.set("A")Radiobutton(root, text="A. Python", variable=var, value="A").pack()
Radiobutton(root, text="B. C", variable=var, value="B").pack()
Radiobutton(root, text="C. Java", variable=var, value="C").pack()mainloop()
上面的三个单选框,都绑定了一个,还指定了一个value参数。当的值被设为单选框的value,那么这个选框将是选中的状态。当点击单选按钮,的值就被设为这个单选按钮的值。因为的值只能有一个,所以你只能在绑定该的单选按钮里面选中一个单选按钮。
2.12 Menu
Menu也就是菜单,菜单一般有两种,一种是窗口上的菜单,一种是弹出式菜单。
参考资料: ---(十三)窗口组件:Menu_近视的脚踏实地的博客-CSDN博客
Menu(=None, cnf={}, **kw)
参数
作用
是否允许用户分离菜单,默认为True
title
分离菜单的标题
用户分离菜单时执行的事件
菜单被打开时执行的事件
常用方法:
方法
作用
add(, **kw)
添加一个菜单项,是, , , , 之一
(index, , **kw)
在index位置插入菜单项
(**kw)
添加命令菜单项
(**kw)
添加分层菜单项
(**kw)
添加多选框菜单项
(**kw)
添加单选框菜单项
(**kw)
添加菜单分割线
(, =None)
删除位于(到之间)的菜单项
(index, )
获取位于index菜单项的值
(index, **kw)
更改位于index菜单项的参数的值
post(x, y)
在(x, y)位置弹出菜单
()
取消弹出菜单
(index)
执行位于index菜单项的,如果菜单项是单选框或多选框,则选中它们。
type(index)
返回位于index菜单项的类型,是, , , , 之一
创建窗口菜单
from tkinter import *root = Tk()menubar = Menu(root)
root.config(menu=menubar) #把菜单绑定rootmainloop()
这样,我们就成功创建出一个菜单,并且绑定了显示的窗口。不过这样的菜单什么都没有,接下来我们要在菜单中添加菜单项。
add方法
add方法可以添加菜单项。第一个参数指定菜单项的类型,马上会介绍到。add()也可以被()所替换。你还可以提供如下参数**kw(, , bg, fg由于之前的组件介绍过,这里不介绍了):
参数
作用
显示菜单的补充说明标签
label
菜单项显示的标签
font
标签的字体
菜单项显示的位图
image
菜单项显示的图片
图片显示于标签的方位
state
菜单项的状态
在标签的第几个索引的字符处画下划线,用来绑定Alt快捷键
从此菜单项开始另起一列显示
菜单项长度适应label长度,默认为True
点击菜单项时执行的回调函数
menu
绑定的分层子菜单()
单选或多选按钮菜单的
单选或多选按钮菜单的
value
单选按钮菜单的value
单选或多选按钮菜单绑定的
多选按钮菜单的
多选按钮菜单的
方法
menu.(**kw)相当于menu.add("", **kw)
方法在菜单中添加一个命令菜单项。它有如下参数:
下面,让我们给菜单创建一个命令,点击时打印一段文字。
from tkinter import *root = Tk()menubar = Menu(root)
root.config(menu=menubar)menubar.add_command(label="Click", command=lambda:print("Hello"))mainloop()
点击菜单的Click按钮,就会执行print("Hello")
方法
菜单可以有层级之分。最上层的菜单就是绑定了root的菜单,下面可以有一些子菜单,继承绑定窗口的父菜单,实现分层效果。
from tkinter import *root = Tk()menubar = Menu(root)
root.config(menu=menubar)filemenu = Menu(menubar)
filemenu.add_command(label="Save", command=lambda:print("OK!"))menubar.add_cascade(label="File", menu=filemenu)mainloop()
首先需要创建一个菜单,继承绑定窗口的菜单,然后添加这个子菜单的项目。接着,需要把这个子菜单添加到父菜单中,需要提供一个menu参数指定添加的子菜单。
子菜单也可以有子菜单。如下示例:
from tkinter import *root = Tk()menubar = Menu(root)
root.config(menu=menubar)filemenu = Menu(menubar)
savemenu = Menu(filemenu)menubar.add_cascade(label="File", menu=filemenu)
filemenu.add_cascade(label="Save", menu=savemenu)savemenu.add_command(label="save1")
savemenu.add_command(label="save2")mainloop()
分离菜单
当我们点击菜单上的虚线,可以跳出一个工具窗口,这就是分离菜单。
分离菜单功能有很多问题,并且大多数应用都没有这个功能,建议大家把它禁用。如果想要禁用分离菜单功能,可以在定义Menu的时候把参数设置为False。
Menu(menubar, tearoff=False)
参数
可以对菜单项进行补充。一般这个参数指定的是一个加速键(快捷键)名称,比如Ctrl+N这种。
不过,即使指定了参数也没有真正的绑定快捷键,需要使用bind来进行绑定。
from tkinter import *root = Tk()menu = Menu(root)
root.config(menu=menu)def new(event=None):print("New file")fm = Menu(menu)
menu.add_cascade(label="File", menu=fm)
fm.add_command(label="New", accelerator="Ctrl+N", command=new)root.bind("", new)mainloop()
按下Ctrl-N或点击菜单,执行new函数。
参数
参数指定一个索引,绑定一个Alt快捷键。指定了的菜单项可以快捷触发。触发方式是:先按下Alt,然后下划线会显示出来,再按下菜单项标签下划线上的字符即可执行这个菜单项。
from tkinter import *root = Tk()menu = Menu(root)
root.config(menu=menu)def new():print("New file")menu.add_command(label="New", underline=0, command=new)mainloop()
激活并按下Alt>>>
按下n键>>>
方法
方法可以给菜单添加一条分割线。
from tkinter import *root = Tk()menu = Menu(root)
root.config(menu=menu)fm = Menu(menu, tearoff=False)
menu.add_cascade(label="File", menu=fm)fm.add_command(label="New File")
fm.add_command(label="Save")
fm.add_separator() #添加分割线
fm.add_command(label="Exit")mainloop()
分割线常用于分隔不同类的菜单项,比如编辑器中,打开文件、保存文件、退出几个文件操作类别都用分隔线隔开。
弹出菜单
如果要弹出菜单,那么不需要绑定到窗口(root.(menu=menu)),当然绑定也没关系。弹出窗口需要使用post方法,需要提供x, y两个参数。但这两个参数必须是屏幕上的位置,和。
下面的示例:当右击鼠标时在鼠标处弹出菜单。
from tkinter import *root = Tk()menu = Menu(root)def show(event):menu.post(event.x_root, event.y_root)def cp():print("Copy")menu.add_command(label="Copy", underline=0, command=cp)root.bind("", show)mainloop()
2.13
是一个的样式,可以绑定一个菜单,点击后弹出菜单。这个组件比较老,现在可以用Menu实现的功能了,不过在某些情况下要更简单好用一些。
参考资料: ---(十四)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, cnf={}, **kw)
参数和基本一样,但是没有,还有一些其他的参数。
参数
作用
menu
绑定一个菜单
位于按钮的菜单弹出方位,有"left"(左),"right"(右),"above"(上),"below"(下),默认是below
创建
from tkinter import *root = Tk()mb = Menubutton(root, text="弹出")
mb.pack()menu = Menu(mb)
def cp():print("Copy")
menu.add_command(label="Copy", command=cp)mb.config(menu=menu)mainloop()
点击按钮>>>
需要注意的是,继承关系不要弄错。绑定到的菜单的必须是该,否则菜单跳不出来。
2.14 组件基类
现在,你已经学习了一部分组件。在学习更多组件之前,先要详细介绍一下组件的基类。在()中,大多数组件都有共用的方法,这是因为它们都继承共同的类。如果你想自己了解一下继承关系,可以看Lib//.py。
在这些类中,有一些方法的参数默认为None,这意味着如果为None可以返回当前参数设定的值。
内容过多,整理到此篇文章中: Misc类+Wm类详解
2.15
是列表框,里面可以添加一些文本项目,在列表框中竖向显示。可以让用户选择它们。
参考资料: ---(七)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, cnf={}, **kw)
参数
作用
width
组件的宽,单位是字母的平均宽度
组件的高,单位是项目的数量
设置与关联的,是一个,不同项目用空格隔开(不推荐)。
组件的选择模式,可以是""(单选,可用鼠标拖动或方向键改变选择,默认模式), ""(单选,只能鼠标点击改变选择), ""(多选,需拖动鼠标或结合Shift或Ctrl键才能多选), ""(多选,点击多个选项就能多次选择)
x方向滚动条(下一节介绍)
y方向滚动条(下一节介绍)
常用方法:
方法
作用
(index)
将位于index位置的项目激活(在下方画下划线)
bbox(index)
返回位于index位置的项目的边框尺寸信息,返回值是(, , width, ),表示左上角的偏移和宽高。
()
返回被选中选项的索引的元组
(first, last=None)
删除first到last的选项
(index, *)
在列表框中添加单或多个选项
get(first, last=None)
如果不指定last,返回first位置的选项;如果指定last,返回两个位置之间的选项
index(index)
返回index位置的数字索引,如index("end")返回最后一个选项的数字索引
(index, **)
设置index位置的选项的参数,可以设置的有:bg(), fg(), ,
(index, )
返回index位置的选项的参数选项值
see(index)
滚动列表框,使位于index位置的项目可见
(first, last=None)
选中first到last的项目
(first, last=None)
取消选中first到last的项目
(index)
返回位于index位置的项目的选中状态,1表示选中,0表示未选中
(index)
在index位置的项目设置锚点(类似于一个标记,可通过特殊索引""访问锚点)
size()
返回列表框中选项数量
创建
from tkinter import *root = Tk()lb = Listbox(root)
lb.pack()mainloop()
这样就创建了一个,不过里面什么项目也没有。
虚拟事件
中有项目选中时会产生一个虚拟事件,可以被bind捕捉到。
from tkinter import *root = Tk()lb = Listbox(root)
lb.pack()for n in range(20):lb.insert("end", n)def select(event):print(lb.curselection()) #打印选中项的索引lb.bind("<>", select)mainloop()
如图示,选中项目时会打印选中的项目索引。
see方法
see方法可以滚动列表框,使位于index位置的项目可见。
from tkinter import *root = Tk()lb = Listbox(root)
lb.pack()for n in range(20):lb.insert("end", n)Button(root, text="see end", command=lambda:lb.see("end")).pack()mainloop()
点击按钮>>>
点击按钮后列表框滚动到了end位置。
实例:列表编辑器
下面是一个实例,用户可以添加或删除列表框中的内容。
from tkinter import *root = Tk()def add():lb.insert("end", entry.get())def remove():try:lb.delete(lb.curselection()[0])except: #如果没有选中列表框内容会报错passlb = Listbox(root)
lb.pack()entry = Entry(root)
entry.pack()Button(root, text="Add", command=add).pack()
Button(root, text="Remove", command=remove).pack()root.mainloop()
2.16
也就是滚动条,可以起到滚动组件,使用户能够完整看到的效果。但也有部分组件不支持滚动条。
参考资料: ---(八)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, cnf={}, **kw)
滚动条没有常规的参数,只有width。
参数
作用
滚动条的滑块被激活时的样式
滚动条被滚动更新时执行的回调函数,会传递给函数几个参数,可以直接传递给需滚动组件的xview和yview方法。
滚动条和箭头的边框宽度
jump
是否当鼠标松开长按滚动条才调用,默认为False(此参数似乎无效)。
滚动条的方向,可以是""(水平,横向), ""(垂直,竖向),默认是
鼠标长按在滚动条上时,持续触发滚动条的准备时长,默认为300(ms)
持续触发滚动条的间隔,默认为100(ms)
常用方法:
方法
作用
get()
返回滑块的位置,是一个元组,包含滑块左边或上边的位置,和滑块右边或下边的位置,都是0.0 ~ 1.0之间的浮点数,代表占整个滚动条的比例
set(*args)
设置滑块的位置,需提供两个参数,分别是滑块左边或上边的位置,和滑块右边或下边的位置,都是0.0 ~ 1.0之间的浮点数,代表占整个滚动条的比例
创建
from tkinter import *root = Tk()sb = Scrollbar(root)
sb.pack(side="right", fill="y")mainloop()
这段代码在屏幕右侧绘制了一个滚动条。这个滚动条没有绑定任何可滚动的组件,所以没有任何用处。在映射滚动条时,通常会加入fill="y"这个参数,让滚动条完全伸展开,方便拖拽(在水平滚动条中是fill="x",grid布局则要指定)。
XView和YView类
在中有XView类和YView类,所有支持滚动条的组件继承它们。支持x方向滚动条则继承XView,支持y方向滚动条则继承YView。比如组件同时支持x,y方向滚动条,而Entry组件只支持x方向的滚动条。
下面介绍一下XView的方法(YView的方法和XView相比,只是方法名字中的xview改为了yview)。
方法
作用
xview(*args)
在x方向滚动组件。需提供几个参数,第一个是滚动类型,可以是""(滚动到), ""(向右或向下滚动)。如果滚动类型是,则还需要提供一个参数表示滚动到的位置,是0.0 ~ 1.0之间的浮点数。如果滚动类型是,则还需要提供滚动的数量,和滚动单位。滚动单位可以是"units"(按滚动单位滚动), "pages"(按页面滚动)。
()
和xview(“”, ) 一样
(, what)
和xview("", , what)一样
支持滚动条的组件,本身有和两个参数,可以设置为滚动条的set方法,滚动条拖拽的时候会让滚动条的位置改变。如果不设置这两个参数,那么滚动条位置拖拽后会返回原位。
同时还要设置滚动条的参数为需滚动组件的xview或yview方法,因为在滚动条拖拽时调用,会将滚动信息传递给,使组件滚动。
参数
参数指定滚动条的朝向。部分组件也有这个方法,都有两个可选值:""(水平,横向), ""(垂直,竖向)。
下面是这两个形态的滚动条:
滚动条绑定组件
继承XView和YView,支持滚动条,下面就以为例示范一下滚动条的绑定。
from tkinter import *root = Tk()sb = Scrollbar(root)
sb.pack(side="right", fill="y")lb = Listbox(root, yscrollcommand=sb.set)
lb.pack(side="left", fill="both")
for i in range(100):lb.insert("end", i)sb.config(command=lb.yview)mainloop()
运行效果:
2.17
是一个比较少用的组件,功能基本可以被Label替代。组件可以自动换行,指定Label组件的也可以达到这个功能,不过可能更加简便一些。
参考资料: ---(十六)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, cnf={}, **kw)
参数和Label基本一样,但有一个参数,表示组件达到多少像素换行。
2.18 Scale
Scale也就是标尺组件。用户可以通过拖拽滑块,设定一个数值。
参考资料: 组件详解(十):来自江南的你的博客-CSDN博客
Scale(=None, cnf={}, **kw)
参数
作用
设置Scale的长度
width
设置Scale的宽度
label
在Scale上显示一个文字标签
Scale数值改变时执行的回调函数,会传递给该函数当前Scale的值
from_
设置Scale的最小值,默认是0
to
设置Scale的最大值,默认是100
刻度数值最多显示的数字位数
设置Scale的朝向,可以是""(水平)或""(垂直)
设置滑块拖动的步长(也就是拖动一次滑块,滑块移动的数值长度),默认为1
设置是否在滑块旁边显示当前的数值
设置滑块的长度
设置滑块的样式,默认是""
设置显示的刻度,默认不显示
设置凹槽的颜色
设置与Scale值相关联的
常用方法:
方法
作用
get()
返回Scale的值
set(value)
设置Scale的值
创建Scale
from tkinter import *root = Tk()scale = Scale(root)
scale.pack()mainloop()
用户可以拖动滑块,设定滑块的值。
from_和to参数
设置这两个参数可以设定拖拽的最小和最大值。
from tkinter import *root = Tk()scale = Scale(root, from_=10, to=30)
scale.pack()mainloop()
滑块只能从10拖动到30。
参数
参数使Scale可以添加刻度数值。如from_=0, to=100, =10的Scale:
垂直的Scale的刻度显示在左边,水平的Scale则显示在下面。
label参数
label参数可以显示在Scale旁边显示一个标签。例如:label="拖动滑块":
垂直的Scale的标签在右边,水平的Scale则在显示上面。
参数
参数设置Scale的步长,默认为1。如=0.1, from_=0, to=100,那么你可以在0到100之间拖动滑块,每次可拖动0.1个数值。每次拖动的数值都是0.1,不能小于这个数。
实例:颜色调节器
下面是一个简单的小程序,用户可以拖拽Scale滑块控制背景的颜色。
from tkinter import *root = Tk()def change(x):color = "#xxx"%(r.get(),g.get(),b.get()) #将普通的RGB色彩元组转换成16进制的形式for w in root.winfo_children(): #设置Scale的背景色w.config(bg=color)r = Scale(root, from_=0, to=255, fg="red", command=change)
r.pack(side="left")g = Scale(root, from_=0, to=255, fg="green", command=change)
g.pack(side="left")b = Scale(root, from_=0, to=255, fg="blue", command=change)
b.pack(side="left")mainloop()
2.19
和Entry组件很类似,可以算是Entry组件的一个变形。拥有Entry组件的所有参数。不同的是,的侧面多了一个上箭头和一个下箭头,可以调节的值。当然用户也可以在里面输入
参考资料: ---(十七)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, cnf={}, **kw)
下面是比Entry多的参数选项。
参数
作用
调节箭头的背景颜色
鼠标在调节箭头上方的样式
下调节箭头的样式
上调节箭头的样式
点击调节箭头时执行的回调函数
from_
设置调节箭头调节的最小数值
to
设置调节箭头调节的最大数值
设置调节箭头调整数值的数值格式,使用%格式化,如:"%4.4f"
调节箭头调节数值的步长
设置调节箭头可调节值的元组,和from_, to只能指定一边
wrap
可调节值是否可以循环调节,比如wrap=True, =("0", "1", "2"),然后一直点击下箭头,那么的值依次变成"0", "1", "2", "0", "1", "2"的循环。如果wrap=False,那么无法循环调节,调节到"2"点下箭头就无效了。默认wrap=False
常用方法同Entry。
创建
from tkinter import *root = Tk()spinbox = Spinbox(root)
spinbox.pack()mainloop()
由于没有指定from_, to或,所以箭头按了也无效。
from_, to和参数
如设置from_=0, to=10,那么点击上下箭头的时候,文本框里面的内容会在0到10之间调节。但用户仍然可以在中输入任何内容。
参数指定点击箭头的步长,类似于Scale组件的参数选项。
参数
参数和上面的from_, to, 只能指定一边。参数传递一个元组之类的序列。比如=("", "C", "Java", "Tcl"),那么点击上下箭头的时候,文本框中的内容会在元组里面切换。
状态
可以设置为状态,和Entry一样。设置为的时候,文本框中不能输入,但是仍可以通过按上下箭头调节的值。
2.20
是选项菜单,用户可以下拉一个选择菜单,指定的值。
参考资料: ---(十五)窗口组件:近视的脚踏实地的博客-CSDN博客
(, , value, *, **)
这个组件比较特殊,它继承类,有一些必选参数。比如参数在其他的组件是可选参数,如果不指定将会自动继承主Tk窗口。而必选, 参数。
参数
作用
指定父容器
指定绑定的,设为选项菜单的值
value
选项菜单的初始选择值,没什么用,仍需要设置的值
*
选项菜单的可选项(不需要再加上value,初始选择值会自动添加到可选项中)
**
继承类,在此处指定的**kw选项值
创建
from tkinter import *root = Tk()var = StringVar()
var.set("Python") #设置OptionMenu的值m = OptionMenu(root, var, "Python", "C", "Java")
m.pack()mainloop()
此处创建了一个选项菜单,可以有3个可选项。获取的值,只需要执行绑定的的get方法。
2.
组件是Tk8.4新增的组件,类似于Frame。不同的是,组件允许用户调节子组件的布局。每个添加到的子组件作为一个窗格管理。
参考资料: ---(十八)窗口组件:近视的脚踏实地的博客-CSDN博客
(=None, cnf={}, **kw)
参数
作用
是否显示调整窗格布局的手柄,是一个正方形
窗格的分布朝向,可以是""(水平), ""(垂直)
分割线和组件的间距
分割线的样式,默认是"flat"
分割线的宽度
手柄在分割线上的位置,默认是8(像素)
手柄的边长,默认是8(像素)
窗格尺寸是否随鼠标拖拽而改变,默认为True,如果设为False,只有释放鼠标窗格尺寸才会改变
常用方法:
方法
作用
add(child, **)
将child组件添加到中,选项稍后介绍
(child)
从中移除child组件
(child, )
返回child组件选项的值
(child, **)
设置child组件选项的值
panes()
返回子组件的列表
创建
from tkinter import *root = Tk()w = PanedWindow(root, orient="horizontal")
w.pack(fill="both", expand=True)mainloop()
这段代码创建了一个空的水平方向,需要在里面添加组件才能看出来。
add方法
add方法用于在中添加组件。如果是水平的,添加的组件都按水平方向排放。如果是垂直,添加的组件按竖直方向排放。
add(child, **)
可以是这些参数选项:
参数
作用
after
将child组件排放到after组件的后面
将child组件排放到组件的前面
width
排放时child的宽度
排放时child的高度
窗格长度的最小值(在水平中是窗格的宽,垂直则是窗格的高)
padx
组件的x方向间距
pady
组件的y方向间距
组件位于窗格的位置,和grid布局的参数作用一样
from tkinter import *root = Tk()w = PanedWindow(root, orient="horizontal")
w.pack(fill="both", expand=True)b = Button(w, text="1b")
w.add(b)b = Button(w, text="2b")
w.add(b)mainloop()
代码生成了两个按钮,中间有一个细小的间隔,是窗格之间的分割线。因为分割线默认是"flat",所以是看不见的, 如可见需设置参数。可以拖拽这个分割线,来调整窗格之间的大小。
参数
参数如果设置为True,将会在分割线的位置添加一个手柄。用户可以拖拽这个手柄,这样可以方便地调整窗格的大小。
手柄是一个正方形。
2.22 Text
Text是多行文本输入框,和Entry不同的是,Entry只有单行。并且Text里面不仅能够插入文本,还可以插入图片、组件等,还可以有标记功能,对于特殊的内容改变颜色。
参考资料: ---(十)窗口组件:Text_近视的脚踏实地的博客-CSDN博客
Text(=None, cnf={}, **kw)
Text的参数有一大部分和Entry的参数相同,如光标、激活、颜色一类的参数。
参数
作用
width
Text的宽,以字符数量为单位
Text的高,以行数为单位
undo
设置是否开启撤销功能,默认为False;开启撤销功能时,用户可以按下Ctrl+Z进行撤销操作
设置是否自动插入撤销分隔,默认为True
允许撤销的数量,设置为-1代表无限次
padx
设置内容与边框的x方向间距
pady
设置内容与边框的y方向间距
wrap
设置Text的换行方式,可以是"none"(不自动换行), "char"(按字符换行), "word"(按单词换行)
x方向滚动
y方向滚动
常用方法:
方法
作用
bbox(index)
返回位于index字符的边界框位置(x, y, width, ),需先调用方法
(start, end=None)
删除从start到end的内容
(index, text, *tag)
在index位置插入text,并标记为*tag
dump(, =None, =None, **kw)
以列表形式返回Text的插入内容
get(, =None)
返回index到的文本内容(注:不是插入内容,Text里面不仅可以插入文本)
see(index)
滚动Text,使位于index的文本可见
()
重做,需设置undo=True
()
撤销,需设置undo=True
()
清空文本操作记录
()
插入撤销分隔
index(index)
将index的位置以line.返回
(, , chars, *args)
将到的内容替换为chars字符串,*args设定tag
(, index, =None, =None, =None, exact=None, =None, =None, count=None)
在index到的文本之间搜索字符串
除了这些方法外,还有一些tag, mark, image之类的方法,放在后面讲。
wrap参数
wrap参数设置Text的换行方式,可以是"none"(不自动换行), "char"(按字符换行), "word"(按单词换行)。
设置为"none"时,如果字符数量超过Text的宽,不会进行换行,Text会进行滚动,以适应光标位置。
设置为"char"时,字符数量超过Text的宽,会换到下一行。
设置为"word"时,字符同样会换行,但是换到下一行的是一个完整的单词。
创建Text
from tkinter import *root = Tk()text = Text(root)
text.pack()mainloop()
上面的代码创建一个Text,可以在Text里面输入内容。
撤销和重做
用户可以在Text中进行撤销和重做操作。开启撤销和重做操作,首先要设置undo=True,然后用户可以按Ctrl+Z来撤销。
text = Text(root, undo=True)
和方法用于撤销和重做,方法执行一次撤销操作,方法执行一次重做操作。如果没有内容可撤销或重做会报错。如下示例:
from tkinter import *root = Tk()text = Text(root, undo=1)
text.pack()Button(root, text="Undo", command=text.edit_undo).pack()
Button(root, text="Redo", command=text.edit_redo).pack()mainloop()
但是测试的时候,会发现:每当换行或粘贴文本的时候,才会认为这是进行了一次文本操作。撤销的时候,没能按照输入字符进行撤销。这是因为Text设置了自动加入撤销分隔,自动插入的方式和我们的期望不同。要实现按字符撤销,需要手动加入撤销分隔。
首先需要设置自动加入撤销分隔为False,也就是=False。然后绑定,每当输入一个字符调用()方法进行手动撤销分隔。如下示例:
from tkinter import *root = Tk()text = Text(root, undo=True, autoseparators=False)
text.pack()
text.bind("", lambda e: text.edit_separator())Button(root, text="Undo", command=text.edit_undo).pack()
Button(root, text="Redo", command=text.edit_redo).pack()mainloop()
运行后,发现成功按照字符撤销。
索引
Text指定字符位置的索引比较特殊,下面介绍一下Text的索引。
如想要根据一个特殊的索引,比如"", "@1, 2 + 2l"来获取准确的line.式索引,可以使用index方法。
Text.index(index)
此方法返回index的line.形式索引。
插入文字
方法可以在Text中插入文字。
(index, text, *tag)
在index位置插入text内容。*tag是文本的tag标记,把这一串文字标记为tag, 后面会介绍tag。
需要注意的是,方法只能插入文字,而方法不仅可以删除文字,还可以删除其他的组件或图片。
插入图片
Text可以使用方法插入图片。
Text.(index, cnf={}, **kw)
index是插入的索引位置,**kw参数可以是:
参数
作用
align
设置图像的对齐方式,可以是"top", "", ""或""
image
设置插入的图像,是一个或
name
图像的名称,一般不需要指定
padx
图像的x方向间距
pady
图像的y方向间距
示例如下:
from tkinter import *root = Tk()image = PhotoImage(file="monster.gif")text = Text(root)
text.pack()
text.insert("end", "插入图片")
text.image_create("end", image=image)mainloop()
与图片相关的方法还有如下:
(index, )
返回index位置的图像的选项值
(index, cnf={}, **kw)
设置index位置的图像的选项值。
()
返回嵌入Text的所有图像名称。
插入组件
方法可以在Text中插入组件。
(index, cnf={}, **kw)
**kw参数可以是:
参数
作用
align
设置组件的对齐方式,可以是"top"(上), ""(中), ""(下)或""(基线)
传递一个回调函数,函数须返回一个Text的子组件用于插入Text
设置插入的组件,必须是Text的子组件,和参数指定一个即可
当行高大于组件高度时,是否延伸组件的高,默认为False
padx
组件的x方向间距
pady
组件的y方向间距
下面两个示例,效果都是一样的。
from tkinter import *root = Tk()text = Text(root)
text.pack()b = Button(text, text="MyButton")
text.window_create("end", window=b)mainloop()
from tkinter import *root = Tk()text = Text(root)
text.pack()def create_button():b = Button(text, text="MyButton")return btext.window_create("end", create=create_button)mainloop()
Mark(标记)
在Text中,可以记录一个索引的位置,在此处做一个标记,也就是mark。mark标记的位置可以在索引中使用。有两个事先定义好的mark,即""和"",参见上文。需要注意的是:"end"并不是一个mark,而是一个比较特殊的索引。
添加一个mark,需要使用方法,这个方法不仅可以添加mark,也可以更改定义过的mark。
Text.(, index)
在index的位置定义一个mark,名字为。定义了mark后,可以在索引中使用。
from tkinter import *root = Tk()text = Text(root)
text.pack()text.insert("end", "123456789")
text.mark_set("myMark", "1.1") #定义一个mark,并设置位置
text.insert("myMark", "M") #在自定义的mark处插入"M"mainloop()
如图,"M"插入到了1.1的位置。
如果想要删除mark,可以使用方法。
Text.(*)
你可以给定一系列的,删除它们。但是不能删除""和""这两个特殊mark。
如果mark附近的文本内容改变,mark也会跟着移动。如果你不理解mark的移动方式,不妨在光标旁边的文本试一下改变它们的内容,看标记是如何移动的。
在mark位置插入文本的时候,mark默认会往右边移动一个字符,如果想要让mark在插入时改变移动方向,可以使用方法。
Text.(, =None)
指定mark的名称,指定mark的移动方向。默认是"right",也可以设为"left"(左),设置为None则返回。
还有一些关于mark的用法:
()
返回Text中所有mark的名称,包括""和""。
(index)
返回在index位置后面的一个mark的名字,不存在返回空字符串。
(index)
返回在index位置前面的一个mark的名字,不存在返回空字符串。
Tag(标签)
Mark是对于一个索引进行记录,而Tag是对于一段文本进行记录。并且记录的这一段文字还可以进行特殊的操作,比如更改字体,更改颜色,甚至还可以进行事件绑定。
Text有一个特殊的tag叫做sel,代表选中的内容。Text对于选中内容会进行高亮显示,就是利用了sel这个tag。上文介绍过,插入的内容可以直接指定tag的名称。
如要自定义一个tag,须使用方法。
Text.(,, *args)
作用:添加一个名为的tag,位置是+*args。*args允许你提供多个位置。比如:添加一个tag,位置是1.0-1.3, 2.0-2.3,那么可以写作("", 1.0, 1.3, 2.0, 2.3);如果位置是1.0-1.3, 2.0,那么以写作("", 1.0, 1.3, 2.0)。
添加完了tag,可以用方法对tag的文本进行样式更改。这些参数的值也可以用来获取
Text. = Text.(, cnf=None, **kw)
Text.(, )
**kw给定的参数如下,用来设置tag范围内的文本。
参数
作用
文本的边框的宽度
文本的
文本的背景色
bg
使用一个位图作为背景,并使用指定的颜色填充
文本的前景色
fg
使用一个位图作为前景,并使用指定的颜色填充
font
文本的字体
文本的对齐方式,可以是"left", "right", "",需先指定tag为该文本行的第一个字符
文本相对于基线的偏移距离,升高文本则为正数(基线:一般在文本底部的一条基准线,类似于英文四线三格的第三条线)
是否添加下划线,默认为False
是否添加删除线,默认为False
wrap
换行方式
如下示例:
from tkinter import *root = Tk()text = Text(root)
text.pack()text.insert("end", "123456789")
text.tag_add("tag", "1.0", "1.4")
text.tag_config("tag", background="yellow", overstrike=True)mainloop()
tag可以进行事件绑定,需通过方法。相对地,也有用于解除绑定的方法。
(, , func, add=None)
(, , =None)
在标记的文本处绑定事件,回调func。比如text.("mytag", "", ),点击一下"mytag"的tag文本即可执行函数。如下示例,点击tag内容会自动链接到网站。
from tkinter import *
from webbrowser import open as webopen #webbrowser.open用来启动浏览器root = Tk()text = Text(root)
text.pack()text.insert("end", "进入CSDN", "link") #插入内容并设置tag为"link"
text.tag_config("link", foreground="blue", underline=1)
text.tag_bind("link", "", lambda x:webopen("https://www.csdn.net"))mainloop()
如果tag的位置之间发生重合,一段文本就有可能有多个tag。tag之间有优先级,多个tag的文本选项以较优先的tag为准。但如果较优先的tag中有一部分选项没有设置,那么就设置为较低tag的选项。比如一段文本有两个tag,tag1较优先,tag2优先级较低,此时设置tag1中(="red", =None),而tag2中(="red", =""),那么整个段落的颜色则为(="red", ="")。
和方法分别可以提高tag的优先级和降低tag的优先级。
Text.(, =None)
如果不指定,则将优先级提升至最高。如果指定,则将优先级提升至名为的tag之上。
Text.(, =None)
如果不指定,则将优先级降至最低。如果指定,则将优先级降至名为的tag之下。
文本删除tag可以使用方法。
Text.(, , =None)
删除tag需要指定tag的名称,还需要指定删除的范围,从到之间,将tag删除。
此外,还有一些用于tag操作的方法:
(index=None)
返回所有tag的名称,index指定位置。
()
返回所有标记的文本以及位置信息。
(, , =None)
返回至之间第一个有的位置。
(, , =None)
反过来查找,返回最后一个有的位置。
get和dump方法
get方法用于返回Text的文本内容的字符串,而不能返回其他插入的组件或图片。
Text.get(, =None)
返回到两个位置之间的文本。
如果还需要返回其他插入的组件或图片,就需要使用dump方法。
Text.dump(, =None, =None, **kw)
和是获取的范围,这个方法会返回一个列表,列表的每个项目都是一个类型的插入内容,是一个三项元组。
from tkinter import *root = Tk()text = Text(root)
text.pack()
text.tag_config("MyTag", background="blue")image = PhotoImage(file="monster.gif")
window = Button(text, text="这是一个按钮组件")text.insert("end", "这是一段普通的文字")
text.insert("end", "这是一段tag文字", "MyTag")
text.image_create("end", image=image)
text.window_create("end", window=window)mainloop()
上面的代码运行效果如图,如果再打印出text.dump("1.0", "end")获取text的内容,得到这样的输出:
下面详解dump返回列表中的每个元组的项的含义。第一项表示插入内容的类型,第二项表示插入内容的信息,第三项表示的是插入内容的位置。
插入内容类型(第一项)
第一项解释
第二项解释
text
文本
表示插入的文本
tagon
标签的起始
表示tag名称
标签的结束
表示tag名称
mark
mark标记
mark的名称
image
图片
表示插入的图片对象的名称,name参数可设定
组件
表示插入的组件对象的名称,name参数可设定
注:由于dump返回的插入组件是组件的名称,是一个字符串,不方便直接对组件对象进行操作。如果你还记得Misc类中讲解的方法,可以使用这个方法将组件名称转换成组件对象。
方法
方法用于在Text中搜索某段文本。
Text.(, index, =None, =None, =None, exact=None, =None, =None, count=None)
这个方法返回搜索到的第一段文本的第一个字符的位置。参数及作用如下:
参数
作用
需要在Text内容中搜索的文本
index
起始搜索位置
结束搜索位置(默认为最后)
由前往后查找,默认为True
由后往前查找,和可指定一个
exact
搜索与完全匹配的文本,和, 指定一个
将解释为正则表达式匹配,和exact, 指定一个
搜索忽略大小写,和exact, 指定一个
count
是一个,存储搜索结果的文本字符数量
2.23 图片对象
有两种图片对象,一种是,用于导入*.gif, *.ppm, *.pgm格式的文件,新版tk还支持*.png;还有一种是,用于导入*.xbm的位图格式文件。这些图片对象都可以被传递给组件的image参数。这些图片对象都支持以下方法:
方法
作用
(**kw)
更改图片参数设置
()
返回图片的高
width()
返回图片的宽
type()
返回图片的类型,"photo"或""
(name=None, cnf={}, =None, **kw)
name用来设定图片的名称。此外,支持以下关键字参数。
参数
作用
data
将图像的数据内容以字符串传递;字符串可以是二进制数据或编码数据(支持PNG和GIF);如同时指定了data和file参数,优先使用file指定的图片
file
指定图片文件名称
指定文件格式名
gamma
图像的伽马值,可以理解为亮度;默认值为1,指定的值必须大于0
图像的高度
width
图像的宽度
指定要分配用于显示此图像的颜色立方体的分辨率,因此指定从显示它的窗口的颜色图中使用的颜色数。调色板规范字符串可以是一个十进制数,指定要使用的灰色阴影数,也可以是由斜线 (/) 分隔的三个十进制数,分别指定要使用的红色、绿色和蓝色阴影数。如果使用第一种形式(单个数字),图像将以单色(即灰度)显示
除上描述的方法外,还支持以下方法:
方法
作用
blank()
将图片设为完全透明
cget()
获取参数的值
copy()
复制图片,返回新的图片对象
zoom(x, y="")
返回原图像在x方向缩放至原来x倍,y方向缩放至原来y倍的图像;如不指定y,则y同x
(x, y="")
将图片在x方向缩放至原来x分之一的大小,y方向缩放至原来y分之一的大小;如果x为负数,则图像垂直翻转;如果y为负数,则图像水平翻转;如不指定y,则y同x
get(x, y)
返回在x, y像素位置上的颜色元组(red, green, blue)
put(data, to=None)
从to位置的像素点开始向设置右方像素的颜色;data需提供[(color, color, ...), (color, color, ...), ...]这样的形式,列表中每一个项都表示一行,每一个项中间设定了这一行需改变的像素点颜色
write(, =None, =None)
将图像写入文件,图片格式为;指定写入的图像范围,可以是(x1, y1, x2, y2)表示一个矩形范围,或是(x1, y1)表示从一个点的位置到图片右下角,也可以不指定表示整个图像
(x, y)
返回一个布尔值,根据位于x, y的像素点是否透明
(x, y, )
将x, y的像素点是否透明的状态设为
(name=None, cnf={}, =None, **kw)
name用于设定图片的名称,此外还可以设置如下关键字参数:
参数
作用
data
将图像的数据内容以字符串形式传递;字符串必须遵循X11位图格式;如同时指定了data和file参数,优先使用data指定的图片
file
指定图片文件名称
设置位图的背景色
设置位图的前景色
将位图掩码的数据内容以字符串形式传递
指定位图掩码文件名称
不支持除上面描述的公共方法外的其他方法。
下一篇: (GUI编程)模块全解(下) zzy的博客-CSDN博客
如果你在开发 程序时遇到了问题,或是有文章内容的建议,可以私信联系我,感谢支持!