9.7.1 canvas

canvas是一个可绘制图形的控件,它允许您使用各种形状,线条和颜色在应用程序中绘制图形。 您可以在canvas上绘制椭圆、矩形、多边形和文本等形状。您还可以使用canvas创建动画和交互式图形,例如可点击的按钮和地图。 Canvas是Tkinter中最常用的图形组件之一,它提供了一种快速和易于使用的方法为您的应用程序或游戏添加图形元素。您可以利用它轻松地创建鼠标交互性和动画效果,以增强用户体验。
下面是画一个矩形和圆形的例子:
import tkinter as tk
#创建一个窗口对象
root = tk.Tk()
#创建一个Canvas对象
canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()
#在Canvas中绘制一个矩形
rect = canvas.create_rectangle(50, 50, 150, 150, fill='red')
#在Canvas中绘制一个圆形
circle = canvas.create_oval(200, 200, 300, 300, fill='blue')
#进入消息循环
root.mainloop()
create_rectangle和create_oval的前四个参数是
- 图形左上角的x坐标
- 图形左上角的y坐标
- 图形右下角的x坐标
- 图形右下角的y坐标
以下是canvas常用的函数在需要的时候可供查看:

方法名说明示例
create_rectangle()在画布上创建一个矩形canvas.create_rectangle(10,10,50,50,fill="red")
create_oval()在画布上创建一个椭圆canvas.create_oval(10,10,50,50,fill="blue")
create_line()在画布上创建一条直线canvas.create_line(0,0,100,100,fill="green")
create_text()在画布上创建一段文本canvas.create_text(50,50,text="Hello, World!",font=("Arial",12))
delete()删除画布上指定的元素canvas.delete(rectangle)
itemconfig()配置画布上指定元素的属性canvas.itemconfig(rectangle,fill="yellow")
itemcget()获取画布上指定元素的属性值canvas.itemcget(rectangle,"fill")
coords() 获取或设置画布上指定元素的坐标 canvas.coords(rectangle, 20, 20, 60, 60)
itemtype() 获取画布上指定元素的类型 canvas.itemtype(rectangle)
move() 移动画布上指定元素 canvas.move(rectangle, 10, 10)
scale() 缩放画布上指定元素 canvas.scale(rectangle, 0.5, 0.5)
itemconfigure() 配置画布上所有指定标签的元素的通用属性 canvas.itemconfigure("all", fill="gray")
lift() 把画布上指定元素置于前面 canvas.lift(rectangle)
lower() 把画布上指定元素置于后面 canvas.lower(rectangle)
find_withtag(str)根据tag值查找画布内的元素id,可能返回一个整数类型的元组,tag相当于标签,不痛元素可以用同类标签
button_id = canvas.find_withtag("button")[0]
tag_bind('tagId',type,function)把事件绑定到某个元素上,type是事件类型,function是要绑定的函数名
canvas.tag_bind('image', '<Button-3>', right_click2)
tag_unbind解除事件绑定canvas.tag_unbind(button_id, '<Button-3>')
create_image在画布上创建一个图像image = Image.open("flag.png")
resized_image = image.resize((29, 29))
photo = ImageTk.PhotoImage(resized_image)
img = canvas.create_image(x, y, anchor="nw", image=photo)  # nw表示x和y是左上角坐标,photo对象见上面的代码
canvas.itemconfigure(img, tags='image')