tkinter 19 canvas

Reference

简介

Canvas(画布)组件为 Tkinter 的图形绘制提供了基础。它提供可以用来进行绘图的Container,支持基本的几何元素,使用Canvas进行绘图时,所有的操作都是通过Canvas,不是通过它的元素, 元素的表示可以使用handle或tag。

绘制图形

Canvas 是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。简单的使用总结:

坐标系

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

将窗口坐标系转换为画布坐标系,可以使用 canvasx() 或 canvasy() 方法:

def callback(event):
    canvas = event.widget
    x = canvas.canvasx(event.x)
    y = canvas.canvasy(event.y)
    print canvas.find_closest(x, y)

指定画布对象

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

属性和方法

方法

参考小甲鱼的总结

属性

代码实例

绘制各种元素

def test1(master=None):
    w = Canvas(master, width=200, height=400, bg='grey')
    w.pack()
    # 1. 创建各种组件
    # 1.1 画线
    start = {'x': 0, 'y': 50}; end = {'x': 200, 'y': 50}
    line1 = w.create_line(start['x'], start['y'],
                          end['x'], end['y'],
                          fill='blue',
                          width=1,
                          capstyle=ROUND,
                          joinstyle=BEVEL,
                          )
    line_tmp = w.create_line(0, 0, 200, 200, fill='red')
    line2 = w.create_line(100, 0, 100, 100, fill='red', dash=(4, 4))
    # 1.2 画矩形
    rect1 = w.create_rectangle(50, 25, 150, 75,
                               fill='yellow',  # 填充色
                               outline='hotpink',  # 边框色
                               width=2,  # 线宽
                               dash=(4, 10),  # 虚线框
                               )
    # 1.3 画椭圆
    circle1 = w.create_oval((10, 75, 190, 155), fill='#287393')
    # 1.3 画圆
    circle2 = w.create_oval((0, 0, 50, 50), fill='#9370DB')

    # 1.4 画多边形
    poly1 = w.create_polygon((50, 0, 0, 50, 25, 100, 75, 100, 100, 50), fill='red')

    # 1.5 添加文字
    txt = w.create_text((90, 110), text="Hello World")
    w.select_from(txt, 6)
    w.select_to(txt, 10)

    # 1.6 画弧线
    arc1 = w.create_arc((50,10,110,110),
                        fill='darkblue',
                        extent=30,
                        start=90,
                        outline='red')

    # 2. 创建的画布对象会一直存在,通过一下四个方法修改
    w.coords(line1, 0, 25, 200, 25)  # 用coords方法把对象移动到一个新的位置
    w.itemconfig(rect1, fill='green')  # 用itemconfig设置对象的选项
    w.move(circle2, 75, 25)  # 使用move方法移动该画布对象
    w.move(poly1, 50, 155)
    w.move(arc1, -50, 150)
    w.delete(line_tmp)  # 直接将对象的名字放进去就可以实现删除

    # ALL是一个tag,表示所有的对象
    # Button(master, text='删除全部对象', command=(lambda: w.delete(ALL))).pack()
    Button(master, text='删除全部对象', command=(lambda x=ALL: w.delete(x))).pack()

    # 3. 绑定对象,鼠标在画布上画画
    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)

综合-绘制小叮当

Table of Contents