Canvas 组件是一个通用的组件,通常用于显示和编辑图形,我们可以用它来绘制直线三角形多边形甚至是绘制其他的组件,所以说 Canvas 组件可以让我们随心所欲的绘制界面。
绘制对象
在 Canvas 上绘制对象,我们可以使用 create 方法
from tkinter import *
root = Tk()
w =Canvas(root, width=200, height=100) #width和height单位是像素
w.pack()
#到这里还是看不见Canvas的,不过可以通过设置Canvas的background属性来改变背景颜色
#create后面加上下横线再加上我们要绘制对象的名字
w.create_line(0, 50, 200, 50, fill='yellow') #前两个参数描述的是直线的起始位置是水平方向的第0个像素和竖直方向的第50像素。fill设置填充颜色
w.create_line(100, 0, 100, 100, fill='red', dash=(4, 4)) #dash是设置虚线
w.create_rectangle(50, 25, 150, 75, fill='blue') #左上角右下角的坐标
#这三个画布对象没有意外的话会一直保留着,直到你去修改它们,它们就可能会被覆盖。
#例如说这条黄线本来是从左至右贯穿整个Canvas的,但是被矩形覆盖了,中间被覆盖的位置就看不到了
#还有一些方法可以对这些画布对象进行修改,如Canvas实例对象的coords() itemconfig() move()方法,删除的话可以用delete()方法。下例将进行演示
mainloop()
修改对象
下面将演示如何修改画布对象。使用的方法在上例的注释有提及
from tkinter import *
root = Tk()
w =Canvas(root, width=200, height=100)
w.pack()
line1 = w.create_line(0, 50, 200, 50, fill='yellow')
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) #直接将对象的名字放进去就可以实现删除
Button(root, text='删除全部对象', command=(lambda x=ALL:w.delete(x))).pack()
#ALL是一个tag,表示所有的对象
mainloop()
显示文本
还可以在 Canvas 上显示文本:
from tkinter import *
root = Tk()
w =Canvas(root, width=200, height=100)
w.pack()
w.create_line(0, 0, 200, 100, fill='green', width=3) #线的宽度为3个像素
w.create_line(200, 0, 0, 100, fill='green', 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='Study') #可以修改ancoror选项使文本起始位置改变
mainloop()
画圆或椭圆
在 Canvas 上画圆形或椭圆形
from tkinter import *
root = Tk()
w =Canvas(root, width=200, height=100)
w.pack()
w.create_rectangle(40, 20, 160, 80, dash=(4, 4))
w.create_oval(40, 20, 160, 80, fill='pink') #前面四个参数表示限定矩形所在的位置
#圆形就是限定矩形为正方形
#如w.create_oval(70, 20, 130, 80, fill='pink')
w.create_text(100, 50, text='Study')
mainloop()
画多边形
Canvas 上画多边形可以使用 create_polygon 方法。下例是画一个五角星,首先要确定五个角的坐标:
from tkinter import *
import math as m
root = Tk()
w =Canvas(root, width=200, height=100)
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()