闲来无事,用python制作了一个可以在七夕/情人节送对象的礼物,展示一把程序员的浪漫~

男朋友的同门看到了之后表示,你女朋友好牛逼&浪漫

那么话不多说,我们这就开始吧!

1. 库函数包装

使用的语言是python,用到的库函数包含tkinter,turtle和PIL,其中只有PIL需要下载,其他都是python自带的,下载代码:

pip install pillow

2. 创建tkinter基本窗口

basedesk相当于桌子,之后创建的tk.Frame相当于桌布,多张桌布可以在桌子上切换。

class basedesk():def __init__(self, master):self.root = masterself.root.config()self.root.title('开启我们的故事')self.root.geometry('600x450')self.root.resizable(False, False)Init(self.root)

3. 封面页

我设计的封面页只包含文字和一个切换按钮,分别使用tkinter自带的Label和Button:

tk.Label(self.face, text=text, font=title).pack()
tk.Button(self.face, text="开启我们的故事", font=font, command=self.next, bg=color).pack()

完整的一页:

from turtle import *
import tkinter as tk
from PIL import Image, ImageTkfont=("华文行楷", 17, "normal")  # 正文格式
title=("华文行楷", 30, "normal")  # 标题格式
color = 'pink'class Init():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n\n\n准备好开启我们的故事了吗\n\n'tk.Label(self.face, text=text, font=title).pack()tk.Button(self.face, text="开启我们的故事", font=font, command=self.next, bg=color).pack()def next(self):self.face.destroy()StoryBegin(self.master)

效果展示:

4. 正文页

我设计的正文页包含文字和图片和一个切换按钮,图片采用函数showImg导入。参数:

  1. face表示要显示的Frame
  2. name表示图片的名字,这里采用的格式是png,可以自己修改。
  3. side表示图片的排列方式,包含TOP,BOTTOM,LEFT和RIGHT四种
  4. rate表示图片的缩放倍数
def showImg(face, name, side=tk.TOP, rate=1.0):global renderload = Image.open('{}.png'.format(name))size = (int(load.size[0]*rate), int(load.size[1]*rate))load = load.resize(size)render[name] = ImageTk.PhotoImage(load)img = tk.Label(face, image=render[name]).pack(side=side)

完整的一页:

class StoryBegin():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n2018年9月10日\n我们的故事开始\n'\'还记得我们发的官宣说说吗?\n'\'还是一起跑完步随手拍的自拍'tk.Label(self.face, text=text, font=font).pack()tk.Button(self.face, text="继续我们的故事", command=self.next, bg=color).pack(side=tk.BOTTOM)showImg(self.face, 'couple', rate=1.5)def next(self):self.face.destroy()Milktea(self.master)

效果展示:

4. 测试页1

单纯的叙述多没意思呀,来增加一点难度吧。可以增加一点情侣之间的小秘密提问哦~


可以用Label输入问题,Entry插入文本框,用来输入答案,Button用来确认输入

        text = '\n随堂小测验开始~\n'\'还记得你第一次请我喝的奶茶是什么口味吗?'tk.Label(self.face, text=text, font=font).pack()self.namestr = tk.StringVar()tk.Entry(self.face, textvariable=self.namestr, font=font).pack(side=tk.TOP)tk.Button(self.face, text="确定", command=self.judge, bg=color).pack(side=tk.TOP)

用一个judge函数判断答案正误:

    def judge(self):if self.namestr.get() != '草莓':tk.messagebox.askokcancel(title='警告', message='回答错误!\n提示:输入两个字哦~')else:self.story_continue()

错误的话利用messagebox弹出提示窗口:


正确的话出现后续故事,和正文一致,不再赘述:


完整的一页:

class Milktea():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n随堂小测验开始~\n'\'还记得你第一次请我喝的奶茶是什么口味吗?'tk.Label(self.face, text=text, font=font).pack()self.namestr = tk.StringVar()tk.Entry(self.face, textvariable=self.namestr, font=font).pack(side=tk.TOP)tk.Button(self.face, text="确定", command=self.judge, bg=color).pack(side=tk.TOP)def judge(self):if self.namestr.get() != '草莓':tk.messagebox.askokcancel(title='警告', message='回答错误!\n提示:输入两个字哦~')else:self.story_continue()def story_continue(self):text = '\n回答正确~\n'\'可不要小瞧这一杯奶茶哟\n'\'第一次的时候我告诉你喜欢草莓味\n'\'然后你就记住了,并且第二次直接买到了我喜欢的口味\n'\'当时就觉得,嗯,这个男银,不戳\n'tk.Label(self.face, text=text, font=font).pack()tk.Button(self.face, text="继续我们的故事", command=self.next, bg=color).pack(side=tk.TOP)def next(self):self.face.destroy()Study(self.master)

