文章目录
- 一、说明
- 二、几何时使用 Canvas 组件
- 2.1 用法
- 2.2 简单范例
- 2.3 对象移动
- 2.4 对象删除
- 2.5 文字对象显示
 
- 三、画布和画布对象
- 3.1 画布生成函数原型
- 3.2 使用create_xxx()方法
- 3.3 对参数**options的解释
 
一、说明
Canvas(画布)组件为 Tkinter 的图形绘制提供了基础。Canvas 是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。

二、几何时使用 Canvas 组件
    Canvas 是一个通用的组件,通常用于显示和编辑图形。你可以用它来绘制线段、圆形、多边形,甚至是绘制其它组件。
2.1 用法
    在 Canvas 组件上绘制对象,绘制的要点是:1)可以用 create_xxx() 的方法(xxx 表示对象类型,例如线段 line,矩形 rectangle,文本 text 等)。2)返回一个流水号ID: ID = create_xxx()
Canvas 组件支持对象:
arc(弧形、弦或扇形)
 bitmap(内建的位图文件或 XBM 格式的文件)
 image(BitmapImage 或 PhotoImage 的实例对象)
 line(线)
 oval(圆或椭圆形)
 polygon(多边形)
 rectangle(矩形)
 text(文本)
 window(组件)
 其中,弦、扇形、椭圆形、圆形、多边形和矩形这些“封闭式”图形都是由轮廓线和填充颜色组成的,但都可以设置为透明(传入空字符串表示透明)。
2.2 简单范例
import tkinter as tkroot = tk.Tk()w = tk.Canvas(root, width =200, height = 100)
w.pack()#画一条黄色的横线
w.create_line(0, 50, 200, 50, fill = "yellow")
#画一条红色的竖线(虚线)
w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))
#中间画一个蓝色的矩形
w.create_rectangle(50, 25, 150, 75, fill = "blue")root.mainloop()
2.3 对象移动
    注意,添加到 Canvas 上的对象会一直保留直着。如果你希望修改它们,你可以使用:
- coords(),
- itemconfig()
- move()
 方法来移动画布上的对象
import tkinter as tk
root = tk.Tk()w = tk.Canvas(root, width =600, height = 600)
w.pack()line1 = w.create_line(0, 50, 200, 50, fill = "red")
# line2 = w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))
# rect1 = w.create_rectangle(50, 25, 150, 75, fill = "blue")def move():for i in range(100):w.coords(line1, 0 , 50+i, 200 , 50+i)print(i)tk.Button(root, text = "删除全部", command = (lambda x = "all" : w.delete(x))).pack()
tk.Button(root, text = "移动全部", command =  move   ).pack()
root.mainloop()
2.4 对象删除
或者使用 delete() 方法来删除:
import tkinter as tk
root = tk.Tk()w = tk.Canvas(root, width =600, height = 600)
w.pack()line1 = w.create_line(0, 50, 200, 50, fill = "red")
line2 = w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))
rect1 = w.create_rectangle(50, 25, 150, 75, fill = "blue")tk.Button(root, text = "删除全部", command = (lambda x = "all" : w.delete(x))).pack()root.mainloop()
2.5 文字对象显示
你还可以在 Canvas 上显示文本,使用的是 create_text() 方法,文字对象显示与几何体不同,表现在:
- 坐标不同
- 字体可选择
- 需要字符串
import tkinter as tkroot = tk.Tk()w = tk.Canvas(root, width =200, height = 100)
w.pack()w.create_text(100, 50, text = "Python") 
root.mainloop()
三、画布和画布对象
画布和画布对象的关系是:
首先,画布是根,画布对象是叶,所有操作前提是必须有个画布。对对象的操作也必须经过画布。
 画布和画布对象存在消息链接。类似于窗口和控件的关系。
 画布上可以管理画布对象(增删改查)
