七夕节将至,python帮你表白|Python主题月七夕

本文正在参加「Python主题月」,详情查看 活动链接

七夕节将至,python帮你表白

七夕情人节快到了兄弟们,作为程序员一年又一年的送玫瑰花太俗套了,拿上我们手头的饭碗送给她专属的情人节礼物吧。

一箭穿心如何?我们借助turtle --- 海龟绘图。知识点你自己去翻阅官方文档吧。本文将详细讲解绘画过程。

首先绘制屏幕大小

就以电脑整个屏幕绘制,电脑桌面右键->显示设置。找到电脑分辨率1920x1080,那么我们就以这个大小绘制屏幕。并且加上当点击时退出的方法。

import turtle
​
if __name__ == '__main__':
    turtle.setup(width=1920, height=1080)
    window = turtle.Screen()
    window.exitonclick()
复制代码

寻找合适的起始值

1、我们知道屏幕的中心点是(0,0),那么我们的起始值应该在(0,y),根据尝试(0,200)较为合适。

2、那么我们应该将画笔从(0,0)移到(0,200).

3、默认的画笔是黑色的且在屏幕上处于绘画状态,所以我们将笔隐藏,而且画笔移动的效果我们也没必要观看。

4、设置笔的颜色和粗细速度

import turtle
​
if __name__ == '__main__':
    turtle.setup(width=1920, height=1080)
​
    turtle.color('red', "pink")
    turtle.pensize(5)
    turtle.speed(5)
    turtle.up()
    turtle.hideturtle()
    turtle.goto(0, 200)
​
    window = turtle.Screen()
    window.exitonclick()
复制代码

起笔画左上部分的心

1、将隐藏的画笔显示出来

2、将画笔绘画的路径显示出来

3、向左120°起笔,一边向左旋转,一边绘画。

4、画完的心填充上颜色,所以绘画之前准备填充。

import turtle
​
if __name__ == '__main__':
    turtle.setup(width=1920, height=1080)
​
    turtle.color('red', "pink")
    turtle.pensize(5)
    turtle.speed(5)
    turtle.up()
    turtle.hideturtle()
    turtle.goto(0, 200)
​
    turtle.showturtle()
    turtle.down()
    turtle.begin_fill()
    turtle.left(120)
    turtle.down()
    for i in range(200):
        turtle.left(1)
        turtle.forward(2)
​
    window = turtle.Screen()
    window.exitonclick()
复制代码

图像如下

image-20210731143127149.png

起笔画右上部分的心

1、转移到(0,200)位置,还是上述的流程,所以将回到初始点的方法,封装起来。

2、画笔显现也是重复操作封装成方法。

3、画上边心的过程也几乎相似。

import turtle
​
​
def returnInitialPoint(x: int, y: int):
    turtle.up()
    turtle.hideturtle()
    turtle.goto(x, y)
    turtle.showturtle()
    turtle.down()
​
​
def upperHalfHeart(firstDirection: str, parameter: int, rangeParameter: int, direction: str, dParameter: int,
                   forwardParameter: int):
    turtle.left(parameter) if firstDirection == "left" else turtle.right(parameter)
    for i in range(rangeParameter):
        turtle.left(dParameter) if direction == "left" else turtle.right(dParameter)
        turtle.forward(forwardParameter)
​
if __name__ == '__main__':
    turtle.setup(width=1920, height=1080)
​
    turtle.color('red', "pink")
    turtle.pensize(5)
    turtle.speed(7)
    returnInitialPoint(0, 200)
    turtle.begin_fill()
    upperHalfHeart("left", 120, 200, "left", 1, 2)
    returnInitialPoint(0, 200)
    upperHalfHeart("left", 100, 200, "right", 1, 2)
​
    window = turtle.Screen()
    window.exitonclick()
​
复制代码

图像如下

image-20210731143209659.png

画下半部分心

向左画到中间,然后转笔90°画相同的长度。

import turtle
​
​
def returnInitialPoint(x: int, y: int):
    turtle.up()
    turtle.hideturtle()
    turtle.goto(x, y)
    turtle.showturtle()
    turtle.down()
​
​
def upperHalfHeart(firstDirection: str, parameter: int, rangeParameter: int, direction: str, dParameter: int,
                   forwardParameter: int):
    turtle.left(parameter) if firstDirection == "left" else turtle.right(parameter)
    for i in range(rangeParameter):
        turtle.left(dParameter) if direction == "left" else turtle.right(dParameter)
        turtle.forward(forwardParameter)
​
​
if __name__ == '__main__':
    turtle.setup(width=1920, height=1080)
​
    turtle.color('red', "pink")
    turtle.pensize(5)
    turtle.speed(7)
    returnInitialPoint(0, 200)
    turtle.begin_fill()
    upperHalfHeart("left", 120, 200, "left", 1, 2)
    returnInitialPoint(0, 200)
    upperHalfHeart("left", 100, 200, "right", 1, 2)
    turtle.left(5)
    turtle.forward(243)
    turtle.right(90)
    turtle.forward(243)
​
    window = turtle.Screen()
    window.exitonclick()
​
复制代码

图像如下

image-20210731143312299.png

一个完整的心就被画出来了。

填充颜色

turtle.end_fill()
复制代码

image-20210731143401550.png

画第二个心

与上述的流程基本差不多,不再赘述。

import turtle
​
​
def returnInitialPoint(x: int, y: int):
    turtle.up()
    turtle.hideturtle()
    turtle.goto(x, y)
    turtle.showturtle()
    turtle.down()
​
​
def upperHalfHeart(firstDirection: str, parameter: int, rangeParameter: int, direction: str, dParameter: int,
                   forwardParameter: int):
    turtle.left(parameter) if firstDirection == "left" else turtle.right(parameter)
    for i in range(rangeParameter):
        turtle.left(dParameter) if direction == "left" else turtle.right(dParameter)
        turtle.forward(forwardParameter)
