Canvas 相关参数简介

Canvas 组件提供两种方法让你指定或者获取画布对象:Item handlestags

  • Item handles 事实上是一个用于指定某个画布对象的整型数字(也成为画布对象的 ID)。当你在 Canvas 组件上创建一个画布对象的时候,tkinter 将自动为其指定一个在该 Canvas 组件中独一无二的整型值。然后各种 Canvas 的方法可以通过这个值操纵该画布对象。
  • tags 是附在画布对象上的标签,tags 由普通的非空白字符串组成。一个画布对象可以与多个 tags 相关联,一个 tag 也可用于描述多个画布对象。然而,与 Text 组件不同,没有指定画布对象的 tags 不能进行事件绑定和配置样式。也就是说,Canvas 组件的 tags 是仅为画布对象所拥有。
  • Canvas 组件预定义了两个 tags'all'(表示 Canvas 组件中的所有画布对象)与 "current"(表示鼠标指针下存在的画布对象)。

参数简介

调用:Canvas(master=None, cnf={}, **kw)

  • master:父组件
  • **kw:组件选项,下方表格详细列举了各个选项的具体含义和用法
选项 含义
background 指定 Canvas 的背景颜色,可简写为 bg
borderwidth 指定 Canvas 的边框宽度,可简写为 bd
closeenough 指定一个(浮点类型的)距离,当鼠标与画布对象的距离小于该值时,鼠标被认为在画布对象上
confine 指定 Canvas 组件是否允许滚动超出 scrollregion 选项指定的范围;默认值是 True
cursor 指定当鼠标在 Canvas 上飘过的时候的鼠标样式
height 指定 Canvas 的高度;单位是像素
width 指定 Canvas 的宽度;单位是像素
highlightbackground 指定当 Canvas 没有获得焦点的时候高亮边框的颜色
highlightcolor 指定当 Canvas 获得焦点的时候高亮边框的颜色
highlightthickness 指定高亮边框的宽度
relief 指定 Canvas 的边框样式;默认值是 'flat',其他可以选择的值有 'sunken', 'raised', 'groove', 'ridge'
scrollregion 指定 Canvas 可以被滚动的的矩形范围为 (x_0,y_0, x_1, y_1)
selectbackground 指定当画布对象被选中时的背景色
selectborderwidth 指定当画布对象被选中时的边框宽度(选中边框)
selectforeground 指定当画布对象被选中时的前景色
state 设置 Canvas 的状态:'normal'(默认), 'disabled';注意:该值不会影响画布对象的状态
takefocus 指定使用 Tab 键可以将焦点移动到输入框中;默认是开启的,可以将该选项设置为 False 避免焦点在此输入框中
xscrollcommand 与 scrollbar(水平方向滚动条)组件相关联,具体使用参考 Scrollbar 组件
yscrollcommand 与 scrollbar(垂直方向滚动条)组件相关联, 使用方法可以参考 Scrollbar 组件
xscrollincrement 指定 Canvas 水平滚动的“步长”(默认值是 0,表示可以水平滚动到任意位置)。例如 '3c' 表示 3 厘米,可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' = '72p'
yscrollincrement 指定 Canvas 垂直滚动的“步长”(默认值是 0,表示可以垂直滚动到任意位置)。

方法简介[1]

addtag(tag, method, *args)

  • tag:添加一个 tag 到一系列画布对象中指定
  • method:添加 tag 的位置,可以是:"above", "all", "below", "closest", "enclosed", "overlapping" 或 "withtag"
  • args 是附加参数,请参考下方等同的方法

addtag_above(tag, item)

  • tag:为显示列表中 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) 相临近的画布对象(该方法相当于 addtag(tag, "closet", x, y,halo=None, start=None))。可选参数 halo 指定一个距离,表示以 (x,y) 为中心,该距离内的所有画布对象均添加 tag;可选参数 start 指定一个画布对象,该方法将为低于但最接近该对象的画布对象添加 tag。[2]

addtag_enclosed(tag, x0, y0, x1, y1)

为所有坐标在矩形 (x_0,y_0, x_1, y_1) 中的画布对象添加 tag,该方法相当于 addtag(tag, "enclosed", x0, y0, x1, y1)

addtag_overlapped(tag, x0, y0, x1, y1)

addtag_enclosed() 方法相似,不过该方法范围更广(即使画布对象只有一部分在矩形中也算),该方法相当于 addtag(tag, "overlapping", x0, y0, x1, y1)

addtag_withtag(tag, item)

