百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

软件测试|超好用超简单的Python GUI库——tkinter(十四)

liuian 2025-06-10 16:27 7 浏览

前言

我们知道我们可以使用pillow绘制不同形状的图形,但是我们能不能使用tkinter实现这个功能呢,当然可以,tkinter也可以实现图形的绘制,并且可以将绘制的图形添加到我们的GUI中。

我们可以通过tkinter的画布控件Canvas来实现绘制功能。

Canvas画布控件

Canvas 控件具有两个功能,首先它可以用来绘制各种图形,比如弧形、线条、椭圆形、多边形和矩形等,其次 Canvas 控件还可以用来展示图片(包括位图),我们将这些绘制在画布控件上的图形,称之为“画布对象”。

通过 Canvas 控件创建一个简单的图形编辑器,让用户可以达到自定义图形的目的,就像使用画笔在画布上绘画一样,可以绘制各式各样的形状,从而有更好的人机交互体验。

注:每一个画布对象都有一个“唯一身份ID”,这是 Tkinter 自动为其创建的,从而方便控制和操作这些画布对象。

基本属性

属性

方法

background(bg)

指定 Canvas 控件的背景颜色

borderwidth(bd)

指定 Canvas 控件的边框宽度

closeenough

1. 指定一个距离,当鼠标与画布对象的距离小于该值时,认为鼠标位于画布对象上
2. 该选项是一个浮点类型的值

confine

1. 指定 Canvas 控件是否允许滚动超出 scrollregion 选项设置的滚动范围,默认值为 True

selectbackground

指定当画布对象(即在 Canvas 画布上绘制的图形)被选中时的背景色

selectborderwidth

指定当画布对象被选中时的边框宽度(选中边框)

selectforeground

指定当画布对象被选中时的前景色

state

设置 Canvas 的状态:“normal” 或 “disabled”,默认值是 “normal”,注意,该值不会影响画布对象的状态

takefocus

指定使用 Tab 键可以将焦点移动到输入框中,默认为开启,将该选项设置为 False 避免焦点在此输入框中

width

指定 Canvas 的宽度,单位为像素

xscrollcommand

与 scrollbar(滚动条)控件相关联(沿着 x 轴水平方向)

xscrollincrement

1. 该选项指定 Canvas 水平滚动的“步长”
2. 例如 ‘3c’ 表示 3 厘米,还可以选择的单位有 ‘i’(英寸),‘m’(毫米)和 ‘p’(DPI,大约是 ‘1i’ 等于 ‘72p’)
3. 默认为 0,表示可以水平滚动到任意位置

yscrollcommand

与 scrollbar 控件(滚动条)相关联(沿着 y 轴垂直方向)

yscrollincrement

1. 该选项指定 Canvas 垂直滚动的“步长”
2. 例如 ‘3c’ 表示 3 厘米,还可以选择的单位有 ‘i’(英寸),‘m’(毫米)和 ‘p’(DPI,大约是 ‘1i’ 等于 ‘72p’)
3. 默认值是 0,表示可以垂直方向滚动到任意位置

示例

import tkinter as tk

window = tk.Tk()
window.title("拜仁慕尼黑")
window.geometry('400x200')
# 创库不允许改变
window.resizable(0,0)

# 创建画布
canvas = tk.Canvas(window,
                   bg='red',
                   height=200,
                   width=300)
canvas.pack()
window.mainloop()

运行代码,生成的界面如下:

Canvas控件绘图

Cansvas 控件提供了一系列绘制几何图形的常用方法,如下表:

方法

说明

create_line(x0, y0, x1, y1, … , xn, yn, options)

1. 根据给定的坐标创建一条或者多条线段;
2. 参数 x0,y0,x1,y1,…,xn,yn 定义线条的坐标;
3. 参数 options 表示其他可选参数

create_oval(x0, y0, x1, y1, options)

1. 绘制一个圆形或椭圆形;
2. 参数 x0 与 y0 定义绘图区域的左上角坐标;参数 x1 与 y1 定义绘图区域的右下角坐标;
3. 参数 options 表示其他可选参数

create_polygon(x0, y0, x1, y1, … , xn, yn, options)