​
​
def arrowHead():
   turtle.pensize(1)
   turtle.speed(1)
   turtle.color('red', 'red')
   turtle.begin_fill()
   turtle.left(120)
   turtle.forward(20)
   turtle.right(150)
   turtle.forward(35)
   turtle.right(120)
   turtle.forward(35)
   turtle.right(150)
   turtle.forward(20)
​
if __name__ == '__main__':
    turtle.setup(width=1920, height=1080)
​
    turtle.color('red', "pink")
    turtle.pensize(5)
    turtle.speed(7)
    returnInitialPoint(0, 200)
    turtle.begin_fill()
    upperHalfHeart("left", 120, 200, "left", 1, 2)
    returnInitialPoint(0, 200)
    upperHalfHeart("left", 100, 200, "right", 1, 2)
    turtle.left(5)
    turtle.forward(243)
    turtle.right(90)
    turtle.forward(243)
    turtle.end_fill()
    returnInitialPoint(130, 90)
    turtle.begin_fill()
    upperHalfHeart("right", 30, 100, "left", 2, 2)
    returnInitialPoint(130, 90)
    upperHalfHeart("left", 130, 100, "right", 2, 2)
    turtle.right(10)
    turtle.forward(145)
    turtle.right(90)
    turtle.forward(145)
    turtle.end_fill()
    window = turtle.Screen()
    window.exitonclick()
复制代码

image-20210731152637937.png

画穿心的箭杆

1、找到合适的起始位置(-400,200)

2、设置画笔的宽度,即设置箭杆的粗细,我这个略显有点粗,你可以稍微减减。

3、找到合适箭杆的终止位置。

returnInitialPoint(-400, 200)
turtle.pensize(10)
turtle.goto(339, - 50)
复制代码

image-20210731155829904.png

画穿心的箭头

1、首先设置箭头的颜色为红色

2、向右旋转50°,前进30像素

3、下同

def arrow():
    turtle.speed(1)
    turtle.color('red', 'red')
    turtle.begin_fill()
    turtle.right(50)
    turtle.forward(30)
    turtle.right(130)
    turtle.forward(80)
    turtle.right(135)
    turtle.forward(80)
    turtle.right(135)
    turtle.forward(30)
    turtle.end_fill()
复制代码

image-20210731160535139.png

写上两人的名字

1、来到合适的位置

2、设置字体和颜色

3、写字

returnInitialPoint(0, 150)
turtle.color('#CD5C5C', 'pink')
turtle.write("低调的码媛", font=('gungsuh', 30,), align="center")
returnInitialPoint(130, 50)
turtle.write("掘金", font=('gungsuh', 30,), align="center")
复制代码

image-20210731162105424.png

修改成用户动态输入

name = input('Please enter yourname: ')
girlFrient = input('Please enter your girlfriend's name: ')
复制代码

完整代码

import turtle
​
​
def returnInitialPoint(x: int, y: int):
    turtle.up()
    turtle.hideturtle()
    turtle.goto(x, y)
    turtle.showturtle()
    turtle.down()
​
​
def upperHalfHeart(firstDirection: str, parameter: int, rangeParameter: int, direction: str, dParameter: int,
                   forwardParameter: int):
    turtle.left(parameter) if firstDirection == "left" else turtle.right(parameter)
    for i in range(rangeParameter):
        turtle.left(dParameter) if direction == "left" else turtle.right(dParameter)
        turtle.forward(forwardParameter)
​
​
def arrow():
    turtle.speed(1)
    turtle.color('red', 'red')
    turtle.begin_fill()
    turtle.right(50)
    turtle.forward(30)
    turtle.right(130)
    turtle.forward(80)
    turtle.right(135)
    turtle.forward(80)
    turtle.right(135)
    turtle.forward(30)
    turtle.end_fill()
​
​
if __name__ == '__main__':
    name = input('Please enter yourname: ')
    girlFrient = input('Please enter your girlfriend's name: ')
    turtle.setup(width=1920, height=1080)
​
    turtle.color('red', "pink")
    turtle.pensize(5)
    turtle.speed(7)
    returnInitialPoint(0, 200)
    turtle.begin_fill()
    upperHalfHeart("left", 120, 200, "left", 1, 2)
    returnInitialPoint(0, 200)
    upperHalfHeart("left", 100, 200, "right", 1, 2)
    turtle.left(5)
    turtle.forward(243)
    turtle.right(90)
    turtle.forward(243)
    turtle.end_fill()
​
    returnInitialPoint(130, 90)
    turtle.begin_fill()
    upperHalfHeart("right", 30, 100, "left", 2, 2)
    returnInitialPoint(130, 90)
    upperHalfHeart("left", 130, 100, "right", 2, 2)
    turtle.right(10)
    turtle.forward(145)
    turtle.right(90)
    turtle.forward(145)
    turtle.end_fill()
​
    returnInitialPoint(-400, 200)
    turtle.pensize(10)
    turtle.goto(339, - 50)
    arrow()
    returnInitialPoint(0, 150)
    turtle.color('#CD5C5C', 'pink')
    turtle.write(name, font=('gungsuh', 30,), align="center")
    returnInitialPoint(130, 50)
    turtle.write(girlFrient, font=('gungsuh', 30,), align="center")
    window = turtle.Screen()
    window.exitonclick()
复制代码

写在最后

本例因为时间原因没有进行精确的计算,只是粗鄙的将它实现了出来,如果你有时间或者有兴趣,可以 将他完善优化。

预祝有情人终成眷属,大家都能表白成功。