![在这里插入图片描述](http://img.e-com-net.com/image/info8/de0b96b5186e418fbb4052c24afea6ff.jpg)
文章目录
- 一、组件简介
- 二、运用实例
-
- 1. Canvas 绘制对象
- 2. Canvas 操作对象
- 3. Canvas 自由涂鸦
- 三、参数方法
-
一、组件简介
Canvas组件,画布,通常用来显示和编辑图形。
Canvas 非常灵活,你几乎可以为所欲为!
可以用它绘制以用它来绘制线段、圆形、多边形,或者创建图形编辑器供用户实现,甚至是自定义各种小组件。
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第1张图片](http://img.e-com-net.com/image/info8/091e1f6f4cb84dbf9ac9e4ccfe946f9b.jpg)
Canvas 支持对象
- arc 弧形、弦或扇形
- bitmap 内建的位图文件或 XBM 格式的文件
- image BitmapImage 或 PhotoImage 的实例对象
- line 线
- oval 圆或椭圆形
- polygon 多边形
- rectangle 矩形
- text 文本
- window 组件
![在这里插入图片描述](http://img.e-com-net.com/image/info8/5833b9762fb249b5aa45f7d4f99c6ae7.jpg)
二、运用实例
——
1. Canvas 绘制对象
首先我们通过一个例子,初步了解一下在canvas画布中绘制各种对象。
import tkinter as tk
root = tk.Tk()
w = tk.Canvas(root, width=400, height=200)
w.pack()
line_1= w.create_line(0,100,400,100, fill='red')
line_2 =w.create_line(200,0,200,200, fill='green', dash=(3,3))
rec_1 = w.create_rectangle(100,50,300,150, fill='yellow')
oval_1 = w.create_oval(100,50,300,150, fill='Turquoise', dash=(4,4))
text_1= w.create_text(200,80, text='逆旅鸭', font=18)
b = tk.Button(root, text='点我')
window_1 = w.create_window(200,120,window=b)
root.mainloop()
运行程序,显示如下
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第2张图片](http://img.e-com-net.com/image/info8/76f0a72820cf4ffa9fe06c99829fdec6.jpg)
大家可以对照代码自行细细体会各个创建的元素在画布上的样子。
这里还是重点指出一下
- 多数创建对象的前4个属性,分别表示对象起点和重点的x,y坐标
- dash(3, 3) 表示绘制虚线轮廓,第一个3表示虚线的长度为3个像素,第二个3表示虚线之间的间隔为3个像素
- 细心的伙伴会发现矩形和椭圆的起点终点的坐标是一样的,其实椭圆(圆)的绘制方式,就是在限定矩形内画一个椭圆(圆)
——
2. Canvas 操作对象
在canvas画布上的对象绘制好了,我们同样可以对指定对象进行一些操作,比如移动、改变属性样式、删除等等。
w.coords(line_1, 0,50,400,150)
w.itemconfig(rec_1, fill='pink')
w.delete(oval_1)
tk.Button(root, text="删除全部", command=(lambda a='all':w.delete(a))).pack()
(此为部分代码,与上面那个例子的代码是在一起的)
我们运行一下程序来看看。
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第3张图片](http://img.e-com-net.com/image/info8/94fdb3ef85884de6ae371eba2190846b.gif)
在这里补充一下,在canvas组件中提供了4中指定对象的方式
4种指定对象的方法
- Item handles 画布对象ID
- Tags 画布对象标签
- ALL 所有画布对象
- CURRENT 鼠标指针下的画布对象
——
3. Canvas 自由涂鸦
我们可以利用canvas创建图形编辑器,下面我们简单创造一个类似画笔的功能,利用“鼠标左键按住拖动”来自由涂鸦绘画。
root = tk.Tk()
tk.Label(root, text="自由涂鸦").pack(side='top', padx=10, pady=10)
w = tk.Canvas(root, width=400, height=200)
w.pack()
def paint(event):
x1, y1 = event.x, event.y
x2, y2 = event.x, event.y
w.create_oval(x1, y1, x2, y2, fill="black")
w.bind("", paint)
tk.Button(root, text="清除屏幕", command=(lambda a='all':w.delete(a))).pack(padx=10,pady=10)
root.mainloop()
运行程序,Let ’ go!
这个自由绘画的本质就是通过按住鼠标左键构造一个一个的圆点,但是不太灵敏,如果鼠标移动速度过快就很难形成连续的线段。
![在这里插入图片描述](http://img.e-com-net.com/image/info8/5833b9762fb249b5aa45f7d4f99c6ae7.jpg)
三、参数方法
——
1. 参数汇总
Canvas组件本身的的参数不多,但是该组件拥有的方法以及方法包含的参数设置就非常多了。
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第4张图片](http://img.e-com-net.com/image/info8/2dfb69d529124afcbfae1f2939b48215.jpg)
——
2. 方法汇总
addtag(tag, method, *args)
- 添加一个 Tag 到一系列画布对象中
- 指定添加 Tag 的位置,可以是:“above”,“all”,“below”,“closest”,“enclosed”,“overlapping” 或 “withtag”
- args 是附加参数,请参考下方等同的方法
addtag_above(tag, item)
- 为显示列表中 item 上方的画布对象添加 Tag
- 该方法相当于 addtag(tag, “above”, item)
- item 可以是单个画布对象的 ID,也可以是某个 Tag
addtag_all(tag)
- 为 Canvas 组件中所有的画布对象添加 Tag
- 该方法相当于 addtag(tag, “all”)
addtag_below(tag, item)
- 为显示列表中 item 下方的画布对象添加 Tag
- 该方法相当于 addtag(tag, “below”, item)
- item 可以是单个画布对象的 ID,也可以是某个 Tag
addtag_closest(tag, x, y, halo=None, start=None)
- 将 Tag 添加到与给定坐标(x, y)相临近的画布对象
- 可选参数 halo 指定一个距离,表示以(x, y)为中心,该距离内的所有画布对象均添加 Tag
- 可选参数 start 指定一个画布对象,该方法将为低于但最接近该对象的画布对象添加 Tag
- 该方法相当于 addtag(tag, “closet”, x, y, halo=None, start=None)
- 注1:使用的是画布坐标系
- 注2:如果同时由几个画布对象与给定坐标(x, y)的距离相同,则为位于显示列表上方的那个画布对象添加 Tag
addtag_enclosed(tag, x1, y1, x2, y2)
- 为所有坐标在矩形(x1, y1, x2, y2)中的画布对象添加 Tag
- 该方法相当于 addtag(tag, “enclosed”, x1, y1, x2, y2)
addtag_overlapped(tag, x1, y1, x2, y2)
- 跟 addtag_enclosed() 方法相似,不过该方法范围更广(即使画布对象只有一部分在矩形中也算)
- 该方法相当于 addtag(tag, “overlapping”, x1, y1, x2, y2)
addtag_withtag(tag, item)
- 为 item 参数指定的画布对象添加 Tag
- item 参数如果指定一个 Tag,则为所有拥有此 Tag 的画布对象添加新的 Tag
- item 参数如果指定一个画布对象,那么只为其添加 Tag
- 该方法相当于 addtag(tag, “withtag”, item)
- item 可以是单个画布对象的 ID,也可以是某个 Tag
bbox(*args)
- 返回一个四元组(x1, y1, x2, y2)用于描述 args 指定的画布对象所在的矩形范围
- 如果 args 参数忽略,返回所有的画布对象所在的矩形范围
canvasx(screenx, gridspacing=None)
- 将窗口坐标系的 X 坐标(screenx)转化为画布坐标系
- 如果提供 gridspacing 参数,则转换结果将为该参数的整数倍
canvasy(screeny, gridspacing=None)
- 将窗口坐标系的 Y 坐标(screenx)转化为画布坐标系
- 如果提供 gridspacing 参数,则转换结果将为该参数的整数倍
coords(*args)
- 如果仅提供一个参数(画布对象),返回该画布对象的坐标 (x1, y1, x2, y2)
- 你可以通过 coords(item, x1, y1, x2, y2) 来移动画布对象
create_arc(bbox, **options)
- 根据 bbox (x1, y1, x2, y2) 创建一个扇形(PIESLICE)、弓形(CHORD)或弧形(ARC)
- 新创建的画布对象位于显示列表的顶端
- 创建成功后返回该画布对象的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第5张图片](http://img.e-com-net.com/image/info8/8f85ddf916da4319875cd5cb669ac534.jpg)
create_bitmap(position, **options)
- 在 position 指定的位置(x, y)创建一个位图对象
- 创建成功后返回该位图对象的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第6张图片](http://img.e-com-net.com/image/info8/81e7d4897da545cbb264be6686ea29de.jpg)
create_line(coords, **options)
- 根据 coords 给定的坐标创建一条或多条线段
- 如果给定的坐标多余两个点,则会首尾相连变成一条折线
- 创建成功后返回该画布对象的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第7张图片](http://img.e-com-net.com/image/info8/fde06c64652f4e0da39a112035115031.jpg)
create_oval(bbox, **options)
- 根据限定矩形 bbox 绘制一个椭圆
- 新创建的画布对象位于显示列表的顶端
- 创建成功后返回该画布对象的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第8张图片](http://img.e-com-net.com/image/info8/088f6ca035aa49efab65ad0732ea215e.jpg)
create_polygon(coords, **options)
- 根据 coords 给定的坐标绘制一个多边形
- 新创建的画布对象位于显示列表的顶端
- 创建成功后返回该画布对象的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第9张图片](http://img.e-com-net.com/image/info8/d3749cf094754ebd8bb5ef854234fe05.jpg)
create_rectangle(bbox, **options)
- 根据限定矩形 bbox 绘制一个矩形
- 新创建的画布对象位于显示列表的顶端
- 创建成功后返回该画布对象的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第10张图片](http://img.e-com-net.com/image/info8/eebf6ae81c7b477d96b7716024ce285c.jpg)
create_text(position, **options)
- 在 position 指定的位置(x, y)创建一个文本对象
- 创建成功后返回该文本对象的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第11张图片](http://img.e-com-net.com/image/info8/151d30d3ea3f4c4b98730586ac07e428.jpg)
create_window(position, **options)
- 在 position 指定的位置(x, y)创建一个窗口组件
- 创建成功后返回该窗口组件的 ID
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第12张图片](http://img.e-com-net.com/image/info8/3c1bcc0975494aeda50257fd1f46cd3c.jpg)
dchars(item, from, to=None)
- 删除 item 中从 from 到 to(包含)参数中的字符串
- item 可以是单个画布对象的 ID,也可以是某个 Tag
delete(item)
- 删除 item 参数指定的画布对象
- 如果不存在 item 指定的画布对象,并不会产生错误
- item 可以是单个画布对象的 ID,也可以是某个 Tag
dtag(item, tag=None)
- 在 item 参数指定的画布对象中删除指定的 tag
- 如果 tag 参数被忽略,则删除指定画布对象所有的 tags
- 如果不存在 item 指定的画布对象,并不会产生错误
- item 可以是单个画布对象的 ID,也可以是某个 Tag
find_above(item)
- 返回在 item 参数指定的画布对象之上的 ID
- 如果有多个画布对象符合要求,那么返回最顶端的那个
- 如果 item 参数指定的是最顶层的画布对象,那么返回一个空元组
- item 可以是单个画布对象的 ID,也可以是某个 Tag
find_all()
- 返回 Canvas 组件上所有的画布对象
- 返回格式是一个元组,包含所有画布对象的 ID
- 按照显示列表的顺序返回
- 该方法相当于 find_withtag(ALL)
find_below(item)
- 返回在 item 参数指定的画布对象之下的 ID
- 如果有多个画布对象符合要求,那么返回最底端的那个
- 如果 item 参数指定的是最底层的画布对象,那么返回一个空元组
- item 可以是单个画布对象的 ID,也可以是某个 Tag
find_closest(x, y, halo=None, start=None)
- 返回一个元组,包含所有靠近点(x, y)的画布对象的 ID
- 如果没有符合的画布对象,则返回一个空元组
- 可选参数 halo 用于增加点(x, y)的辐射范围
- 可选参数 start 指定一个画布对象,该方法仅返回在显示列表中低于但最接近的一个 ID
- 注意,点(x, y)的坐标是采用画布坐标系来表示
find_enclosed(x1, y1, x2, y2)
find_overlapping(x1, y1, x2, y2)
- 返回所有与限定矩形有重叠的画布对象的 ID(让然也包含在限定矩形内的画布对象)
find_withtag(item)
- 返回 item 指定的所有画布对象的 ID
- item 可以是单个画布对象的 ID,也可以是某个 Tag
focus(item=None)
- 将焦点移动到指定的 item
- 如果有多个画布对象匹配,则将焦点移动到显示列表中第一个可以接受光标输入的画布对象
- item 可以是单个画布对象的 ID,也可以是某个 Tag
gettags(item)
- 返回与 item 相关联的所有 Tags
- item 可以是单个画布对象的 ID,也可以是某个 Tag
icursor(item, index)
- 将光标移动到 item 指定的画布对象
- 这里要求 item 指定的画布对象支持文本输入和转移焦点
- item 可以是单个画布对象的 ID,也可以是某个 Tag
index(item, index)
- 返回 index 在指定 item 中的位置(沿用 Python 的惯例:0 表示第一)
- index 参数可以是:INSERT(当前光标的位置),END(最后一个字符的位置),SEL_FIRST(当前选中文本的起始位置),SEL_LAST(当前选中文本的结束位置),还可以使用格式为 “@x, y”(x 和 y 是画布坐标系)来获得与此坐标最接近的位置
- item 可以是单个画布对象的 ID,也可以是某个 Tag
insert(item, index, text)
- 在允许进行文本编辑的画布对象的指定位置插入文本
- index 参数可以是:INSERT(当前光标的位置),END(最后一个字符的位置),SEL_FIRST(当前选中文本的起始位置),SEL_LAST(当前选中文本的结束位置),还可以使用格式为 “@x, y”(x 和 y 是画布坐标系)来获得与此坐标最接近的位置
- item 可以是单个画布对象的 ID,也可以是某个 Tag
itemcget(item, option)
- 获得指定 item 的选项的当前值
- item 可以是单个画布对象的 ID,也可以是某个 Tag
itemconfig(item, **options)
- 修改指定 item 的选项的当前值
- item 可以是单个画布对象的 ID,也可以是某个 Tag
itemconfigure(item, **options)
lift(item, **options)
- 将指定画布对象移动到显示列表的顶部
- item 可以是单个画布对象的 ID,也可以是某个 Tag
- 跟 tag_raise 一样
lower(item, **options)
- 将指定画布对象移动到显示列表的底部
- item 可以是单个画布对象的 ID,也可以是某个 Tag
- 跟 tag_lower 一样
move(item, dx, dy)
- 将 item 移动到新位置(x, y)
- item 可以是单个画布对象的 ID,也可以是某个 Tag
postscript(**options)
- 将 Canvas 的当前内容封装成 PostScript 格式(什么是 PostScript)表示
- 下方表格列举了各个 options 选项的具体含义:
![【tkinter组件专栏】Canvas:发挥你横溢才华的画布_第13张图片](http://img.e-com-net.com/image/info8/b2ddd6e0283c44fd87a3e868c4a9780c.jpg)
scale(item, xOrigin, yOrigin, xScale, yScale)
- 缩放 item 指定的画布对象
- xOrigin 和 yOrigin 决定要缩放的位置
- xScale 和 yScale 决定缩放的比例
- item 可以是单个画布对象的 ID,也可以是某个 Tag
- 注意:该方法无法缩放 Text 画布对象
scan_dragto(x, y)
scan_mark(x, y)
- 使用这种方式来实现 Canvas 内容的滚动
- 需要将鼠标按钮事件及当前鼠标位置绑定到 scan_mark(x, y) 方法,然后再将 事件及当前鼠标位置绑定到 scan_dragto(x, y) 方法,就可以实现 Canvas 在当前位置和 sacn_mack(x, y) 指定的位置 (x, y) 之间滚动
select_adjust(item, index)
- 调整选中范围,使得给定的 index 参数指定的位置在范围内
- item 可以是单个画布对象的 ID,也可以是某个 Tag
select_clear()
select_from(item, index)
- 调整选中范围的起始位置为 index 参数指定的位置
- item 可以是单个画布对象的 ID,也可以是某个 Tag
select_item()
- 范围在 Canvas 组件中当前文本的选中范围
- 如果没有则返回 None
select_to(item, index)
- 调整选中范围的结束位置为 index 参数指定的位置
tag_bind(item, event=None, callback, add=None)
- 为 Canvas 组件上的画布对象绑定方法
- event 参数是绑定的事件名称,callback 是与之关联的方法
- item 可以是单个画布对象的 ID,也可以是某个 Tag
- 注意:与绑定事件关联的是画布对象,而不是 Tag
tag_lower(item)
- 将一个或多个画布对象移至底部
- 如果是多个画布对象,将它们都移至底部并保留原有顺序
- item 可以是单个画布对象的 ID,也可以是某个 Tag
- 注意:该方法对窗口组件无效,请使用 lower 代替
tag_raise(item)
- 将一个或多个画布对象移至顶部
- 如果是多个画布对象,将它们都移至顶部并保留原有顺序
- item 可以是单个画布对象的 ID,也可以是某个 Tag
- 注意:该方法对窗口组件无效,请使用 lift 代替
tag_unbind(item, event, callback=None)
- 解除与 item 绑定的事件
- item 可以是单个画布对象的 ID,也可以是某个 Tag
tkraise(item, **options)
- 将指定画布对象移动到显示列表的顶部
- item 可以是单个画布对象的 ID,也可以是某个 Tag
- 跟 tag_raise 一样
type(item)
- 返回指定画布对象的类型
- 返回值可以是:“arc”, “bitmap”, “image”, “line”, “oval”, “polygon”, “rectangle”, “text”, 或 “window”
xview(*args)
- 该方法用于在水平方向上滚动 Canvas 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)
- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端
- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:xview(SCROLL, 3, UNITS) 表示向右滚动三行
xview_moveto(fraction)
- 跟 xview(MOVETO, fraction) 一样
xview_scroll(number, what)
- 跟 xview(SCROLL, number, what) 一样
yview(*args)
- 该方法用于在垂直方向上滚动 Canvas 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)
- 如果第一个参数是 MOVETO,则第二个参数表示滚动到指定的位置:0.0 表示最顶端,1.0 表示最底端
- 如果第一个参数是 SCROLL,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 UNITS 或 PAGES),例如:yview(SCROLL, 3, PAGES) 表示向下滚动三页
yview_moveto(fraction)
- 跟 yview(MOVETO, fraction) 一样
yview_scroll(number, what)
- 跟 yview(SCROLL, number, what) 一样
![在这里插入图片描述](http://img.e-com-net.com/image/info8/5833b9762fb249b5aa45f7d4f99c6ae7.jpg)
![在这里插入图片描述](http://img.e-com-net.com/image/info8/4b41a916b2864099ac89b741a222af3f.jpg)