Super cool! Use Python to teach you to draw Pikachu and Doraemon

If you think the article is well written, if you want the data in the blog article, please pay attention to the official account : [ Mr. Z's note ], 50+ Python e-books and 200G + high-quality video materials have been prepared for you, and the background reply keywords : 1024 can be obtained; add the author [personal WeChat] to communicate directly with the author,

Snipaste_2020-08-01_22-21-10.png

This article uses Python to draw two cartoon characters, and takes you to familiarize yourself with some usages of the drawing package turtle. Let’s take a look at the final Pikachu drawing effect.

[External link image transfer failed. The source site may have an anti-leech link mechanism. It is recommended to save the image and upload it directly (img-junBrZPX-1600647820051)(C:\Users\13479\Desktop\007wRTdIly1ghbodveyn2g30zk0k0q9x.gif)]

Please make sure that Turtle has been installed successfully before use. When installing Turtle for the first time, the pip installation package is used, but the following error will always appear.

After consulting the information, a feasible solution was found:

Snipaste_2020-07-30_16-51-58.png

  • 1. Download the turtle package from the Internet, the download link is: https://files.pythonhosted.org/packages/ff/f0/21a42e9e424d24bdd0e509d5ed3c7dfb8f47d962d9c044dba903b0b4a26f/turtle-0.0.2.tar.gz

  • 2. Unzip the compressed package in 1, modify the setup.py script: modify the ValueError, ve at line 40 ;

    Snipaste_2020-08-01_18-06-57.png

    except ValueError, ve:
    

    To

    except (ValueError, ve):
    
  • 3. Use the pip command to install the local download file

    pip install C:\Users\XXX\Desktop\turtle-0.0.2
    

2. Introduction to turtle command

Turtle has a feature when drawing. The number of lines of code looks relatively large, but what is used is the command operation, which is used back and forth; here I list several commonly used commands of turtle in advance, and briefly introduce its usage next to it, which is convenient Everyone's learning:

Func (function) Para type (parameter type) Desc (description)
turtle.screensize(a,b,bg) int;int;colorstring /tuple Create a canvas of a*b size, bg is the background color, and is a tuple of r, g, b;
turtle.title(name) string The name of the canvas window is set to name
turtle.mainloop () -(Means no parameters) Start the event loop, this statement must be placed in the last sentence when used
turtle.Turtle() - The subclass of RawTurtle() is the object of the brush, l to set related attributes of the brush
turtle.Turtle().tracer(bool) bool bool = False, which means to call before drawing; bool=True means to call after drawing
turtle.Turtle().pensize(size) int Set the brush size to size;
turtle.Turtle().seth(to_angle)
/turtle.Turtle().sething(to_angle)
float/int Turtle direction angle is set to to_angle
turtle.Turtle().setx(x) int/float Set the abscissa x of turtle, y remains unchanged
turtle.Turtle().sety(y) int/float Set the ordinate y of the turtle, x remains unchanged
turtle.Turtle().forward(distance)
turtle.Turtle().fd(distance)
int/float The pen moves forward by distance units in the original direction
turtle.Turtle().backward(distance)
turtle.Turtle().bk(distance)
turtle.Turtle().back(distance)
int/float The pen moves backward by distance units in the original direction
turtle.Turtle().left(distance)
turtle.Turtle().lt(distance)
int/float The pen moves to the left by distance units in the original direction
turtle.Turtle().right(distance)
turtle.Turtle().rt(distance)
int/float The pen moves distance units to the right in the original direction
turtle.Turtle().goto(x,y) float/int,float/int The pen jumps to the specified coordinate position (x, y)
turtle.Turtle().circle(radius,extends) int/float,int/float/None Draw a circle with a specified radius. The center of the circle is determined according to the radius, the direction of the pen, and the angle of the drawing circle; extends is the drawing angle (less than 360 means drawing a part of the arc), and extends is a positive value and the drawing direction is counterclockwise. Otherwise clockwise;
turtle.Turtle().speed(num) int/float Set the brush drawing speed to num
turtle.Turtle().penup()
turtle.Turtle().up()
- Raise the pen and stop drawing
turtle.Turtle().pendown()
turtle.Turtle().down()
- Put down the pen and start drawing
turtle.Turtle().fillcolor(color) string/tuple/colorname Set the pen fill color color, the input format supports four types: color code string ('#000000'), rgb tuple ((r,g,b)), tk specified color string ("red")
turtle.Turtle().begin_fill() - After calling, start to fill the drawn shape with color
turtle.Turtle().end_fill() - Stop filling color after calling

Note : Newline in func means or. Each function name has its abbreviation, so there are 2-3 different ways of writing functions, but the function is the same,-means no parameters;

… There are a lot of turtle related methods and classes. The ones listed here are only some of the commonly used ones. If you are interested, you can take a closer look at the official website documentation. The link is: https://docs.python.org/3.7/library/turtle. html?highlight=screensize#turtle.seth

3. Draw Pikachu

Recording_2020_08_01_22_15_39_710.gif

Code part

'''
绘制皮卡丘
'''

import turtle

def getPosition(x,y):
    turtle.setx(x)
    turtle.sety(y)
    print(x,y)

class Pikachu:
    def __init__(self):
         self.t = turtle.Turtle()
         t = self.t
         t.pensize(3) # 画笔大小
         t.speed(9) #画笔速度
         t.ondrag(getPosition)



    def onTrace_goto(self,x,y):
        self.t.penup()
        self.t.goto(x,y)
        self.t.pendown()

    def leftEye(self,x,y):
        self.onTrace_goto(x,y)
        t = self.t
        t.seth(0)
        t.fillcolor('#333333')
        t.begin_fill()
        t.circle(22)
        t.end_fill()

        self.onTrace_goto(x,y+10)
        t.fillcolor('#000000')
        t.begin_fill()
        t.circle(10)
        t.end_fill()

        self.onTrace_goto(x+6,y+22)
        t.fillcolor('#ffffff')
        t.begin_fill()
        t.circle(10)
        t.end_fill()

    def rightEye(self,x,y):
        self.onTrace_goto(x,y)
        t = self.t
        t.seth(0)
        t.fillcolor('#333333')
        t.begin_fill()
        t.circle(22)
        t.end_fill()

        self.onTrace_goto(x,y+10)
        t.fillcolor('#000000')
        t.begin_fill()
        t.circle(10)
        t.end_fill()

        self.onTrace_goto(x-6,y+22)
        t.fillcolor('#ffffff')
        t.begin_fill()
        t.circle(10)
        t.end_fill()


    def mouth(self,x,y):
        self.onTrace_goto(x,y)
        t = self.t
        t.fillcolor('#88141D')
        t.begin_fill()
        # 下嘴唇
        l1 = []
        l2 = []
        t.seth(190)
        a = 0.7
        for i in range(28):
            a +=0.1
            t.right(3)
            t.fd(a)
            l1.append(t.position())

        self.onTrace_goto(x,y)
        t.seth(10)
        a = 0.7
        for i in range(28):
            a +=0.1
            t.left(3)
            t.fd(a)
            l2.append(t.position())


        #上嘴唇

        t.seth(10)
        t.circle(50,15)
        t.left(180)
        t.circle(-50,15)

        t.circle(-50,40)
        t.seth(233)
        t.circle(-50,55)
        t.left(180)
        t.circle(50,12.1)
        t.end_fill()


        # 舌头
        self.onTrace_goto(17,54)
        t.fillcolor('#DD716F')
        t.begin_fill()
        t.seth(145)
        t.circle(40,86)
        t.penup()
        for pos in reversed(l1[:20]):
            t.goto(pos[0],pos[1]+1.5)
        for pos in l2[:20]:
            t.goto(pos[0],pos[1]+1.5)
        t.pendown()
        t.end_fill()

        # 鼻子
        self.onTrace_goto(-17,94)
        t.seth(8)
        t.fd(4)
        t.back(8)


    # 红脸颊

    def leftCheck(self,x,y):
        turtle.tracer(False)
        t = self.t
        self.onTrace_goto(x,y)
        t.seth(60)
        t.fillcolor('#DD4D28')
        t.begin_fill()
        a = 2.3
        for i in range(120):
            if 0 <= i <30 or 60 <= i <90:
                a -= 0.05
                t.lt(3)
                t.fd(a)
            else:
                a += 0.05
                t.lt(3)
                t.fd(a)
        t.end_fill()
        turtle.tracer(True)

    def rightCheck(self,x,y):
        t = self.t
        turtle.tracer(False)
        self.onTrace_goto(x,y)
        t.seth(60)
        t.fillcolor('#DD4D28')
        t.begin_fill()
        a = 2.3
        for i in range(120):
            if 0<= i<30 or 60 <= i< 90:
                a -= 0.05
                t.lt(3)
                t.fd(a)
            else:
                a += 0.05
                t.lt(3)
                t.fd(a)

        t.end_fill()
        turtle.tracer(True)




    def colorLeftEar(self,x,y):
        t = self.t
        self.onTrace_goto(x,y)
        t.fillcolor('#000000')
        t.begin_fill()
        t.seth(330)
        t.circle(100,35)
        t.seth(219)
        t.circle(-300,19)
        t.seth(110)
        t.circle(-30,50)
        t.circle(-300,10)
        t.end_fill()

    def colorRightEar(self,x,y):
        t = self.t
        self.onTrace_goto(x,y)
        t.fillcolor('#000000')
        t.begin_fill()
        t.seth(300)
        t.circle(-100,30)
        t.seth(35)
        t.circle(300,15)
        t.circle(30,50)
        t.seth(190)
        t.circle(300,17)
        t.end_fill()

    def body(self):

        t = self.t
        t.fillcolor('#F6D02F')
        # 右脸轮廓
        t.penup()
        t.circle(130,40)
        t.pendown()
        t.circle(100,105)
        t.left(180)
        t.circle(-100,5)

        # 右耳朵
        t.seth(20)
        t.circle(300,30)
        t.circle(30,50)
        t.seth(190)
        t.circle(300,36)

        # 上轮廓
        t.seth(150)
        t.circle(150,70)


        #左耳朵
        t.seth(200)
        t.circle(300,40)
        t.circle(30,50)
        t.seth(20)
        t.circle(300,35)

        # 左脸轮廓
        t.seth(240)
        t.circle(105,95)
        t.left(180)
        t.circle(-105,5)

        #左手
        t.seth(210)
        t.circle(500,18)
        t.seth(200)
        t.fd(10)
        t.seth(280)
        t.fd(7)
        t.seth(210)
        t.seth(300)
        t.circle(10,80)
        t.seth(220)
        t.seth(10)
        t.seth(300)
        t.circle(10,80)
        t.seth(240)
        t.fd(12)
        t.seth(0)
        t.fd(13)
        t.seth(240)
        t.circle(10,70)
        t.seth(10)
        t.circle(10,70)
        t.seth(10)
        t.circle(300,18)


        t.seth(75)
        t.circle(500,8)
        t.left(180)
        t.circle(-500,15)
        t.seth(250)
        t.circle(100,65)

        # 左脚
        t.seth(320)
        t.circle(100,5)
        t.left(180)
        t.circle(-100,5)
        t.seth(220)
        t.circle(200,20)
        t.circle(20,70)

        t.seth(60)
        t.circle(-100,20)
        t.left(180)
        t.circle(100,20)
        t.seth(300)
        t.circle(10,70)

        t.seth(60)
        t.circle(-100,20)
        t.left(180)
        t.circle(100,20)
        t.seth(10)
        t.circle(100,60)

        # 横向
        t.seth(180)
        t.circle(-100,10)
        t.left(180)
        t.circle(100,10)
        t.seth(5)
        t.circle(100,10)
        t.circle(-100,40)
        t.circle(100,35)
        t.left(180)
        t.circle(-100,10)

        # 右脚
        t.seth(290)
        t.circle(100,55)
        t.circle(10,50)

        t.seth(120)
        t.circle(100,20)
        t.left(180)
        t.circle(-100,20)

        t.seth(0)
        t.circle(10,50)

        t.seth(110)
        t.circle(110,20)
        t.left(180)
        t.circle(-100,20)

        t.seth(30)
        t.circle(20,50)

        t.seth(100)
        t.circle(100,40)

        # 右侧身体轮廓
        t.seth(200)
        t.circle(-100,5)
        t.left(180)
        t.circle(100,5)
        t.left(30)
        t.circle(100,75)
        t.right(15)
        t.circle(-300,21)
        t.left(180)
        t.circle(300,3)

        # 右手
        t.seth(43)
        t.circle(200,60)

        t.right(10)
        t.fd(10)

        t.circle(5,160)
        t.seth(90)
        t.circle(5,160)
        t.seth(90)

        t.fd(10)
        t.seth(90)
        t.circle(5,180)
        t.fd(10)

        t.left(180)
        t.left(20)
        t.fd(10)
        t.circle(5,170)
        t.fd(10)
        t.seth(240)
        t.circle(50,30)

        t.end_fill()
        self.onTrace_goto(130,125)
        t.seth(-20)
        t.fd(5)
        t.circle(-5,160)
        t.fd(5)


        # 手指纹
        self.onTrace_goto(166,130)
        t.seth(-90)
        t.fd(3)
        t.circle(-4,180)
        t.fd(3)
        t.seth(-90)
        t.fd(3)
        t.circle(-4,180)
        t.fd(3)

        # 尾巴
        self.onTrace_goto(168,134)
        t.fillcolor('#F6D02F')
        t.begin_fill()
        t.seth(40)
        t.fd(200)
        t.seth(-80)
        t.fd(150)
        t.seth(210)
        t.fd(150)
        t.left(90)
        t.fd(100)
        t.right(95)
        t.fd(100)
        t.left(110)
        t.fd(70)
        t.right(110)
        t.fd(80)
        t.left(110)
        t.fd(30)
        t.right(110)
        t.fd(32)


        t.right(106)
        t.circle(100,25)
        t.right(15)
        t.circle(-300,2)

        t.seth(30)
        t.fd(40)
        t.left(100)
        t.fd(70)
        t.right(100)
        t.fd(80)
        t.left(100)
        t.fd(46)
        t.seth(66)
        t.circle(200,38)
        t.right(10)
        t.end_fill()


        # 尾巴花纹
        t.fillcolor('#923E24')
        self.onTrace_goto(126.82,-156.84)
        t.begin_fill()
        t.seth(30)
        t.fd(40)
        t.left(100)
        t.fd(40)
        t.pencolor('#923e24')
        t.seth(-30)
        t.fd(30)
        t.left(140)
        t.fd(20)
        t.left(150)
        t.fd(20)
        t.right(150)
        t.fd(20)
        t.left(130)
        t.fd(18)
        t.pencolor('#000000')
        t.seth(-45)
        t.fd(67)
        t.right(110)
        t.fd(30)
        t.left(110)
        t.fd(32)
        t.right(106)
        t.circle(100,25)
        t.right(15)
        t.circle(-300,2)
        t.end_fill()



        # 帽子、眼睛、嘴巴、脸颊
        self.cap(-134.07,147.81)
        self.mouth(-5,25)
        self.leftCheck(-126,32)
        self.rightCheck(107,63)
        self.colorLeftEar(-250,100)
        self.colorRightEar(150,270)
        self.leftEye(-85,90)
        self.rightEye(50,110)
        t.hideturtle()

    def cap(self,x,y):
        self.onTrace_goto(x,y)
        t = self.t
        t.fillcolor('#CD0000')
        t.begin_fill()
        t.seth(200)
        t.circle(400,7)
        t.left(180)
        t.circle(-400,30)
        t.circle(30,60)
        t.fd(60)
        t.circle(30,45)
        t.fd(60)
        t.left(5)
        t.circle(30,70)
        t.right(20)
        t.circle(200,70)
        t.circle(30,60)
        t.fd(70)
        t.right(35)
        t.fd(50)
        t.right(35)
        t.fd(50)
        t.circle(8,100)
        t.end_fill()
        self.onTrace_goto(-168.47,185.52)
        t.seth(36)
        t.circle(-270,54)
        t.left(180)
        t.circle(270,27)
        t.circle(-80,98)

        t.fillcolor('#444444')
        t.begin_fill()
        t.left(180)
        t.circle(80,197)
        t.left(58)
        t.circle(200,45)
        t.end_fill()

        self.onTrace_goto(-58,270)
        t.pencolor('#228B22')
        t.dot(35)

        self.onTrace_goto(-30,280)
        t.fillcolor('#228B22')
        t.begin_fill()
        t.seth(100)
        t.circle(30,180)
        t.seth(190)
        t.fd(15)
        t.seth(100)
        t.circle(-45,180)
        t.right(90)
        t.fd(15)
        t.end_fill()
        t.fillcolor('#228B22')


    def start(self):
        self.body()

def main():
    print(" Painting the Pikachu....")
    turtle.screensize(800,600)
    turtle.title("Pickachu")
    pickachu = Pikachu()
    pickachu.start()

    turtle.mainloop() # running


if __name__ =='__main__':
    main()

4. Draw Doraemon

[External link image transfer failed. The source site may have an anti-leech link mechanism. It is recommended to save the image and upload it directly (img-ZvqTRwPI-1600647820056)(C:\Users\13479\Desktop\222.gif)]

Code part

#五轨迹跳跃
def my_goto(x,y):
    penup()
    goto(x,y)
    pendown()

def eyes():
    fillcolor('#ffffff')
    begin_fill()

    tracer(False)
    a = 2.5
    for i in range(120):
        if 0<= i<30 or 60 <= i <90:
            a -= 0.05
            lt(3)
            fd(a)
        else:
            a += 0.05
            lt(3)
            fd(a)
    tracer(True)
    end_fill()


#胡须
def beard():
    my_goto(-32,135)
    seth(165)
    fd(60)

    my_goto(-32,125)
    seth(180)
    fd(60)

    my_goto(-32,115)
    seth(193)
    fd(60)

    my_goto(37,135)
    seth(15)
    fd(60)

    my_goto(37,125)
    seth(0)
    fd(60)

    my_goto(37,115)
    seth(-13)
    fd(60)


#嘴巴
def mouth():
    my_goto(5,148)
    seth(270)
    fd(100)
    seth(0)
    circle(120,50)
    seth(230)
    circle(-120,100)

#围巾
def scarf():
    fillcolor('#e70010')
    begin_fill()
    seth(0)
    fd(200)
    circle(-5,90)
    fd(10)
    circle(-5,90)
    fd(207)
    circle(-5,90)
    fd(10)
    circle(-5,90)
    end_fill()


#鼻子
def nose():
    my_goto(-10,158)
    seth(315)
    fillcolor('#e70010')
    begin_fill()
    circle(20)
    end_fill()


#黑眼睛
def black_eyes():
    seth(0)
    my_goto(-20,195)
    fillcolor('#000000')
    begin_fill()
    circle(13)
    end_fill()

    pensize(6)
    my_goto(20,205)
    seth(75)
    circle(-10,150)
    pensize(3)

    my_goto(-17,200)
    seth(0)
    fillcolor('#ffffff')
    begin_fill()
    circle(5)
    end_fill()
    my_goto(0,0)


def face():

    fd(183)
    lt(45)
    fillcolor('#ffffff')
    begin_fill()
    circle(120,100)
    seth(180)
    fd(121)
    pendown()
    seth(215)
    circle(120,100)
    end_fill()
    my_goto(63.56,218.24)
    seth(90)
    eyes()
    seth(180)
    penup()
    fd(60)
    pendown()
    seth(90)
    eyes()
    penup()
    seth(180)
    fd(64)



def head():
    penup()
    circle(150,40)
    pendown()
    fillcolor('#00a0de')
    begin_fill()
    circle(150,280)
    end_fill()


# body
def Doraemon():

    head()

    scarf()

    face()

    nose()

    mouth()

    beard()

    my_goto(0,0)
    seth(0)
    penup()
    circle(150,50)
    pendown()
    seth(30)
    fd(40)
    seth(70)
    circle(-30,270)

    fillcolor('#00a0de')
    begin_fill()

    seth(230)
    fd(80)
    seth(90)
    circle(1000,1)
    seth(-89)
    circle(-1000,10)

    seth(180)
    fd(70)
    seth(90)
    circle(30,180)
    seth(180)
    fd(70)

    seth(100)
    circle(-1000,9)


    seth(-86)
    circle(1000,2)
    seth(230)
    fd(40)


    circle(-30,230)
    seth(45)
    fd(81)
    seth(0)
    fd(203)
    circle(5,90)
    fd(10)
    circle(5,90)
    fd(7)
    seth(40)
    circle(150,10)
    seth(30)
    fd(40)
    end_fill()

    seth(70)
    fillcolor('#ffffff')
    begin_fill()
    circle(-30)
    end_fill()


    my_goto(103.74,-182.59)
    seth(0)
    fillcolor('#ffffff')
    begin_fill()
    fd(15)
    circle(-15,180)
    fd(90)
    circle(-15,180)
    fd(10)
    end_fill()


    #右手
    my_goto(-103.42,15.09)
    seth(0)
    fd(38)
    seth(230)
    begin_fill()
    circle(90,260)
    end_fill()

    my_goto(5,-40)
    seth(0)
    fd(70)
    seth(-90)
    circle(-70,180)
    seth(0)
    fd(70)

    #铃铛
    my_goto(-103.42,15.09)
    fd(90)
    seth(70)
    fillcolor('#ffd200')
    begin_fill()
    circle(-20)
    end_fill()
    seth(170)
    fillcolor('#ffd200')
    begin_fill()
    circle(-2,180)
    seth(10)
    circle(-100,22)
    circle(-2,180)
    seth(180-10)
    circle(100,22)
    end_fill()
    goto(-13.42,15.09)
    seth(250)
    circle(20,110)
    seth(90)
    fd(15)
    dot(10)

    my_goto(0,-150)

    #画眼睛
    black_eyes()


if __name__ =='__main__':
    screensize(800,600,'#f0f0f0')
    pensize(3) # size of pen
    speed(9) # speed of pen
    Doraemon()
    my_goto(100,-300)
    write("by zeroing",font = ("Bladley Hand ITC",30,'bold'))
    mainloop()

It should be understood from the number of lines of code above that the most difficult part of turtle is not its usage, but the user’s overall geometric shaping of the entire object, which must be very accurate globally, otherwise it will be difficult to draw a satisfactory pattern in the end

Interested students can copy the above code directly into their IDE and run it directly. The above is all the content of this article, thank you for reading!

Guess you like

Origin blog.csdn.net/weixin_42512684/article/details/108702039