1. 绘制一个至少三个点的多边形;
2. 参数 x0、y0、x1、y1、…、xn、yn 定义多边形的坐标;
3. 参数 options 表示其他可选参数

create_rectangle(x0, y0, x1, y1, options)

1. 绘制一个矩形;
2. 参数 x0 与 y0 定义矩形的左上角坐标;参数 x 与 y1 定义矩形的右下角坐标;
3. 参数 options 表示其他可选参数

create_text(x0, y0, text, options)

1. 绘制一个文字字符串
2. 参数 x0 与 y0 定义文字字符串的左上角坐标,参数 text 定义文字字符串的文字;
3. 参数 options 表示其他可选参数

create_image(x, y, image)

1. 创建一个图片
2. 参数 x 与 y 定义图片的左上角坐标
3. 参数 image 定义图片的来源,必须是 tkinter 模块的 BitmapImage 类或 PhotoImage 类的实例变量

create_bitmap(x, y, bitmap)

1. 创建一个位图
2. 参数 x 与 y 定义位图的左上角坐标
3. 参数 bitmap 定义位图的来源,参数值可以是 gray12、gray25、gray50、gray75、hourglass、error、questhead、info、warning 或 question,或者也可以直接使用 XBM(X Bitmap)类型的文件,此时需要在 XBM 文件名称前添加一个 @ 符号,例如 bitmap=@hello.xbm

create_arc(coord, start, extent, fill)

1. 绘制一个弧形
2. 参数 coord 定义画弧形区块的左上角与右下角坐标
3. 参数 start 定义画弧形区块的起始角度(逆时针方向)
4. 参数 extent 定义画弧形区块的结束角度(逆时针方向)
5. 参数 fill 定义填充弧形区块的颜色

注:上述方法都会返回一个画布对象的唯一 ID。关于 options 参数,下面会通过一个示例对经常使用的参数做相关介绍。(但由于可选参数较多,并且每个方法中的参数作用大同小异,因此对它们不再逐一列举)

Canvas 控件采用了坐标系的方式来确定画布中的每一点。一般情况下,默认主窗口的左上角为坐标原点,这种坐标系被称作为“窗口坐标系”,但也会存在另外一种情况,即画布的大小可能大于主窗口,当发生这种情况的时,可以采用带滚动条的 Canvas 控件,此时会以画布的左上角为坐标原点,我们将这种坐标系称为“画布坐标系”。

绘制图形

我们先绘制一下简单的线条来展示一下绘制图形的功能。

from tkinter import *
root = Tk()
# 设置窗口的背景颜色以区别画布
root.config(bg='blue')
root.title("拜仁慕尼黑")
root.geometry('450x350')

# 设置画布的背景颜色为白色
cv=Canvas(root,bg="white",width =300, height = 250)
# 将控件放置在主窗口中
cv.pack()
# 设置坐标点,此处可以元组的形式来设置坐标点
point=[(10,20),(20,30),(30,40),(40,100),(80,120),(150,90)]
# 创建画布,添加线条
# fill 参数指定填充的颜色,如果为空字符串,则表示透明
# dash 参数表示用来绘制虚线轮廓,元组参数,分别代表虚线中线段的长度和线段之间的间隔
# arrow 设线段的箭头样式,默认不带箭头,参数值 first 表示添加箭头带线段开始位置,last表示到末尾占位置,both表示两端均添加
# smooth 布尔值参数,表示是否以曲线的样式划线,默认为 False
# width 控制线宽
line1=cv.create_line(point,fill="green",dash=(1,1),arrow=LAST,width=5)
print('线段line1的画布id号:',line1)
line2=cv.create_line(point,fill="red",arrow=BOTH,smooth=TRUE,width=5)
print('线段line2的画布id号:',line2)
# 移动其中一条线段,只需要更改其坐标就可以,使用 coords()方法移动曲线
cv.coords(line2,50,30,25,35,35,40,50,120,60,170,10,180)
# 显示窗口
root.mainloop()

运行程序,绘制的图像如下:

总结

本文主要介绍了tkinter的画布控件canvas的基本属性,包括绘制简单的线条,后续我们将使用Canvas控件绘制更多图形。

相关推荐

Python处理文件系统路径,pathlib库使用