5. 测试页2

如果想要在测试页插入图片导致内容放不下,也可以将答案放到第二页。

第一页:

如果回答错误:

如果回答正确,进入第2页:

完整的两页的代码:

class Christmas():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n根据图片,你能看出这是哪一天吗?'tk.Label(self.face, text=text, font=font).pack()self.namestr = tk.StringVar()tk.Entry(self.face, textvariable=self.namestr, font=font).pack(side=tk.TOP)tk.Button(self.face, text="确定", command=self.judge, bg=color).pack(side=tk.TOP)showImg(self.face,'couple', rate=1.5)def judge(self):if self.namestr.get() != '2018年12月25日':tk.messagebox.askokcancel(title='警告', message='回答错误!\n提示:输入格式:XXXX年XX月XX日~')else:self.next()def next(self):self.face.destroy()Christmas2(self.master)    class Christmas2():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n回答正确~\n是2018年12月25日\n'\'当然是我们在一起的第一个圣诞节啦!'tk.Label(self.face, text=text, font=font).pack()showImg(self.face,'couple', rate=1.5)text = '我们还盖了手印,\n'\'要在一起一辈子不分开哟'tk.Label(self.face, text=text, font=font).pack()b = tk.Button(self.face, text="继续我们的故事", bg=color, command=self.next).pack(side=tk.BOTTOM)   def next(self):self.face.destroy()Heart(self.master)

6. 结尾页

交替正文页和测试页,就可以组成你们的专属小故事啦~

在故事的最后,也要给闯关成功的TA一点小奖励呢。

让我们用turtle库函数画个比心小人和一段真情的表白吧


实际上的小人是会动的哦,别看这张图看起来简单,它的代码可不短~

完整一页代码:

class Heart():def __init__(self, master):self.master = masterself.master.config()self.canvas = tk.Canvas(self.master, width=600, height=450)self.canvas.pack()self.tu = RawTurtle(self.canvas)self.tu.hideturtle()self.tu.home()self.tu.clear()self.tu.speed(0)self.tu.screen.delay(0)self.person(0, 50)s = '亲爱的宝贝:\n'\'  今天不是什么特别的日子,\n'\'  没有什么日子需要赋予特殊意义,\n'\'  因为我时时爱你,\n'\'  不需要在某个节点才袒露心意。'self.word(s, -100, -150)     def go_to(self, x, y):self.tu.penup()self.tu.goto(x, y)self.tu.down()def ring(self, a,b,c,d):for i in range(a):self.tu.forward(b)if d == 'right':self.tu.right(c)else:self.tu.left(c)def heart(self, x, y, size):self.go_to(x, y)self.tu.left(150)self.tu.begin_fill()self.tu.forward(51*size)self.ring(150,size,0.3,'right')self.ring(210,size,0.786,'right')self.tu.left(120)self.ring(210,size,0.786,'right')self.ring(150,size,0.3,'right')self.tu.forward(51*size)self.tu.end_fill()def person(self, xbias, ybias):#头部self.tu.color('black')self.go_to(-228, 72-ybias)self.tu.pensize(3)self.tu.left(150)self.ring(350,1,0.8,'right')#手臂self.tu.left(150)self.tu.forward(70)self.tu.left(90)self.tu.forward(10)self.ring(200,0.1,0.9,'right')self.tu.forward(10)self.tu.left(90)self.tu.forward(20)self.ring(200,0.1,0.9,'right')self.tu.forward(10)self.tu.left(90)self.ring(200,0.2,0.9,'right')self.tu.left(100)self.tu.leftself.tu.forward(80)#身体self.go_to(-228, 72-ybias)self.tu.left(40)self.tu.forward(40)self.ring(120,0.2,0.9,'left')self.go_to(-219,52-ybias)self.tu.right(95)self.tu.forward(80)self.tu.right(85)self.ring(205,0.1,0.9,'left')self.tu.forward(40)self.tu.left(90)self.tu.forward(10)self.ring(200,0.1,0.9,'right')self.tu.forward(10)self.tu.left(90)self.tu.forward(40)self.ring(205,0.1,0.9,'left')self.tu.right(92)self.tu.forward(90)#左眼self.go_to(-217,155-ybias)self.tu.fillcolor('black')self.tu.begin_fill()self.tu.circle(5)self.tu.end_fill()#右眼self.go_to(-169,158-ybias)self.tu.fillcolor('black')self.tu.begin_fill()self.tu.circle(5)self.tu.end_fill()#微笑self.go_to(-210,132-ybias)self.tu.right(180)self.ring(200,0.2,0.9,'left')#腮红self.tu.color('#ffa0a0')self.tu.pensize(5)self.tu.left(170)self.go_to(-235, 135-ybias)self.tu.forward(11)self.go_to(-225, 135-ybias)self.tu.forward(11)self.go_to(-155, 140-ybias)self.tu.forward(11)self.go_to(-165, 140-ybias)self.tu.forward(11)#比心self.tu.setheading(0)self.heart(-35, 135-ybias, 0.10)self.tu.setheading(0)self.heart(5, 150-ybias, 0.13)self.tu.setheading(0)self.heart(52, 165-ybias, 0.15)def word(self, s, x, y):self.go_to(x, y)self.tu.write(s,  align="left", font=("华文行楷", 20, "normal"))

