Tkinter 提供了几个核心组件用于绘图,最常用的是 Canvas(画布)组件,它就像一块可以自由绘制各种图形的“画布”。

核心概念:Canvas 组件
Canvas 是一个矩形区域,你可以在上面绘制图形、显示图片、创建动画等,它拥有一系列方法,如 create_line(), create_rectangle(), create_oval(), create_text() 等,用于创建各种图形元素。
基本绘图步骤
一个基本的 Tkinter 绘图程序通常包含以下三个步骤:
- 创建主窗口:使用
tk.Tk()创建一个窗口对象。 - 创建画布:在窗口上创建一个
Canvas组件。 - 在画布上绘图:调用
Canvas的各种create_*方法来绘制图形。
示例:绘制一条线
import tkinter as tk
# 1. 创建主窗口
root = tk.Tk()"我的第一个 Tkinter 绘图")
root.geometry("400x300") # 设置窗口大小
# 2. 创建画布
# width 和 height 指定画布大小
# bg 指定背景颜色
canvas = tk.Canvas(root, width=400, height=300, bg="white")
# 将画布“打包”到窗口中,让它显示出来
canvas.pack()
# 3. 在画布上绘图
# create_line(x1, y1, x2, y2, options...)
# (x1, y1) 是起点坐标, (x2, y2) 是终点坐标
# fill 设置线条颜色
# width 设置线条宽度
line = canvas.create_line(10, 10, 380, 280, fill="blue", width=3)
# 启动主事件循环,让窗口一直显示,直到用户关闭
root.mainloop()
运行结果:会弹出一个 400x300 像素的白色窗口,上面有一条从左上角到右下角的蓝色直线。
绘制基本图形
Canvas 提供了丰富的绘图方法,我们来看看最常用的几种。

a) 绘制矩形
create_rectangle(x1, y1, x2, y2, options...)
(x1, y1) 是矩形左上角的坐标,(x2, y2) 是矩形右下角的坐标。
import tkinter as tk root = tk.Tk()"绘制矩形") canvas = tk.Canvas(root, width=400, height=300, bg="lightgray") canvas.pack() # 绘制一个填充的红色矩形 # fill 设置填充颜色 # outline 设置边框颜色 # width 设置边框宽度 canvas.create_rectangle(50, 50, 200, 150, fill="red", outline="darkred", width=2) # 绘制一个蓝色的空心矩形 canvas.create_rectangle(220, 50, 370, 150, fill="", outline="blue", width=3) root.mainloop()
b) 绘制圆形或椭圆
create_oval(x1, y1, x2, y2, options...)
(x1, y1) 和 (x2, y2) 定义了一个包围椭圆的矩形,如果这个矩形是正方形,画出来的就是圆形。
import tkinter as tk root = tk.Tk()"绘制圆形和椭圆") canvas = tk.Canvas(root, width=400, height=300, bg="white") canvas.pack() # 绘制一个填充的绿色圆形 canvas.create_oval(50, 50, 150, 150, fill="green", outline="darkgreen") # 绘制一个黄色的椭圆 canvas.create_oval(200, 80, 350, 180, fill="yellow", outline="orange", width=2) root.mainloop()
c) 绘制弧线
create_arc(x1, y1, x2, y2, options...)
同样,(x1, y1) 和 (x2, y2) 定义了一个包围弧线的矩形。start 和 extent 是关键参数:
start:起始角度,单位是度,从 3点钟方向开始,逆时针计算。extent:弧线跨度(角度)。style:样式,可以是tk.ARC(仅弧线)、tk.CHORD(弦,连接起点和终点)、tk.PIESLICE(扇形,默认)。
import tkinter as tk root = tk.Tk()"绘制弧线") canvas = tk.Canvas(root, width=400, height=300, bg="white") canvas.pack() # 绘制一个90度的扇形 canvas.create_arc(50, 50, 150, 150, start=0, extent=90, fill="cyan", outline="blue") # 绘制一个弦 canvas.create_arc(200, 50, 300, 150, start=45, extent=180, fill="", outline="red", width=3, style=tk.CHORD) root.mainloop()
d) 绘制多边形
create_polygon(coordinates, options...)
coordinates 是一个包含多个 (x, y) 坐标的列表或元组,这些点会按顺序连接起来。

