杰瑞科技汇

Tkinter绘图如何实现?

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

Tkinter绘图如何实现?-图1
(图片来源网络,侵删)

核心概念:Canvas 组件

Canvas 是一个矩形区域,你可以在上面绘制图形、显示图片、创建动画等,它拥有一系列方法,如 create_line(), create_rectangle(), create_oval(), create_text() 等,用于创建各种图形元素。


基本绘图步骤

一个基本的 Tkinter 绘图程序通常包含以下三个步骤:

  1. 创建主窗口:使用 tk.Tk() 创建一个窗口对象。
  2. 创建画布:在窗口上创建一个 Canvas 组件。
  3. 在画布上绘图:调用 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 提供了丰富的绘图方法,我们来看看最常用的几种。

Tkinter绘图如何实现?-图2
(图片来源网络,侵删)

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) 定义了一个包围弧线的矩形。startextent 是关键参数:

  • 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) 坐标的列表或元组,这些点会按顺序连接起来。

Tkinter绘图如何实现?-图3
(图片来源网络,侵删)
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):将图形移动 dxdy 像素。
  • 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 编程和进行简单数据可视化的绝佳工具,从这些基本图形开始,你可以组合出各种复杂的界面和图形应用。

分享:
扫描分享到社交APP
上一篇
下一篇