pathlib是Python3.4及以后版本中的一个内置类库,它提供了一种简单而直观的方式来处理文件系统路径,同时也能够轻松地处理各种不同类型的路径。在本教程中,我们将介绍如何使用pathlib类库来...

Python目录与文件操作教程(python文件目录结构)

大家好,我是ICodeWR。今天要记录的是如何使用Python进行常见的目录和文件操作。Python提供了强大的内置模块来处理文件和目录操作。1.基本模块介绍Python中主要使用以下模块进行文件...

Python文件操作(python文件操作菜鸟教程)

文件编码编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。计算机中有许多可用编码:UTF-8、GBK、Big5等。不同的编码,将内容翻译成二进制也是不同的。编码有...

python中文件读写操作最佳实践——使用 os.path 进行路径操作

在Python中处理文件路径时,使用os.path模块比直接使用字符串拼接更加安全、可靠且跨平台。下面我将详细解释为什么以及如何使用os.path进行路径操作。为什么不应该使用字符串拼接?#不推荐的...

Python中列出目录下所有文件的方法

技术背景在Python编程中,经常需要列出目录下的所有文件,根据不同的需求,可能只需要列出当前目录下的文件,也可能需要递归列出子目录下的所有文件。Python提供了多种方法来实现这一功能,下面将详细介...

Python文件及目录处理方法(python列出目录下文件)

Python可以用于处理文本文件和二进制文件,比如创建文件、读写文件等操作。本文介绍Python处理目录以及文件的相关方法。下面先来介绍python目录处理相关方法。目录操作1.获取当前代码路径te...

Python路径操作的一些基础方法(python 程序路径)

带你走进@机器人时代Discover点击上面蓝色文字,关注我们Python自动化操作文件避开不了路径操作方法,今天我们来学习一下路径操作的一些基础。Pathlib库模块提供的路径操作包括路径的...

Python如何获取当前文件所在目录的完整路径

在编程的过程中,我们常常会遇到需要获取当前文件所在目录完整路径的需求。那具体该怎么做呢?这是在众多开发者群体中备受关注的一个问题,就像在问答平台上“/questions/3430372/how-d...

AI超助:打造第一个Python应用(6)(python ai软件)

即然已定确定时间节点,倒计时。期间还有个中秋节,便得排好了日程,这段时间得紧着点。打开pycharm就好似在用点金术。调试python,就好似用各种食材准备一道大餐。照例每天碰到疑难,照例每天遇到欣...

我在iPad上装了个IDEA,撸了个SpringBoot项目

刚开发的哥们儿都知道,系统上线后,如果有bug,领导会第一时间打电话过来,半夜也得起来改bug,随时随地改bug就是程序员的日常,这就导致很多程序下班后必须背着电脑挤地铁,随时候着,拖着疲惫的身体再扛...

用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek

作者:小鱼引言通义灵码是我一直使用的编码协助工具,我也愿称之为国内程序员的”饭搭子”。通义灵码,作为国内首个AI程序员,从最开始的内测到公测,再到通义灵码正式发布第一时间使用,再到后来使用企业定...

初识C语言:简介、环境搭建、第一个HelloWorld

一、本系列文章简介什么是C语言C语言之父C语言的由来C语言的发展为什么要学C语言/能做什么为什么要学习这套C语言本套课程适用人群本套笔记介绍二、C语言标准2.1标准简史1.1972年C语言在尔实验...

5款工具,让你轻松创建并分享优美的项目源码

作为一名开发人员,经常会遇到一些分享和展示代码的需求。例如,在博客分享知识时、请教别人编码方面问题时,都需要用到代码的展示与分享。对于我来说感受最为强烈的就是分享知识时,作为一名IT技术方面的分享者,...

风变编程-python基础语法-第17关用python发邮件

复习一下上一关的内容,模块的相关知识,以及学习模块的方法(2图)得了,我们可以开始今天的项目实操了1.明确项目目标这一关的主题,其实最早是来源于往期学员的一个问题:学员小贾是一名外贸人员,每到了节...

如何在Eclipse中配置Python开发环境?

Eclipse是著名的跨平台集成开发环境(IDE),最初主要用来Java语言开发。但是我们通过安装不同的插件Eclipse可以支持不同的计算机语言。比如说,我们可以通过安装PyDev插件,使Eclip...