用Python给男朋友写了个小程序,需要帐号和密码才能登陆,里面是几道恋爱回忆题和我想对他说的话。虽说是很多人玩剩下的,但对我这个新手来说,已经用尽毕生绝学了!!!
⬆️打开后的界面长这样,标题是《欢迎来到沙雕世界》,因为我俩经常互称对方沙雕。中间的图片是我画的他,嗯,感觉和标题非常地相称。
我把帐号和密码的提示放到了蚂蚁森林爱情树的留言板里,这样他浇水的时候可以看到(结果并没有,还是我又提示了一遍 )
⬆️上图已经输完了帐号密码。中间的沙雕照其实是个按钮,点击一下就可以进入了(那个猪还问我按回车怎么动不了)。注意鼠标移到那里,光标会变成爱心形状的嗷,这是设计过程中的一个小小彩蛋( ´▽`)
⬆️进入之后的样子,一张少女心里掺着点沙雕气质的告示,点粉色的按钮就可以进入下一个画面。
请忽略我的彩虹屁......
⬆️之后就是这样的题目了,一般答案用脚趾想想就能猜到,都是我们两个的回忆。只不过怎么输入需要斟酌一下,毕竟要一字不差才行,程序可是很严格的,哈哈哈哈当命题老师的感觉有点好。
再贴几个题目上来一直想种胡杨
吃了好多雪胖子
因为时间超级紧,一共只出了7道题,出题质量也不是那么的高,害,我快抓破脑袋了!!!
话我就码掉啦
⬆️答完所有题,最后就是我想对他说的话,点击按钮可以重新回到输入帐号密码的地方,真是完美的闭环
男朋友说这个很像解谜游戏,整个过程就是他一边向我求助,一边试答案,最后通关了还是很开心的,这是“属于我们两个的秘密”~~~
————————————————分割线
严格意义上来说,这是我写出的第一个Python程序,之前写过的,跳出来都是黑乎乎的控制台,没有这样可爱的界面。所以还是很有成就感的,特别是它还发给了喜欢的人!
GUI工具用的是Python内置的tkinter,打包则是pyinstaller,用了最简单的方式(-F -w),由于技术有限(琢磨了好多教程帖还是不行,遂放弃了先),没有把图片资源打包进去,而是直接把打包完成的exe文件和图片放到了一个文件夹里,这样对方也可以直接打开。
之前学过廖大的Python教程(学到了一半),又看了《Python教程:从入门到实践》的基础部分,有一点基础在的。在设计这个程序的时候,则参考了《Python GUI设计:tkinter菜鸟教程》和一些大神写的技术教程。
————————————————分割线
感谢大家喜欢!我把代码修改成通用版本,贴在下面,有需要的话请自取~
from tkinter import *
class basedesk():
def __init__(self,master):
self.root=master
self.root.config()
self.root.title("改成你程序的名字")
self.root.geometry("400x350")
initface(self.root)
class initface():
def __init__(self,master):
self.master=master
self.master.config()
self.initface=Frame(self.master)
self.initface.pack()
self.photo=PhotoImage(file='改成你所加图片的文件名,xxx.gif')#注意这个照片要gif格式,和py文件同一文件夹
logo=Button(self.initface,image=self.photo,
cursor='heart',command=self.change)
label0=Label(self.initface,text='改成界面上方的一行字',
bg='#fae3d9',fg='#1e2022',
font='TIMES 15 bold',
cursor='star')
label1=Label(self.initface,text='账号',
bg='#fae3d9',fg='#1e2022',
width=4,
font='宋体 13 bold',
cursor='star')
label2=Label(self.initface,text='密码',
bg='#fae3d9',fg='#1e2022',
width=4,
font='宋体 13 bold',
cursor='star')
self.x=StringVar()
message1=Entry(self.initface,textvariable=self.x,width=31)
self.y=StringVar()
message2=Entry(self.initface,textvariable=self.y,width=31,show='*')
label0.grid(row=0,column=0,columnspan=2,padx=5,pady=10)
logo.grid(row=1,column=0,columnspan=2,padx=10,pady=10)
label1.grid(row=2,column=0,pady=10)
message1.grid(row=2,column=1,pady=10)
label2.grid(row=3,column=0,pady=0)
message2.grid(row=3,column=1,pady=0)
def change(self):
if self.x.get()=='改成你所设置的账号' and self.y.get()=='改成你所设置的密码':
self.initface.destroy()
face0(self.master)
class face0():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face0=Frame(self.master)
self.face0.pack()
label=Label(self.face0,text='改成\n\n你要做的告示\n\n',#\n是用来给你的话换行的,相当于回车键的作用
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face0,text='改成设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
label.grid(row=0,column=0,padx=20,pady=20)
btn.grid(row=1,column=0,pady=10)
def back(self):
self.face0.destroy()
face1(self.master)
class face1():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face1=Frame(self.master)
self.face1.pack()
label3=Label(self.face1,text='改成\n\n问题1\n\n',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face1,text='改成你要设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
self.z=StringVar()
message3=Entry(self.face1,textvariable=self.z,width=20)
label3.grid(row=0,column=0,columnspan=2,padx=10,pady=30)
message3.grid(row=1,column=0,padx=10,pady=10)
btn.grid(row=1,column=1,padx=10,pady=10)
def back(self):
if self.z.get()=='改成问题1的答案':
self.face1.destroy()
face2(self.master)
class face2():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face2=Frame(self.master)
self.face2.pack()
label=Label(self.face2,text='改成\n\n问题2\n\n',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face2,text='改成设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
self.a=StringVar()
message3=Entry(self.face2,textvariable=self.a,width=20)
label.grid(row=0,column=0,columnspan=2,padx=10,pady=30)
message3.grid(row=1,column=0,padx=10,pady=10)
btn.grid(row=1,column=1,padx=10,pady=10)
def back(self):
if self.a.get()=='改成问题2的答案':
self.face2.destroy()
face3(self.master)
class face3():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face3=Frame(self.master)
self.face3.pack()
label=Label(self.face3,text='改成\n\n问题3\n\n',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face3,text='改成设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
self.a=StringVar()
message3=Entry(self.face3,textvariable=self.a,width=20)
label.grid(row=0,column=0,columnspan=2,padx=10,pady=30)
message3.grid(row=1,column=0,padx=10,pady=10)
btn.grid(row=1,column=1,padx=10,pady=10)
def back(self):
if self.a.get()=='改成问题3的答案':
self.face3.destroy()
face4(self.master)
class face4():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face4=Frame(self.master)
self.face4.pack()
label=Label(self.face4,text=
'改成\n\n问题4\n\n',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face4,text='改成设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
self.a=StringVar()
message3=Entry(self.face4,textvariable=self.a,width=20)
label.grid(row=0,column=0,columnspan=2,padx=10,pady=30)
message3.grid(row=1,column=0,padx=10,pady=10)
btn.grid(row=1,column=1,padx=10,pady=10)
def back(self):
if self.a.get()=='改成问题4的答案':
self.face4.destroy()
face5(self.master)
class face5():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face5=Frame(self.master)
self.face5.pack()
label=Label(self.face5,text=
'改成\n\n问题5\n\n',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face5,text='改成设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
self.a=StringVar()
message3=Entry(self.face5,textvariable=self.a,width=20)
label.grid(row=0,column=0,columnspan=2,padx=10,pady=30)
message3.grid(row=1,column=0,padx=10,pady=10)
btn.grid(row=1,column=1,padx=10,pady=10)
def back(self):
if self.a.get()=='改成问题5的答案':
self.face5.destroy()
face6(self.master)
class face6():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face6=Frame(self.master)
self.face6.pack()
label=Label(self.face6,text=
'改成\n\n问题6\n\n',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face6,text='改成设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
self.a=StringVar()
message3=Entry(self.face6,textvariable=self.a,width=20)
label.grid(row=0,column=0,columnspan=2,padx=10,pady=30)
message3.grid(row=1,column=0,padx=10,pady=10)
btn.grid(row=1,column=1,padx=10,pady=10)
def back(self):
if self.a.get()=='改成问题6的答案':
self.face6.destroy()
face7(self.master)
class face7():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face7=Frame(self.master)
self.face7.pack()
label=Label(self.face7,text=
'改成\n\n问题7\n\n',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=300,justify='left',
padx=20,pady=20)
btn=Button(self.face7,text='改成设置的按钮名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
self.a=StringVar()
message3=Entry(self.face7,textvariable=self.a,width=20)
label.grid(row=0,column=0,columnspan=2,padx=10,pady=30)
message3.grid(row=1,column=0,padx=10,pady=10)
btn.grid(row=1,column=1,padx=10,pady=10)
def back(self):
if self.a.get()=='改成问题7的答案':
self.face7.destroy()
face8(self.master)
class face8():
def __init__(self,master):
self.master=master
self.master.config(bg='#f0f0f0')
self.face8=Frame(self.master)
self.face8.pack()
label=Label(self.face8,text='改成最后你想说的话',
bg='#bbded6',fg='#f8f3d4',
font='宋体 13 bold',cursor='star',
wraplength=350,justify='left',
padx=20,pady=20)
btn=Button(self.face8,text='改成返回按钮的名字',command=self.back,
bg="#ffb6b9",cursor='heart',
font='宋体 13 bold',
padx=3,pady=3)
label.grid(row=0,column=0,padx=10,pady=20)
btn.grid(row=1,column=0,pady=10)
def back(self):
self.face8.destroy()
initface(self.master)
if __name__=='__main__':
root=Tk()
basedesk(root)
root.mainloop()
备注:“改成”两字开头的句子,引号里面的语句都是可以修改的,可以按照提示来。#后面的语句也是提示,不会影响代码的使用。
————————————————8.16更新
整理了一些大家的问题贴到这里
Q1:求分享代码
A1:朋友们我的代码就放在上面呀,灰灰的区域!
Q2:是python小白怎么办
A2:可以一步一步来,先下载Python,网上有很多教程帖。然后在编辑器里粘贴上面的代码,再按照备注进行修改。
Q3:除了下python还要准备什么东西
A3:账号和密码,7个问题和答案,还有一张gif格式的图片。另外我试过python3.7和3.8版本,都是可以成功运行的。
————————————————11.25更新
Q4:是在哪里进行编辑
我用的python自带的编辑器(当然也可以用pycharm等),需要在原页面的基础上新建一个空白窗口,把代码粘贴到上面,按照备注修改后保存为py文件。
Q5:最最最常见的一个报错“couldn't recognize data in image file 'xxx.gif'”
这是程序找不到gif文件啦,需要注意:
①py文件和gif图片是否在一个文件夹,没有的话要放在一起
②图片不能通过修改后缀的方式改成gif,最好原本就是gif格式,或者试试用ps进行格式转换
③图片的命名最好以字母或数字为主
Q6:对方电脑没下python怎么打开
用pyinstaller打包为exe程序,网上有相关的教程可以参考,输入关键词pyinstaller即可找到
————————————————
然后,圣诞节还有新年快到啦,
再跟大家分享一些可以搭配这个小程序送出去的礼物,兼具浪漫和实用:
1.芙倍丽鼻毛修剪器
我个人感觉,这是一份让对方意想不到,但收到后能感受到你贴心度的礼物,因为帮他注意到了很细节的地方。
相比于剪刀,修剪器更加专业也更安全,因为它把刀片设计在刀头的内侧,修剪的时候刀片不会触碰到皮肤,非常安全。而且它圆拱形刀头设计特别贴合鼻腔结构,使用起来无障碍又利落,短短10s就可以完成日常的修剪。像一支笔,外出旅行也方便携带
这款外观是男孩子会喜欢的高级磨砂质感,而且不管是使用还是携带都很方便,之后也容易让他更加注意仪容仪表。
2.春风十里『苦尽』香水
自从知道春风十里这个香水品牌后,我已经在两个回答里安利过它了。一个新晋国货品牌,香如其名,充满诗意的感觉。
这瓶乌木沉香叫做『苦尽』,茶香带点淡淡的烟草味,入鼻会有一丝苦味,但接着是微甜,带给人很安心的感觉。
有苦尽,有甘来,所以我觉得很适合送给正在考研、等offer的男朋友,祝他心想事成,早日上岸!价格对学生党也很友好。
『既然已经苦尽,那么人生中的甜也不会太远。』可以附上这句话一起送给他。
ps:之前在“男生一般喜欢什么礼物”这个问题下,用python爬取过400+条回答,然后用jieba库作了一个词频统计分析,然后发现,香水是提及次数第三多的一样东西,详情可以点击下面的链接↓↓↓男生一般会喜欢什么礼物?www.zhihu.com
所以,如果觉得男朋友比较精致的话,放心大胆地送。