3.1 画布生成函数原型
上文示例虽然用到画布生成函数,但是没有全面系统阐述,本节中详细阐述生成函数的参数。
函数原型
Canvas(master=None, **options) (class)
master – 父组件
**options – 组件选项,下方表格详细列举了各个选项的具体含义和用法:
| 选项 | 含义 | 
|---|---|
| background | 指定 Canvas 的背景颜色 | 
| bg | 跟 background 一样 | 
| borderwidth | 指定 Canvas 的边框宽度 | 
| bd | 跟 borderwidth 一样 | 
| closeenough | 1. 指定一个距离,当鼠标与画布对象的距离小于该值时,鼠标被认为在画布对象上2. 该选项是一个浮点类型的值 | 
| confine | 1. 指定 Canvas 组件是否允许滚动超出 scrollregion 选项指定的范围2. 默认值是 True | 
| cursor | 指定当鼠标在 Canvas 上飘过的时候的鼠标样式 | 
| height | 1. 指定 Canvas 的高度;2. 单位是像素 | 
| highlightbackground | 指定当 Canvas 没有获得焦点的时候高亮边框的颜色 | 
| highlightcolor | 指定当 Canvas 获得焦点的时候高亮边框的颜色 | 
| highlightthickness | 指定高亮边框的宽度 | 
| relief | 1. 指定 Canvas 的边框样式;2. 默认值是 “flat”;3. 其他可以选择的值是 “sunken”,“raised”,“groove” 和 “ridge” | 
| scrollregion | 1. 指定 Canvas 可以被滚动的范围;2. 该选项的值是一个 4 元组(x1, y1, x2, y2)表示的矩形 | 
| selectbackground | 指定当画布对象被选中时的背景色 | 
| selectborderwidth | 指定当画布对象被选中时的边框宽度(选中边框) | 
| selectforeground | 指定当画布对象被选中时的前景色 | 
| state | 1. 设置 Canvas 的状态:“normal” 或 “disabled”;2. 默认值是 “normal”;3. 注意:该值不会影响画布对象的状态 | 
| takefocus | 1. 指定使用 Tab 键可以将焦点移动到输入框中;2. 默认是开启的,可以将该选项设置为 False 避免焦点在此输入框中; | 
| width | 1. 指定 Canvas 的宽度; 2. 单位是像素 | 
| xscrollcommand | 1. 与 scrollbar(滚动条)组件相关联(水平方向);2. 使用方法可以参考:Scrollbar 组件 | 
| xscrollincrement | 1. 该选项指定 Canvas 水平滚动的“步长”;2. 例如 ‘3c’ 表示 3 厘米,还可以选择的单位有 ‘i’(英寸),‘m’(毫米)和 ‘p’(DPI,大约是 ‘1i’ 等于 ‘72p’);3. 默认值是 0,表示可以水平滚动到任意位置 | 
| yscrollcommand | 1. 与 scrollbar(滚动条)组件相关联(垂直方向);2. 使用方法可以参考:Scrollbar 组件; | 
| yscrollincrement | 1. 该选项指定 Canvas 垂直滚动的“步长”;2. 例如 ‘3c’ 表示 3 厘米,还可以选择的单位有 ‘i’(英寸),‘m’(毫米)和 ‘p’(DPI,大约是 ‘1i’ 等于 ‘72p’);3. 默认值是 0,表示可以水平滚动到任意位置 | 
3.2 使用create_xxx()方法
使用 create_oval() 方法绘制椭圆形(或圆形),参数是指定一个限定矩形(Tkinter 会自动在这个矩形内绘制一个椭圆):
create_oval(bbox, **options)
– 根据限定矩形 bbox 绘制一个椭圆
 – 新创建的画布对象位于显示列表的顶端
 – 创建成功后返回该画布对象的 ID
 – 下方表格列举了各个 options 选项的具体含义:
| 选项 | 含义**options | 
|---|---|
| activedash | 当画布对象状态为 “active” 的时候,绘制虚线 | 
| activefill | 当画布对象状态为 “active” 的时候,填充颜色 | 
| activeoutline | 当画布对象状态为 “active” 的时候,绘制轮廓线 | 
| activeoutlinestipple | 当画布对象状态为 “active” 的时候,指定填充轮廓的位图 | 
| activestipple | 当画布对象状态为 “active” 的时候,指定填充的位图 | 
| activewidth | 当画布对象状态为 “active” 的时候,指定边框的宽度 | 
| dash | 1. 指定绘制虚线轮廓;2. 该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔;3. 例如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔 | 
| dashoffset | 1. 指定虚线轮廓开始的偏移位置’2. 例如当 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线 | 
| disableddash | 当画布对象状态为 “disabled” 的时候,绘制虚线 | 
| disabledfill | 当画布对象状态为 “disabled” 的时候,填充颜色 | 
| disabledoutline | 当画布对象状态为 “disabled” 的时候,绘制轮廓线 | 
| disabledoutlinestipple | 当画布对象状态为 “disabled” 的时候,指定填充轮廓的位图 | 
| disabledstipple | 当画布对象状态为 “disabled” 的时候,指定填充的位图 | 
| disabledwidth | 当画布对象状态为 “disabled” 的时候,指定边框的宽度 | 
| fill | 1. 指定填充的颜色;2. 空字符串表示透明 | 
| offset | 1. 指定当点画模式时填充位图的偏移;2. 该选项的值可以是:“x,y”, “#x,y”, “n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, “center” | 
| outline | 指定轮廓的颜色 | 
| outlineoffset | 1. 指定当点画模式绘制轮廓时位图的偏移;2. 该选项的值可以是:“x,y”, “#x,y”, “n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, “center” | 
| outlinestipple | 1. 当 outline 选项被设置时,该选项用于指定一个位图来填充边框;2. 默认值是空字符串,表示黑色 | 
| state | 1. 指定该画布对象的状态;2. 可以是 “normal”,“disabled”(不可用,不响应事件)和 “hidden”(隐藏);3. 默认值是 “normal” | 
| stipple | 1. 指定一个位图用于填充;2. 默认值是空字符串,表示实心 | 
| tags | 为创建的画布对象添加标签 | 
| width | 指定边框的宽度 | 
3.3 对参数**options的解释
**options:对多参数函数的引用,其参数的表格为字典。
 *options:对多参数函数的引用,其参数的表格为列表。
 函数定义:
 def cunn1(**options)
 def cunn2(*options)
 函数调用:
 cc = cunn1(bg=“#ffffff”)
 cc = cunn2( “#ffffff”)
 对比:
 **options:不关注参数顺序,但必须提供参数名称;
 *options: 参数严格按顺序输入,无法提供参数名称;