第四章、画布

1. 画布 canvas

画布(Canvas)是 Tkinter 中一个功能强大的绘图控件,它提供了一个矩形区域,允许你在上面绘制图形、文字、图像,甚至放置其他控件。

画布支持以下功能:

创建画布的构造方法:

tkinter.Canvas(master=None, width=0, height=0)

常用参数

示例:

import tkinter

root = tkinter.Tk()
canvas = tkinter.Canvas(root, width=400, height=300, bg="white")
canvas.pack()

root.mainloop()

画布支持的图形如下:

画布创建图形的方法:

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)

参数

绘制矩形

# 绘制矩形(左上角坐标 x1,y1,右下角坐标 x2,y2)
rect = canvas.create_rectangle(100, 100, 250, 200, fill="blue", outline="black")

参数:

绘制圆形/椭圆

# 绘制椭圆(边界矩形的左上角和右下角坐标)
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)  # 绑定鼠标左键点击事件

常见事件:

示例

简单画板程序

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()

高级功能: