第四章、画布
1. 画布 canvas
画布(Canvas)是 Tkinter 中一个功能强大的绘图控件,它提供了一个矩形区域,允许你在上面绘制图形、文字、图像,甚至放置其他控件。
画布支持以下功能:
- 绘制基本图形(线条、矩形、圆形、多边形等)
- 显示文字和图像
- 创建交互式绘图工具(如画板、图表)
- 构建游戏界面(如贪吃蛇、俄罗斯方块)
创建画布的构造方法:
tkinter.Canvas(master=None, width=0, height=0)
常用参数
- width / height:画布的宽度和高度(像素)。
- bg:背景颜色(如 "white"、"lightblue")。
- bd:边框宽度(默认 0)。
- relief:边框样式(如 "solid"、"raised")。
示例:
import tkinter
root = tkinter.Tk()
canvas = tkinter.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
root.mainloop()
画布支持的图形如下:
- bitmap
- image(BitmapImage, PhotoImage)
- line
- oval
- polygon
- rectangle
- text
- arc
画布创建图形的方法:
canvas.create_xxx(x, y, other, ...)
如:create_line()、create_rectangle()、create_oval()、create_polygon()等。
返回一个创建的组件的ID,同时候也可以用tag属性指定其标签名称
例如
绘制线条
# 从 (x1, y1) 到 (x2, y2) 画一条线
line = canvas.create_line(50, 50, 200, 50, fill="red", width=2)
参数
- fill:线条颜色。
- width:线条宽度(像素)。
绘制矩形
# 绘制矩形(左上角坐标 x1,y1,右下角坐标 x2,y2)
rect = canvas.create_rectangle(100, 100, 250, 200, fill="blue", outline="black")
参数:
- fill:填充颜色。
- outline:边框颜色。
绘制圆形/椭圆
# 绘制椭圆(边界矩形的左上角和右下角坐标)
oval = canvas.create_oval(50, 50, 150, 100, fill="green")
绘制多边形
# 按顺序连接多个点 (x1,y1, x2,y2, ...)
polygon = canvas.create_polygon(200, 50, 250, 100, 150, 100, fill="yellow")
显示文字
# 在 (x,y) 处显示文字
text = canvas.create_text(200, 150, text="Hello Canvas!", font=("Arial", 14), fill="black")
显示图片
from tkinter import PhotoImage
# 加载图片(仅支持 GIF 或 PGM/PPM)
img = PhotoImage(file="example.gif")
image_item = canvas.create_image(100, 100, image=img, anchor="nw") # anchor 指定对齐方式
图形对象的操作
移动图形:实现一个图形的移动动作
canvas.move(item_id, dx, dy) # 沿 x 和 y 轴移动
修改属性
canvas.itemconfig(item_id, fill="new_color") # 更改颜色
删除图形
canvas.delete(item_id) # 删除单个图形
canvas.delete("all") # 清空整个画布
获取图形坐标
coords = canvas.coords(item_id) # 返回 [x1, y1, x2, y2, ...]
事件绑定(交互式绘图)
Canvas 支持鼠标和键盘事件,可用于构建交互式应用:
示例
def on_click(event):
x, y = event.x, event.y
canvas.create_oval(x-5, y-5, x+5, y+5, fill="red") # 在点击处画圆
canvas.bind("<Button-1>", on_click) # 绑定鼠标左键点击事件
常见事件:
<Button-1>
:鼠标左键点击。<B1-Motion>
:按住左键拖动。<ButtonRelease-1>
:左键释放。<KeyPress>
:键盘按键。
示例
简单画板程序
import tkinter as tk
def start_draw(event):
global last_x, last_y
last_x, last_y = event.x, event.y
def draw(event):
global last_x, last_y
canvas.create_line(last_x, last_y, event.x, event.y, width=2, fill="black")
last_x, last_y = event.x, event.y
root = tk.Tk()
canvas = tk.Canvas(root, width=500, height=400, bg="white")
canvas.pack()
canvas.bind("<Button-1>", start_draw)
canvas.bind("<B1-Motion>", draw)
root.mainloop()
示例
显示动态数据(如折线图)
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
# 模拟数据点
data = [50, 80, 120, 90, 180]
for i in range(len(data)-1):
canvas.create_line(i*80, 300-data[i], (i+1)*80, 300-data[i+1], fill="blue", width=2)
root.mainloop()
高级功能:
- 显示图片(需配合 PIL 显示 PNG/JPG)。
- 事件绑定实现交互(如画板、游戏)。