下面是全部的完整代码。

# -*- coding: utf-8 -*-from turtle import *
import tkinter as tk
from PIL import Image, ImageTkfont=("华文行楷", 17, "normal")  # 正文格式
title=("华文行楷", 30, "normal")  # 标题格式
render = {}
color = 'pink'# 载入图片
def showImg(face, name, side=tk.TOP, rate=1.0):global renderload = Image.open('{}.png'.format(name))size = (int(load.size[0]*rate), int(load.size[1]*rate))load = load.resize(size)render[name] = ImageTk.PhotoImage(load)img = tk.Label(face, image=render[name]).pack(side=side)# 桌面
class basedesk():def __init__(self, master):self.root = masterself.root.config()self.root.title('开启我们的故事')self.root.geometry('600x450')self.root.resizable(False, False)Init(self.root)    # 开始页
class Init():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n\n\n准备好开启我们的故事了吗\n\n'tk.Label(self.face, text=text, font=title).pack()tk.Button(self.face, text="开启我们的故事", font=font, command=self.next, bg=color).pack()def next(self):self.face.destroy()StoryBegin(self.master)   # 正文页
class StoryBegin():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n2018年9月10日\n我们的故事开始\n'\'还记得我们发的官宣说说吗?\n'\'还是一起跑完步随手拍的自拍'tk.Label(self.face, text=text, font=font).pack()tk.Button(self.face, text="继续我们的故事", command=self.next, bg=color).pack(side=tk.BOTTOM)showImg(self.face, 'couple', rate=1.5)def next(self):self.face.destroy()Milktea(self.master)  # 测试页1
class Milktea():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n随堂小测验开始~\n'\'还记得你第一次请我喝的奶茶是什么口味吗?'tk.Label(self.face, text=text, font=font).pack()self.namestr = tk.StringVar()tk.Entry(self.face, textvariable=self.namestr, font=font).pack(side=tk.TOP)tk.Button(self.face, text="确定", command=self.judge, bg=color).pack(side=tk.TOP)def judge(self):if self.namestr.get() != '草莓':tk.messagebox.askokcancel(title='警告', message='回答错误!\n提示:输入两个字哦~')else:self.story_continue()def story_continue(self):text = '\n回答正确~\n'\'可不要小瞧这一杯奶茶哟\n'\'第一次的时候我告诉你喜欢草莓味\n'\'然后你就记住了,并且第二次直接买到了我喜欢的口味\n'\'当时就觉得,嗯,这个男银,不戳\n'tk.Label(self.face, text=text, font=font).pack()tk.Button(self.face, text="继续我们的故事", command=self.next, bg=color).pack(side=tk.TOP)def next(self):self.face.destroy()Christmas(master)(self.master)  # 测试页2-1
class Christmas():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n根据图片,你能看出这是哪一天吗?'tk.Label(self.face, text=text, font=font).pack()self.namestr = tk.StringVar()tk.Entry(self.face, textvariable=self.namestr, font=font).pack(side=tk.TOP)tk.Button(self.face, text="确定", command=self.judge, bg=color).pack(side=tk.TOP)showImg(self.face,'couple', rate=1.5)def judge(self):if self.namestr.get() != '2018年12月25日':tk.messagebox.askokcancel(title='警告', message='回答错误!\n提示:输入格式:XXXX年XX月XX日~')else:self.next()def next(self):self.face.destroy()Christmas2(self.master)    # 测试页2-2
class Christmas2():def __init__(self, master):self.master = masterself.master.config(width=600, height=400)self.face = tk.Frame(self.master)self.face.pack()text = '\n回答正确~\n是2018年12月25日\n'\'当然是我们在一起的第一个圣诞节啦!'tk.Label(self.face, text=text, font=font).pack()showImg(self.face,'couple', rate=1.5)text = '我们还盖了手印,\n'\'要在一起一辈子不分开哟'tk.Label(self.face, text=text, font=font).pack()b = tk.Button(self.face, text="继续我们的故事", bg=color, command=self.next).pack(side=tk.BOTTOM)   def next(self):self.face.destroy()Heart(self.master)    # 结尾页
class Heart():def __init__(self, master):self.master = masterself.master.config()self.canvas = tk.Canvas(self.master, width=600, height=450)self.canvas.pack()self.tu = RawTurtle(self.canvas)self.tu.hideturtle()self.tu.home()self.tu.clear()self.tu.speed(0)self.tu.screen.delay(0)self.person(0, 50)s = '亲爱的宝贝:\n'\'  今天不是什么特别的日子,\n'\'  没有什么日子需要赋予特殊意义,\n'\'  因为我时时爱你,\n'\'  不需要在某个节点才袒露心意。'self.word(s, -100, -150)     def go_to(self, x, y):self.tu.penup()self.tu.goto(x, y)self.tu.down()def ring(self, a,b,c,d):for i in range(a):self.tu.forward(b)if d == 'right':self.tu.right(c)else:self.tu.left(c)def heart(self, x, y, size):self.go_to(x, y)self.tu.left(150)self.tu.begin_fill()self.tu.forward(51*size)self.ring(150,size,0.3,'right')self.ring(210,size,0.786,'right')self.tu.left(120)self.ring(210,size,0.786,'right')self.ring(150,size,0.3,'right')self.tu.forward(51*size)self.tu.end_fill()def person(self, xbias, ybias):#头部self.tu.color('black')self.go_to(-228, 72-ybias)self.tu.pensize(3)self.tu.left(150)self.ring(350,1,0.8,'right')#手臂self.tu.left(150)self.tu.forward(70)self.tu.left(90)self.tu.forward(10)self.ring(200,0.1,0.9,'right')self.tu.forward(10)self.tu.left(90)self.tu.forward(20)self.ring(200,0.1,0.9,'right')self.tu.forward(10)self.tu.left(90)self.ring(200,0.2,0.9,'right')self.tu.left(100)self.tu.leftself.tu.forward(80)#身体self.go_to(-228, 72-ybias)self.tu.left(40)self.tu.forward(40)self.ring(120,0.2,0.9,'left')self.go_to(-219,52-ybias)self.tu.right(95)self.tu.forward(80)self.tu.right(85)self.ring(205,0.1,0.9,'left')self.tu.forward(40)self.tu.left(90)self.tu.forward(10)self.ring(200,0.1,0.9,'right')self.tu.forward(10)self.tu.left(90)self.tu.forward(40)self.ring(205,0.1,0.9,'left')self.tu.right(92)self.tu.forward(90)#左眼self.go_to(-217,155-ybias)self.tu.fillcolor('black')self.tu.begin_fill()self.tu.circle(5)self.tu.end_fill()#右眼self.go_to(-169,158-ybias)self.tu.fillcolor('black')self.tu.begin_fill()self.tu.circle(5)self.tu.end_fill()#微笑self.go_to(-210,132-ybias)self.tu.right(180)self.ring(200,0.2,0.9,'left')#腮红self.tu.color('#ffa0a0')self.tu.pensize(5)self.tu.left(170)self.go_to(-235, 135-ybias)self.tu.forward(11)self.go_to(-225, 135-ybias)self.tu.forward(11)self.go_to(-155, 140-ybias)self.tu.forward(11)self.go_to(-165, 140-ybias)self.tu.forward(11)#比心self.tu.setheading(0)self.heart(-35, 135-ybias, 0.10)self.tu.setheading(0)self.heart(5, 150-ybias, 0.13)self.tu.setheading(0)self.heart(52, 165-ybias, 0.15)def word(self, s, x, y):self.go_to(x, y)self.tu.write(s,  align="left", font=("华文行楷", 20, "normal"))if __name__ == '__main__':    root = tk.Tk()basedesk(root)root.mainloop()