import tkinter as tk root = tk.Tk()"绘制多边形") canvas = tk.Canvas(root, width=400, height=300, bg="white") canvas.pack() # 定义三角形的三个顶点 points = [100, 50, 50, 150, 150, 150] canvas.create_polygon(points, fill="purple", outline="black") # 定义一个五角星的点(简化版) star_points = [200, 50, 220, 100, 270, 100, 235, 130, 250, 180, 200, 150, 150, 180, 165, 130, 130, 100, 180, 100] canvas.create_polygon(star_points, fill="gold", outline="orange") root.mainloop()
e) 绘制文本
create_text(x, y, text="...", options...)
(x, y) 是文本的锚点位置,可以通过 anchor 参数调整文本相对于该点的位置(如 tk.W 左对齐, tk.CENTER 居中, tk.E 右对齐)。
import tkinter as tk
root = tk.Tk()"绘制文本")
canvas = tk.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
# 在坐标 (200, 150) 处绘制文本,文本居中
canvas.create_text(200, 150, text="Hello, Tkinter!", font=("Arial", 24, "bold"), fill="navy")
# 在坐标 (100, 50) 处绘制左对齐的文本
canvas.create_text(100, 50, text="Left-aligned text", anchor=tk.W, font=("Times New Roman", 12), fill="gray")
root.mainloop()
图形对象与坐标系统
- 返回值:所有
create_*方法都会返回一个代表该图形对象的整数 ID,你可以用这个 ID 来后续操作这个图形(如修改、移动、删除)。 - 坐标系统:
Canvas的坐标原点(0, 0)位于左上角,X 轴向右增加,Y 轴向下增加。
高级操作:修改和管理图形对象
既然每个图形都有一个 ID,我们就可以用它来对图形进行动态修改。
示例:移动和修改图形
import tkinter as tk
root = tk.Tk()"动态修改图形")
canvas = tk.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
# 创建一个矩形,并保存其ID
rect_id = canvas.create_rectangle(50, 50, 150, 150, fill="lightblue")
# 创建一个圆形
oval_id = canvas.create_oval(200, 100, 300, 200, fill="salmon")
def move_rectangle():
"""移动矩形"""
# coords() 方法获取图形的当前坐标
coords = canvas.coords(rect_id)
# move() 方法移动图形
canvas.move(rect_id, 10, 10)
# 如果移出画布,让它从左边回来
if coords[2] > 400: # coords[2] 是矩形的右边界
canvas.move(rect_id, -400, 0)
def change_color():
"""改变圆形的颜色"""
# itemconfig() 方法修改图形的配置
current_color = canvas.itemcget(oval_id, "fill")
if current_color == "salmon":
canvas.itemconfig(oval_id, fill="lightgreen")
else:
canvas.itemconfig(oval_id, fill="salmon")
def delete_shape():
"""删除矩形"""
canvas.delete(rect_id)
# 创建按钮来触发函数
btn_move = tk.Button(root, text="移动矩形", command=move_rectangle)
btn_move.pack(side=tk.LEFT, padx=5, pady=5)
btn_color = tk.Button(root, text="变色圆形", command=change_color)
btn_color.pack(side=tk.LEFT, padx=5, pady=5)
btn_delete = tk.Button(root, text="删除矩形", command=delete_shape)
btn_delete.pack(side=tk.LEFT, padx=5, pady=5)
root.mainloop()
常用操作方法:
canvas.coords(item_id, x1, y1, x2, y2):修改或获取图形坐标。canvas.itemconfig(item_id, option=value, ...):修改图形的属性(如fill,outline,width)。canvas.itemcget(item_id, option):获取图形的某个属性值。canvas.move(item_id, dx, dy):将图形移动dx和dy像素。canvas.delete(item_id):删除指定的图形。canvas.delete("all"):删除画布上的所有图形。
完整示例:绘制一个简单的笑脸
这个例子综合运用了前面讲的知识。
import tkinter as tk
# 创建主窗口
root = tk.Tk()"笑脸")
canvas = tk.Canvas(root, width=400, height=400, bg="lightblue")
canvas.pack()
# 1. 画脸(一个黄色的圆形)
face = canvas.create_oval(75, 75, 325, 325, fill="yellow", outline="orange", width=5)
# 2. 画左眼(一个黑色的圆形)
left_eye = canvas.create_oval(150, 150, 190, 190, fill="black")
# 3. 画右眼
right_eye = canvas.create_oval(210, 150, 250, 190, fill="black")
# 4. 画嘴巴(一个弧线,做成微笑的样子)
# 起始角度 0,逆时针画 180 度,形成下半圆的微笑
mouth = canvas.create_arc(150, 200, 250, 280, start=0, extent=180, fill="", outline="black", width=3, style=tk.ARC)
# 5. 添加文字
canvas.create_text(200, 350, text="这是一个笑脸!", font=("楷体", 20), fill="darkblue")
# 启动主循环
root.mainloop()
| 任务 | 方法 | 关键参数 |
|---|---|---|
| 创建画布 | tk.Canvas(parent, width, height, bg) |
width, height, bg (背景色) |
| 画线 | create_line(x1, y1, x2, y2, ...) |
fill (颜色), width (宽度) |
| 画矩形 | create_rectangle(x1, y1, x2, y2, ...) |
fill (填充色), outline (边框色), width |
| 画圆/椭圆 | create_oval(x1, y1, x2, y2, ...) |
fill, outline, width |
| 画弧线 | create_arc(x1, y1, x2, y2, ...) |
start (起始角), extent (跨度), style, fill, outline |
| 画多边形 | create_polygon(points, ...) |
points (坐标列表), fill, outline |
| 画文本 | create_text(x, y, text=..., ...) |
text, font, fill, anchor (对齐) |
| 获取图形ID | canvas.create_...() |
方法会返回一个整数ID |
| 修改图形 | canvas.itemconfig(id, ...) |
fill, outline 等 |
| 移动图形 | canvas.move(id, dx, dy) |
dx, dy (移动的像素) |
| 删除图形 | canvas.delete(id) |
id 是要删除的图形ID |
Tkinter 绘图功能非常强大,是学习 GUI 编程和进行简单数据可视化的绝佳工具,从这些基本图形开始,你可以组合出各种复杂的界面和图形应用。
