上一篇:Python —(十)Tkinter窗口组件:Text
The Tkinter Canvas Widget
##简介
Canvas(画布)组件为 Tkinter 的图形绘制提供了基础。Canvas 是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。
##何时使用 Canvas 组件?
Canvas 是一个通用的组件,通常用于显示和编辑图形。你可以用它来绘制线段、圆形、多边形,甚至是绘制其它组件。
##用法
在 Canvas 组件上绘制对象,可以用 create_xxx() 的方法(xxx 表示对象类型,例如线段 line,矩形 rectangle,文本 text 等):
先来看看这个画布张什么样子
from tkinter import *
root = Tk()
w = Canvas(root,width=200,height=100,background = "white")
w.pack()
mainloop()
(解析:首先还是先把模板写好,实例化出root根窗口,以及mianloop(),接着就可以来实例化Canvas对象了,w = Canvas(root,width=200,height=100,background = “white”),第一个参数就是这个画布放在root窗口中,第二个参数就是画布的宽度,宽度为200像素,这个单位是像素,高设置为100像素,现在用pack把它显示出来,看到的会是一个空白的画布,因为他的背景颜色跟窗口的背景颜色融为一体了,但是可以通过设置他的background来设置他的背景色白色,如上图,就可以看到了)
在 Canvas 上绘制对象,你可以使用 create_xxx() 的方法(xxx 表示对象类型,例如线段 line,矩形 rectangle,文本 text 等)
(下面是通过完成在水平方向上完成上的一半创建一条黄色的实线,在他的垂直方向上创造一条红色的虚线,在中间在绘制一个蓝色的矩形的案例来解释create_xxx() 方法的使用)
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))
w.create_rectangle(50,25,150,75,fill="blue")
mainloop()
(解析:在创建好画布对象的基础上,首先是用w.create_line(0,50,200,50,fill=“yellow”)来创建了一条水平方向上黄色的实线,想要在水平中间,因为画布的宽度是200,高度是100,所以它的
起点就是(0,50)终点是(200,50),如上图的坐标,坐标是我手动画上去的,不是实际截图,接着再用fill选项把线的颜色设置为黄色
第二条红线也是类似,同样是用create_line方法来实现,他的
起点就是(100,100,100,0),当然也可以从下画到上,这是一条线,都可以,然后再去设置fill选项为红色,最后dash选项是设置他是(4,4)的一个虚线,这个选项的值是一个元组,(4,4,)就是表示生成4个像素的短线和4个像素的间隔
最后用的是create_rectangle方法画矩形,矩形是放在正中间的,给出对角的坐标(50,25)和(150,75),在设置填充颜色为蓝色就OK 了)
关于上面的例子,大家需要注意的是:上面创建的 3 个对象(两条线,一个矩形),这些对象如果没有意外的情况,它会一直保留着,直到你去修改它们,它们就可能会被覆盖,例如这两条线,本来都是贯穿整个 Canvas 的,但是被矩形覆盖了,那么中间被覆盖的位置就看不到了。
我们可以使用 coords(),itemconfig() 和 delete() 方法对这些对象(称之为画布对象)进行修改
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="yellow")
line2 = w.create_line(100,100,100,0,fill="red",dash=(4,4))
rect1 = w.create_rectangle(50,75,150,25,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()
mainloop()
(解析:修改画布对象,首先要先把画布对象返回到一个变量中,然后可以使用三个修改方法去修改,第一个是coods()方法,可以把相应的对象移动到一个新的位置,例如这里要移动line1,第二个参数就跟着要移动到的位置就好,这里起点是(0,25),终点是(200,25),就相当于移动到了四分一处,
itemconfig(rect1,fill=“red”) 主要是设置他的选项,就是说我把这个矩形的颜色设置为红色,第一个参数就是矩形对象,第二个参数就是继续用fill修改要填充的颜色去覆盖就好了)
w.delete(line2)就是想要删除哪个对象,就直接把这个对象传进去就oK,例如说这里要把红色的虚线删除,就把line2对象传进去
同时还可以删除所有画布对象,这里加个Button按钮来演示,当点击这个按钮,就会触发lambda表达式,冒号前边是参数,后边的是返回值,这里lambda x=ALL:w.delete(x)的参数x=ALL,ALL是Canvas 组件中预定义的一个 Tags Canvas ,就是标签,代表了组件中的所有画布对象,还有一个预定义的tag就是 “current”, 表示鼠标指针下的画布对象(如果有的话,然后这里后边的表达式就是调用delete方法,把x参数传进去即可实现
还可以使用 create_text() 方法在 Canvas 上面显示文本。
from tkinter import *
root = Tk()
w = Canvas(root,width=200,height=100,background = "white")
w.pack()
w.create_line(0,0