这是我参与8月更文挑战的第28天,活动详情查看: 8月更文挑战
前言
大家小时候都玩过涂鸦吧,不管在哪里,只有有画纸和彩笔,画布上就能出现想象力丰富的图案。
上学时,我们面对难题,大家都喜欢在画纸上把自己的思路画出来
如今,工作中不管是个人还是团队,在画图软件画思维导图、项目框等等,图形化更加直观
画图工具在我们日常生活中随处可见,我们最常见的有Windows系统-画图,MAC系统的备忘录,那么我们来看一下,画图工具的构造吧
-
标题、每一栏描述语及形状等都是Label标签组件
-
空白面积最大的是Canvas画布组件
-
查看->显示状态是CheckbuttonF复选框组件
-
最后我们要退出或者小化放大窗口按钮是Button组件
我们可以看到,在画图工具中主要的作用就是在那空白的位置添加图片、画图等
本期,我们开始学习Python Tkinter标准组件Canvas画布相关属性和方法,Let's go~
1. Canvas概述
Canvas(画布)是Python Tkinter标准组件,可放置图形、图相、组件等功能
Canvas特点
- Canvas画布是一个矩形区域用来绘制
- Canvas画布可以添加线性、圆形、图片
- Canvas画布支持添加的组件位置、外观
- Canvas画布也提供Button、Label其他组件
Canvas语法格式
Ca = Canvas(mater,options)
复制代码
2. Canvas相关属性
属性 | 含义 |
---|---|
anchor | 指定绘制文字、GUI 组件的位置。该选项仅对 create_text()、create_window() 方法有效 |
joinstyle | 指定直接连接点的风格。仅对绘制直线和多向形有效。该选项支持 METTER、ROUND、BEVEL 选项值。 |
justify | 指定文字的对齐方式。该选项支持 CENTER、LEFT、RIGHT 常量值,该选项仅对 create_text 方法有效。 |
arrowshape | 指定箭头形状。该选项是一个形如 "20 20 10" 的字符串,字符串中的三个整数依次指定填充长度、箭头长度、箭头宽度。 |
arrow | 指定绘制直线时两端是否有箭头。该选项支持 NONE(两端无箭头)、FIRST(开始端有箭头)、LAST(结束端有箭头)、BOTH(两端都有箭头)选项值。 |
extent | 指定绘制弧的角度。该选项仅对 create_arc 方法起作用。 |
start | 指定绘制弧的起始角度。该选项仅对 create_arc 方法起作用。 |
style | 指定绘制弧的样式。该选项仅对 create_arc 方法起作用。该选项支持 PIESLICE(扇形)、CHORD(弓形)、ARC(仅绘制弧)选项值。 |
stipple | 使用位图平铺进行填充。该选项可与 fill 选项结合使用,fill 选项用于指定位图的颜色。 |
dash | 指定边框使用虚线。该属性值既可为单独的整数,用于指定虚线中线段的长度;也可为形如(5,2,3)格式的元素,此时5 指定虚线中线段的长度,2 指定间隔长度,3 指定虚线长度……依此类推。 |
width | 指定边框宽度。如果不指定该选项,边框宽度默认为 1 |
outline | 指定边框颜色。 |
fill | 指定填充颜色。如果不指定该选项,默认不填充。 |
3. Canvas常用方法
Canvas画布提供绘制图形方法
方法 | 作用 |
---|---|
create_rectangle() | 绘制矩形 |
create_oval() | 绘制椭圆(包括圆,圆是椭圆的特例) |
create_arc | 绘制弧 |
create_bitmap | 绘制位图 |
create_image | 绘制图片 |
create_line() | 绘制直线 |
create_polygon | 绘制多边形 |
create_text | 绘制文字 |
create_window | 绘制组件 |
Canvas画布提供操作图形标签方法
方法 | 作用 |
---|---|
addtag_aboove() | 为 tagOrId 对应图形项的上一个图形项添加新 tag |
addtag_all() | 为所有图形项添加新 tag |
addtag_below() | 为 tagOrId 对应图形项的下一个图形项添加新 tag |
addtag_closest() | 为和 x、y 点最接近的图形项添加新 tag |
addtag_enclosed() | 为指定矩形区域内最上面的图形项添加新tag |
dtag() | 删除指定图形项的tag |
gettags() | 获取指定图形的所有Tag |
find_withtag() | 获取tagOrId 对应的所有图形项 |
find_above() | 返回 tagOrId 对应图形项的上一个图形项 |
find_all() | 返回全部图形项 |
find_below() | 返回 tagOrId 对应图形项的下一个图形项 |
find_closest() | 返回和 x 、y 点最接近的图形项 |
find_enclosed() | 返回位于指定矩形区域内最上面的图形项 |
find_overlapping() | 返回与指定矩形区域重叠的最上面的图形项 |
find_withtag() | 返回 tagOrId 对应的全部图形项 |
Canvas画布提供操作图形方法
方法 | 作用 |
---|---|
coords() | 重设图形项的大小和位置 |
itemconfig() | 为tagOrId 对应图形项配置选项 |
move() | 移动画布上组件 |
delete() | 删除画布上组件 |
scale() | 缩放图形项 |
dchars() | 删除文字图形项中间的部分文字 |
📢重要说明:
- Canvas 元素坐标是绘图的基础
- 点 (0,0) 位于 Canvas 组件的左上角
- X 轴水平向右延伸
- Y 轴垂直向下延伸
4. 小试牛刀
Canvas组件实操练习效果如下:
-
创建Canvas组件
self.Ca = Canvas(self, width = 450,height = 500) self.Ca.pack() 复制代码
-
Canvas组件提供create_polygon创建多边形图形
-
坐标(x1,y1,x2,y2,x3,y3)可以使用random.randint()来生成
-
可以多边绘制三角形
def draw_pol(self): self.Ca.create_polygon((1*x1,y1*10,x2*1,y2*18,x3*10,y3*18),fill = rcolor) 复制代码
- Canvas组件提供create_line()来绘制直线
-
坐标(x1,y1,x2,y2)可以使用random.randint()来生成
def draw_line(self): self.Ca.create_line(x1,y1,x2,y2,fill = rcolor) 复制代码
- Canvas组件提供create_oval()来绘制椭圆形
- 坐标(x1,y1,x2,y2)可以使用random.randint()来生成
- 椭圆坐标之间是有一定关系的
def draw_oval(self): self.Ca.create_oval(x1,y1/2,x2*4,y2*4,fill = rcolor) 复制代码
- Canvas组件提供create_rectangle()来绘制矩形
- 坐标(x1,y1,x2,y2)可以使用random.randint()来生成
- 可以使用属性来设置矩形的外观,比如dash属性矩形线条是虚线
def draw_rect(self): self.Ca.create_rectangle(x1,y1,x2,y2,fill = rcolor,dash = (4,4)) 复制代码
- Canvas组件提供create_image()来添加图片
-
坐标(x1,y1)可以使用random.randint()来生成
-
要设置全局边Photo 否则图片无法显示
def draw_image(self): x1 = random.randint(1, 100) y1 = random.randint(1, 100) global Photo Photo = PhotoImage(file = "heart.gif") self.Ca.create_image(x1,y1,image = Photo) 复制代码
-
Canvas组件可以支持绑定鼠标事件,使用鼠标进行绘制任意图形
self.Ca.bind("<B1-Motion>",self.paint) 复制代码
-
以上图形绘制的颜色是随机产生的
- 颜色代码是以“#”开头的6位16进制代码
- 使用for循环进行random.randint()来随机产生每一位的代码
def randomcolor(self): colorlist = ["1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"] color = "" for i in range(6): color += colorlist[random.randint(0,14)] return '#'+color 复制代码
-
完整代码如下:
from tkinter import * import random import tkinter class Application(Frame): def __init__(self,master=None): # super()代表的是父类的定义,而不是父类对象 super().__init__(master) self.master = master self.pack() self.createWidgetCanvas() def createWidgetCanvas(self): self.Ca = Canvas(self, width = 450,height = 500) self.Ca.pack() self.Ca.bind("<B1-Motion>",self.paint) Button(self,text = "清空画布",width = 10,command = (lambda x = "all":self.Ca.delete(x))).pack(side = "left") Button (self,text = "画三角形",width = 10,command = self.draw_pol).pack(side = "left") Button(self,text = "画椭圆",width = 10,command = self.draw_oval).pack(side = "left") Button(self,text = "画直线",width = 10,command = self.draw_line).pack(side = "left") Button(self, text="画矩形", width=10,command = self.draw_rect).pack(side="left") Button(self, text="添加图片", width=10, command=self.draw_image).pack(side="left") def draw_line(self): x1 = random.randint(0,500) y1 = random.randint(0,500) x2 = random.randint(0,500) y2 = random.randint(0,500) rcolor = self.randomcolor() self.Ca.create_line(x1,y1,x2,y2,fill = rcolor) def draw_oval(self): x1 = random.randint(0,100) y1 = random.randint(0,100) x2 = random.randint(0,100) y2 = random.randint(0,100) rcolor = self.randomcolor() self.Ca.create_oval(x1,y1/2,x2*4,y2*4,fill = rcolor) def draw_rect(self): x1 = random.randint(5,500) y1 = random.randint(5,500) x2 = random.randint(5,500) y2 = random.randint(5,500) rcolor = self.randomcolor() self.Ca.create_rectangle(x1,y1,x2,y2,fill = rcolor,dash = (4,4)) def draw_pol(self): x1 = random.randint(1,100) y1 = random.randint(1,40) x2 = random.randint(1,100) y2 = random.randint(1,30) x3 = random.randint(1,40) y3 = random.randint(1,30) rcolor = self.randomcolor() self.Ca.create_polygon((1*x1,y1*10,x2*1,y2*18,x3*10,y3*18),fill = rcolor) def draw_image(self): x1 = random.randint(1, 100) y1 = random.randint(1, 100) global Photo Photo = PhotoImage(file = "heart.gif") self.Ca.create_image(x1,y1,image = Photo) def paint(self,event): x1,y1 = (event.x-1),(event.y-1) x2, y2 = (event.x+1), (event.y+1) self.Ca.create_oval(x1,y1,x2,y2,fill = "pink") def randomcolor(self): colorlist = ["1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"] color = "" for i in range(6): color += colorlist[random.randint(0,14)] return '#'+color root = Tk() root.geometry("300x130+200+300") root.title("MyfirstAPP") app = Application(master=root) root.mainloop() 复制代码
总结
本期,我们学习 Python Tkinter 提供一个非常强大好玩的Canvas组件
我们使用Canvas 组件可以精美的图形,增加我们程序的趣味性
以上是本期内容,欢迎大佬们点赞评论指正,下次见~ღ( ´・ᴗ・` )比心🌹🌹
近期评论