Python基础学习-tkinter(五)

Canvas 组件是一个通用的组件,通常用于显示和编辑图形,我们可以用它来绘制直线三角形多边形甚至是绘制其他的组件

绘制对象

在 Canvas 上绘制对象,我们可以使用 create 方法

from tkinter import *

root = Tk()

w = Canvas(root,width=200,height=100,background='white')
w.pack()
# 下面的四个数其实就是两个点,比如下面这个绘制一条线,然后根据这两个点来进行绘制,下面依次类推。
w.create_line(0,50,200,50,fill='yellow')
w.create_line(100,0,100,100,fill='red',dash=(4,4)) #dash是设置虚线
w.create_rectangle(50,25,150,75,fill='blue')

mainloop()

输出:
Python基础学习-tkinter(五)

修改对象

from tkinter import *

root = Tk()

w = Canvas(root,width=200,height=100,background='white')
w.pack()

line1 = w.create_line(0,50,200,50,fill='black')
line2 = w.create_line(100,0,100,100,fill='red',dash=(4,4))
rect1 = w.create_rectangle(50,25,150,75,fill='blue')

w.coords(line1,0,25,200,25) # 用该方法把对象移动到一个新的位置
w.itemconfig(rect1,fill='red') # 主要是设置对象的选项
w.delete(line2)
#ALL是一个tag,表示所有的对象
Button(root,text='删除全部对象',command=(lambda x=ALL:w.delete(x))).pack()
mainloop()

输出:
Python基础学习-tkinter(五)

显示文本

from tkinter import *
root = Tk()

w = Canvas(root,width=200,height=100)
w.pack()

w.create_line(0,0,200,100,fill='black',width=3)
w.create_line(200,0,0,100,fill='red',width=3)
w.create_rectangle(40,20,160,75,fill='green')
w.create_rectangle(65,35,135,65,fill='yellow')

w.create_text(100,50,text='Python')

mainloop()

输出:
Python基础学习-tkinter(五)

画圆、椭圆

from tkinter import *

root = Tk()

w = Canvas(root,width=200,height=100,background='red')
w.pack()

w.create_rectangle(40,20,160,80,dash=(4,4))
w.create_oval(40,20,160,80,fill='yellow')

w.create_text(100,50,text='Python')

mainloop()

输出:
Python基础学习-tkinter(五)

画多边形

Canvas 上画多边形可以使用 create_polygon 方法。下例是画一个五角星,首先要确定五个角的坐标:

from tkinter import *
import math as m

root = Tk()

w = Canvas(root,width=200,height=100,background='white')
w.pack()

center_x = 100
center_y = 50
r = 50

points = [
    # 左上点
    center_x - int(r * m.sin(2 * m.pi / 5)),
    center_y - int(r * m.cos(2 * m.pi / 5)),
    # 右上点
    center_x + int(r * m.sin(2 * m.pi / 5)),
    center_y - int(r * m.cos(2 * m.pi / 5)),
    # 左下角
    center_x - int(r * m.sin(m.pi / 5)),
    center_y + int(r * m.cos(m.pi / 5)),
    # 顶点
    center_x,
    center_y - r,
    # 右下点
    center_x + int(r * m.sin(m.pi / 5)),
    center_y + int(r * m.cos(m.pi / 5)),
]

w.create_polygon(points,outline='green',fill='yellow')

mainloop()

输出:
Python基础学习-tkinter(五)

画板

由于Tkinter并没有为我们提供画点的方法,这里我们换个思路通过画很小的椭圆来表示一个点。

from tkinter import *

root = Tk()

w = Canvas(root,width=400,height=200,background='white')
w.pack()

def paint(event):
    x1,y1 = (event.x-1),(event.y-1)
    x2,y2 = (event.x+1),(event.y+1)
    w.create_oval(x1,y1,x2,y2,fill='red')

# 将鼠标左键和画布进行绑定
w.bind('<B1-Motion>',paint)
Label(root,text='按住鼠标左键并移动,开始绘制。。。').pack(side=BOTTOM)

mainloop()

输出:
Python基础学习-tkinter(五)

Canvas组件支持对象

对象 意思
arc 弧形、弦或扇形
bitmap 内建的位图文件或XBM格式的文件
image BitmapImage或PhotoImage的实例对象
line 线
oval 圆或椭圆形
polygon 多边形
rectangle 矩形
text 文本

坐标系

由于画布可能比窗口大(带有滚动条的Canvas组件),因此Canvas组件可以选择使用两种坐标系:

窗口坐标系:以窗口的左上角作为坐标原点

画布坐标系:以画布的左上角作为坐标原点

画布对象显示的顺序

Canvas 组件中创建的画布对象都会被列入显示列表中,越接近背景的画布对象位于显示列表的越下方。显示列表决定当两个画布对象重叠的时候是如何覆盖的(默认情况下新创建会覆盖就的画布对象的重叠部分,即位于显示列表上方的画布对象将覆盖下面那个)。当然,显示列表中的画布对象可以被重新排序。(可以使用方法 lift() lower() tag_lower() tag_raise() 改变显示顺序)

指定画布对象

Canvas 组件提供几种方法让你指定画布对象:

Item handles
Tags
ALL
CURRENT

Item handles 事实上是一个用于指定某个画布对象的整型数字(也称为画布对象的 ID)。当你在 Canvas 组件上创建一个画布对象的时候,Tkinter 将自动为其指定一个在该 Canvas 组件中独一无二的整型值。然后各种 Canvas 的方法可以通过这个值操纵该画布对象。

Tags 是附在画布对象上的标签,Tags 由普通的非空白字符串组成。一个画布对象可以与多个 Tags 相关联,一个 Tag 也可以用于描述多个画布对象。然而,与 Text 组件不同,没有指定画布对象的 Tags 不能进行事件绑定和配置样式。也就是说,Canvas 组件的 Tags 是仅为画布对象所拥有。

Canvas 组件预定义了两个 Tags:ALL 和 CURRENT

ALL(或 “all”)表示 Canvas 组件中的所有画布对象

CURRENT(或 “current”)表示鼠标指针下的画布对象(如果有的话)