PythonTkinter组件之Canvas

玩转Python

这是我参与8月更文挑战的第28天,活动详情查看: 8月更文挑战

前言

大家小时候都玩过涂鸦吧,不管在哪里,只有有画纸和彩笔,画布上就能出现想象力丰富的图案。

上学时,我们面对难题,大家都喜欢在画纸上把自己的思路画出来

如今,工作中不管是个人还是团队,在画图软件画思维导图、项目框等等,图形化更加直观

画图工具在我们日常生活中随处可见,我们最常见的有Windows系统-画图,MAC系统的备忘录,那么我们来看一下,画图工具的构造吧

我们可以看到,在画图工具中主要的作用就是在那空白的位置添加图片、画图等

本期,我们开始学习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() 删除文字图形项中间的部分文字

📢重要说明:

  1. Canvas 元素坐标是绘图的基础
  • 点 (0,0) 位于 Canvas 组件的左上角
  • X 轴水平向右延伸
  • Y 轴垂直向下延伸

4. 小试牛刀

Canvas组件实操练习效果如下:

  1. 创建Canvas组件

    self.Ca = Canvas(self, width = 450,height = 500)
    self.Ca.pack()
    复制代码
  2. 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)
    复制代码
  1. Canvas组件提供create_line()来绘制直线
  • 坐标(x1,y1,x2,y2)可以使用random.randint()来生成

    def draw_line(self):
    
        self.Ca.create_line(x1,y1,x2,y2,fill = rcolor)
    复制代码
  1. 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)
    复制代码
  1. 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))
    
    复制代码
  1. 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)
    复制代码
  1. Canvas组件可以支持绑定鼠标事件,使用鼠标进行绘制任意图形

    self.Ca.bind("<B1-Motion>",self.paint)
    复制代码
  2. 以上图形绘制的颜色是随机产生的

    • 颜色代码是以“#”开头的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
    复制代码
  3. 完整代码如下:

    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 组件可以精美的图形,增加我们程序的趣味性

以上是本期内容,欢迎大佬们点赞评论指正,下次见~ღ( ´・ᴗ・` )比心🌹🌹