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()
输出:
修改对象
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()
输出:
显示文本
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()
输出:
画圆、椭圆
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()
输出:
画多边形
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()
输出:
画板
由于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()
输出:
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”)表示鼠标指针下的画布对象(如果有的话)