GUI的终极选择:Tkinter9: Canvas(2)

上一篇:GUI的终极选择:Tkinter8:Canvas


##Canvas
   既然 Cnavas 是画布的意思,那我们能不能让这个组件设计一个画板,像Windows 自带的画图程序,我们让用户可以在上面随心所欲的绘制自己想要的图画,当然是可以的   (画图程序的实现原理其实很简单,就是获取用户拖拽鼠标时候的每一个位置,每一个坐标,然后每个坐标对应绘制出一个点就可以了,但是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()

在这里插入图片描述
(解析:定义好画布后,就先来绑定画布与鼠标左键,通过w.bind("<B1-Motion>",paint),<B1-Motion>就是表示与鼠标左键进行一个绑定,绑定一个我们自定义的paint方法,绑定事件呢,paint方法会得到一个event参数,这个event他会带着鼠标左键点击下去的坐标来调用这个paint方法,x1,y1就是小圆形外部的限定矩形左上角的位置,就是绘制这个小圆形的第一个点,第二个点x2,y2就是右下角的点,这个event.x就是当前鼠标被点下的时候这个坐标,这样就构成了一个最小的点,想要把它画出来上一章讲过就用create_oval方法—>w.create_oval(x1,y1,x2,y2,fill = “red”),这里还设置了一个醒目的颜色让我们可以看到他,最后在下面放一个Label,写上一段牛哄哄的话,然后把他放在下面,就可了

   然后关于Canvas,还有下面一些概念是需要理解的
   Canvas 组件支持对象(create_xxx)

              ❤ arc(弧形、弦或扇形 )

              ❤ bitmap(内建的位图文件或 XBM 格式的文件)

              ❤ image(BitmapImage 或 PhotoImage 的实例对象)

              ❤ line(线)

              ❤ oval(圆或椭圆形)

              ❤ polygon(多边形)

              ❤ rectangle(矩形)

              ❤ text(文本)

              ❤ window(组件)

   其中,弦、扇形、椭圆形、圆形、多边形和矩形这些“封闭式”图形都是由轮廓线(outline)和填充(fill)颜色组成的,但都可以设置为透明(传入空字符串表示透明)。

   坐标系

   Canvas 组件可以选择使用两种坐标系:

              ❤ 窗口坐标系:以窗口的左上角作为坐标原点

              ❤ 窗画布坐标系:以画布的左上角作为坐标原点

   将窗口坐标系转换为画布坐标系,可以使用 canvasx() 或 canvasy() 方法。
   (由于画布坐标系还可能比窗口大,比如带滚动条的Canvas,一个窗口就显示那么大,但带滚动条的画布可以往下拉,就是比窗口大,所以时不时要在这两种坐标系进行一个转换)

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

   画布对象显示的顺序
   (我们说过,这个画布Canvas可以添加很多个画布对象,那么这些画布对象就有一个先来后到的顺序,例如说,我画一个正方形在左上角(100,100)的位置,到(200,200)的位置,那我又画一个在(150,150)的位置到(300,300)的位置,那么他们就出现一个重叠,那么谁覆盖谁,那就涉及到画布对象显示的顺序)

   Canvas 组件中创建的画布对象都会被列入显示列表中,越接近背景的画布对象位于显示列表的越下方。显示列表决定当两个画布对象重叠的时候是如何覆盖的(默认情况下新创建的会覆盖旧的画布对象的重叠部分,即位于显示列表上方的画布对象将覆盖下方那个)。当然,显示列表中的画布对象可以被重新排序。(可以使用lower()方法将指定的画布对象移动到显示列表的底部,lift()是移动到顶部)

   指定画布对象

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

              ❤ Item handles

              ❤ Tags

              ❤ ALL 或 “all”

              ❤ CURRENT 或 “current”

   tem handles 事实上是一个用于指定某个画布对象的整型数字(也成为画布对象的 ID)。当你在 Canvas 组件上创建一个画布对象的时候,Tkinter 将自动为其指定一个在该 Canvas 组件中独一无二的整型值。然后各种 Canvas 的方法可以通过这个值操纵该画布对象。

   Tags 是附在画布对象上的标签,Tags 由普通的非空白字符串组成。一个画布对象可以与多个 Tags 相关联,一个 Tag 也可用于描述多个画布对象。然而,与 Text 组件不同,没有指定画布对象的 Tags 不能进行事件绑定和配置样式。也就是说,Canvas 组件的 Tags 是仅为画布对象所拥有。

   Canvas 组件预定义了两个 Tags:“all” 和 “current”

   “all” 表示 Canvas 组件中的所有画布对象

    “current” 表示鼠标指针下的画布对象(如果有的话)

   下面是画哆啦A梦:详细了解请到–>Python实现新型冠状哆啦A梦

from tkinter import *
root = Tk()
#实例化出画板对象
w = Canvas(root,width = 600,height = 600,background = "white")
w.pack()
#使用RGB设计浅蓝色
Light_blue ="#%02x%02x%02x" % (0, 159, 232)

#先画两条辅助线
w.create_line(0,300,600,300,dash=(4,4))
w.create_line(300,0,300,600,dash=(4,4))

#画皇冠
points2 = [220,110,200,50,240,65,300,20,360,65,400,50,380,110]
w.create_polygon(points2,outline="white",fill="yellow")
#顶部珠子直径24
w.create_oval(288,8,312,32,outline="white",fill="red")
#左边珠子直径14
w.create_oval(193,43,207,57,outline="white",fill="red")
#右边珠子直径14
w.create_oval(393,43,407,57,outline="white",fill="red")

#左边凹处
w.create_oval(238,63,242,67,outline="white",fill="yellow")
#右边凹处
w.create_oval(358,63,362,67,outline="white",fill="yellow")


#蓝色头
#w.create_rectangle(150,100,450,400,outline="black",dash=(4,4))
w.create_oval(150,100,450,400,outline="black",fill=Light_blue)

#白色大饼脸
#w.create_rectangle(175,150,425,400,outline="black",dash=(4,4))
w.create_oval(175,150,425,400,outline="black",fill="white")

#两个鸡蛋眼睛
#w.create_rectangle(250,115,300,180,outline="black",dash=(4,4))
w.create_oval(250,115,300,180,outline="black",fill="white")
#w.create_rectangle(300,115,350,180,outline="black",dash=(4,4))
w.create_oval(300,115,350,180,outline="black",fill="white")

#两个眼珠子
#w.create_rectangle(280,137,295,159,outline="black",dash=(1,1))
w.create_oval(280,137,295,159,outline = "black",fill = "black")
#w.create_rectangle(305,137,320,159,outline="black",dash=(1,1))
w.create_oval(305,137,320,159,outline="black",fill="black")

#两个眼珠子中的白光
w.create_oval
w.create_oval(285,145,290,155,fill='white')
w.create_oval(315,145,310,155,fill='white')

#红色鼻子
w.create_oval(290,170,310,190,outline="black",fill="red")

#连到鼻子上的黑线
w.create_line(300,190,300,300,fill='black',width=1)

#弧线嘴巴
#w.create_rectangle(175,50,425,300,outline="black",dash=(4,4))
w.create_arc(175,50,425,300,width=1,style="arc",start=240,extent=60)

#胡须--左边部分,从上到下
w.create_line(210,200,280,220,fill='black',width=1.5)
w.create_line(200,240,280,240,fill='black',width=1.5)
w.create_line(210,280,280,260,fill='black',width=1.5)
#胡须--右边部分
w.create_line(320,220,390,200,fill='black',width=1.5)
w.create_line(320,240,400,240,fill='black',width=1.5)
w.create_line(320,260,390,280,fill='black',width=1.5)

#蓝色身体
w.create_rectangle(190,350,410,550,fill=Light_blue,outline="black")

#白色圆腹部
#w.create_rectangle(215, 340,385,510,outline="black",dash=(4,4))
w.create_oval(215,340,385,510,outline="white",fill="white")

#红色项圈
w.create_line(188,350,412,350,fill='red',width=15,capstyle='round')

#铃铛部分,黄色
w.create_oval(285, 348,315,378,outline="black",fill="yellow")
#铃铛的黄色横线,使用的是矩形
w.create_rectangle(286,358,314,362,fill="yellow",outline="black")
#铃铛上的小红圆
w.create_oval(296, 365,304,373,outline="black",fill="red")
#竖直的黑线
w.create_line(300,373,300,378)

#白色百宝袋,扇形
#w.create_rectangle(240, 365,360,485,outline="black",dash=(4,4))
w.create_arc(240, 365,360,485,width=1,start=180,extent=180,style="pieslice",outline='black',fill='white')

#白色裤裆,也是扇形
w.create_arc(280, 530,320,570,width=1,start=0,extent=180,style="pieslice",outline='white',fill='white')

#两只白色,椭圆,小脚丫
#w.create_rectangle(170, 530,290,570,outline="black",dash=(4,4))
w.create_oval(170, 530,290,570,outline="black",fill="white")
#w.create_rectangle(310, 530,430,570,outline="black",dash=(4,4))
w.create_oval(310, 530,430,570,outline="black",fill="white")

#画手臂多边形
#手臂
points=[190,360,150,410,170,430,190,420]
w.create_polygon(points,outline="black",fill=Light_blue)
#手掌
#w.create_rectangle(130,410,170,450,outline="black",dash=(4,4))
w.create_oval(130,410,170,450, fill="white")


#右手臂
points=[410,360,450,410,430,430,410,420]
w.create_polygon(points,outline="black",fill=Light_blue)
#右手掌
#w.create_rectangle(470,410,430,450,outline="black",dash=(4,4))
w.create_oval(470,410,430,450, fill="white")

root.mainloop()

在这里插入图片描述

发布了247 篇原创文章 · 获赞 116 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/w15977858408/article/details/104181011