参考文献

使用python的tkinter和turtle库函数制作七夕/情人节送对象的礼物相关推荐

  1. HTML+CSS制作七夕情人节求婚动画(520情人节程序员表白)

    HTML+CSS制作七夕情人节求婚动画(520情人节程序员表白) css太强大了,只要你想做,everything is possible!CSS模仿求婚小动画 效果图如下 出现的新郎的动画 .w-m ...

  2. python tkinter画布中使用turtle_[Tkinter canvas of Python]海龟图书馆,python,之,tkinter,画布,Turtle,库...

    [python之tkinter画布] turtle绘图的基础知识: turtle.screensize(canvwidth=None, canvheight=None, bg=None) #参数分别为 ...

  3. (2022)情人节送小仙女什么礼物?Python对口红进行数据分析,那个女孩子会拒绝这样精心挑选的礼物~

    前言: 情人节.三八女神节.520.七夕节.圣诞节.元旦.生日.新年.各种纪念日--这些节日,对于每一个有女朋友的男同胞们来说都存在一个困惑的问题:送女朋友什么礼物好? 其实送礼物这件事,说难也不难, ...

  4. python程序设计基础之turtle库制作简单的小图片

    (turtle基础)一条小蛇 #我做了一条简单的小蟒蛇 from turtle import * setup(650,350,200,200) pu() fd(-250) pd() pensize(2 ...

  5. 使用Python turtle快速实现七夕情人节礼物

    马上就到一年一度七夕节啦,如何节碳环保而出奇的向心上人表达心意呢?答案当然是亲手制作视频/卡片/动画类啦,只要有足够的创意,加上技术过硬,效果好到无上限. 今天我就浅浅的使用Python turtle ...

  6. HTML+CSS+JS520告白表白模板在线制作(七夕情人节表白网页代码)

    ❤ 精彩专栏推荐

  7. HTML+CSS+JS 520告白表白模板在线制作(七夕情人节表白网页代码)

    ❤ 精彩专栏推荐

  8. 情人节程序员用HTML网页表白【制作属于我们的爱情相册网页】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript

    这是程序员表白系列中的100款网站表白之一,旨在让任何人都能使用并创建自己的表白网站给心爱的人看. 此波共有100个表白网站,可以任意修改和使用,很多人会希望向心爱的男孩女孩告白,生性腼腆的人即使那个 ...

  9. HTML5七夕情人节表白网页制作【浪漫森林落叶钢琴紫色3D相册】HTML+CSS+JavaScript

    这是程序员表白系列中的100款网站表白之一,旨在让任何人都能使用并创建自己的表白网站给心爱的人看. 此波共有100个表白网站,可以任意修改和使用,很多人会希望向心爱的男孩女孩告白,生性腼腆的人即使那个 ...