item 参数指定的画布对象添加 tag,该方法相当于 addtag(tag, "withtag", item)item 参数如果指定一个 tag,则为所有拥有此tag 的画布对象添加新的 tag;item 参数如果指定一个画布对象,那么只为其添加 tag。

bbox(*args)

返回一个四元组 (x_0,y_0, x_1, y_1) 用于描述 args 指定的画布对象所在的矩形范围,如果 args 参数省略,则返回所有的画布对象所在的矩形范围。

canvasx(screenx, gridspacing=None)

将窗口坐标系的 X 坐标(screenx)转化为画布坐标系。如果提供 gridspacing 参数,则转换结果将为该参数的整数倍。

canvasy(screeny, gridspacing=None)

将窗口坐标系的 Y 坐标(screeny)转化为画布坐标系。如果提供 gridspacing 参数,则转换结果将为该参数的整数倍。

coords(*args)

如果仅提供一个参数(画布对象),返回该画布对象的坐标 (x_0,y_0, x_1, y_1)。可以通过 coords(item, x1, y1, x2, y2) 来移动画布对象。

dchars(item, from, to=None)

删除 item 中从 fromto(包含)参数中的字符串。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)

返回完全包含在限定矩形内所有画布对象的 ID。

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)

跟 itemconfig() 一样

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 选项的具体含义:

选项 含义
colormode 该选项的值可以是:'color'(颜色输出),'gray'(灰阶输出)和 'mono'(黑白输出)
file 1. 该选项指定一个文件,将 PostScript 写入该文件中 2. 如果忽略该选项,PostScript 将以字符串的形式返回 height 1. 指定要打印的 Canvas 组件的高度 2. 默认值是 Canvas 组件的整体高度
rotate 1. 如果该选项的值为 False,该页面将以纵向呈现 2. 如果该选项的值为 True,该页面将以横向呈现
x 开始打印的最左边位置,以画布坐标系表示
y 开始打印的最顶端位置,以画布坐标系表示
width 1. 指定要打印的 Canvas 组件的宽度 2. 默认值是 Canvas 组件的整体宽度

scale(item, xOrigin, yOrigin, xScale, yScale)

缩放 item 指定的画布对象。xOrigin 和 yOrigin 决定要缩放的位置;xScale 和 yScale 决定缩放的比例;item 可以是单个画布对象的 ID,也可以是某个 tag。

注意:该方法无法缩放 Text 画布对象

可以看一个例子:

from tkinter import Tk, Canvas
root = Tk()
self = Canvas(root)
rt1 = self.create_rectangle(50,50,110,110, outline='blue', tags='rt')
rt = self.create_rectangle(50,50,110,110, outline='red', tags='rt')
self.scale(rt, 50, 110, 1/2, 1/2)
self.pack()
root.mainloop()

select_adjust(item, index)

调整选中范围,使得给定的 index 参数指定的位置在范围内。item 可以是单个画布对象的 ID,也可以是某个 tag

select_clear()

取消 Canvas 组件中所有选中的范围

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) 一样

一个注意事项

使用tkinter中创建canvas时,会设置canvas的宽高。一般我们认为canvas中画图区域就是设置的宽高。其实这不太正确,canvas还有一个边框,如果不另外设置,真正的画图区域要减去边框。
比如我们容器的尺寸为width, height。然后在这个容器中添加一个唯一的canvas,canvas的尺寸设置为width, height,并且pack(expand=1, fill=both)。如果给这个canvas设置一个背景色,容器外部设置另外一个背景色,就可以看得到canvas四周有一条白色的边框。这在我们做窗口布置时,显得不太完美。改进方法其实很简单:

canvas.config(highlightthickness=0)

实现拖曳功能

scan_dragto(x, y)

见下方 scan_mark(x, y)

scan_mark(x, y)

使用这种方式来实现 Canvas 内容的滚动。需要将鼠标按钮事件及当前鼠标位置绑定到 scan_mark(x, y) 方法,然后再将 <motion> 事件及当前鼠标位置绑定到 scan_dragto(x,y,gain=10) 方法,就可以实现 Canvas 在当前位置和 sacn_mack(x, y) 指定的位置 (x, y) 之间滚动


  1. 参考 CSDN 博主「rubbish_hama」的原创文章:https://blog.csdn.net/tianmuha/java/article/details/80959004

  2. 如果同时与几个画布对象与给定坐标 (x,y) 的距离相同,则为位于显示列表上方的那个画布对象添加 tag

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354