最新文章

  1. java thread 无法执行_哪位大神帮我讲一下这段代码,为什么线程不能继续执行
  2. c语言class运行错误,win32 C RegisterClass失败,该如何处理
  3. 交换机与集线器的区别
  4. python代码自动补齐插件
  5. 虚拟机照样飞速跑Windows Server2008
  6. C++自动类型推导 : auto 与 decltype 用法
  7. python字符串转浮点数_如何在Python中检查字符串是否为数字(浮点数)?
  8. 支付宝 android 2.3,app被拒记录-2.3-包含支付宝
  9. 交换机分布缓存_网络交换机缓存在数据中心的作用
  10. 锁定 ASP.NET 配置设定
  11. Linux学习笔记---使用BusyBox创建根文件系统(一)
  12. Windows下将txt导入MySQL及远程连接设置
  13. XML数据结构 SAX 解析
  14. 【06期】单例模式有几种写法?
  15. Edgy Trees CodeForces - 1139C
  16. Java 空格“ ”、空字符串“”和null区别
  17. 让 AE 输出 MPEG
  18. Python数据分析(1)----餐饮订单数据分析
  19. #Ubuntu 历程# guest账户管理
  20. 浙江中级工程师职称评审内容一览

热门文章

  1. 关于硅胶按键丝印的表面问题及解决办法
  2. Java经典好书推荐-从入门到进阶
  3. 梦幻春晚服务器找不到,梦幻西游:春节联欢晚会活动抢先看,一幕幕热闹的画面令人回味无穷...
  4. 如何下载西城区卫星地图高清版大图?
  5. msn用非hotmail邮箱注册!
  6. 手机移动互联网营销(大数据平台系列)
  7. Flume实战-解决零点漂移-时间戳拦截器
  8. 电脑出现不停刷新即Windows资源管理器不停重启的情况(win10)
  9. 工行银企互联接入详解(3)--启动NC
  10. html 打开方式6,教你aspx文件的打开方式