前言
工作内容不多的时候,突然想能不能自己写一个人机对话的程序来打发无聊的时间,一开始的思路是用最简单的input()、print()以及random()来实现,写了一部分,在解决疑难的时候发现可以用tkinter模块实现一个交互式界面,整体思路一样,但显得高端了一些,于是借鉴各位大佬的经验写了一个简单的交互式界面。
一、input、print、random实现简易对话
用input、print进行简单的输入与输出,用random、while循环以及if条件语句增加对话的多样性。
人机对话
代码如下:
import random import time s=input("请输入你的名字:") print("亲爱的%s你好,"%s,"想聊些什么呢?") time.sleep(2) print("emmmmm如果你不知道该怎么开口的话,我来问你吧!") time.sleep(1) A={"榴莲":"留你一生,恋你一世!给你买榴莲的人,一定是最爱你的人!", "芒果":"它代表你是我心中闪耀不灭的光芒、你是我的惟一,当你吃芒果时,特别能体会到爱情的甜美悸动。", "葡萄":"它代表将每个思念你的日子串联在一起!"} B={"蓝色":"喜欢蓝色的女孩,表面上看起来似乎活泼开朗,有说有笑,但是她们内心的苦恼可能只有自己一个人知道,一方面,她们积极上进有好胜心理,责任心强,具有一定的实力和工作能力,看起来似乎很强大。另一方面,她们心思敏感且细腻,洞察力很强,往往能看到问题的本质,因此有时会很痛苦。当她的感性和理性开始争执的时候,自己也会觉得很痛苦,有着典型的双重人格。喜欢蓝色的女孩待人友善、真诚、热心、丈义、爱憎分明但比较但感情用事,是个值得心疼的女孩。", "白色":"喜欢白色的人带着好奇观察周围的人,他们也与周遭浑为一体。 白色给人一种害羞的感觉,但这不是真正的害羞。他们只是在耐心地等待引起别人的注意,看上去很害羞,但实际上他们是非常外向活泼地。"} b=input("你喜欢吃什么水果呢?" "请输入一种:") while b not in A.keys(): if b!=A: print("对不起,宝宝不知道这种水果!请重新输入:") b=input() if b in A: print(A[b]) print("还有什么喜欢吃的水果吗?或者想进入下一个话题?") print("A.有 B.没有") ans = input() if ans == "A": c=input("你喜欢吃什么水果呢?" "请输入一种:") while c not in A.keys(): if c!=A: print("对不起,宝宝没有收录这种水果!请重新输入:") c=input() if c in A: print(A[c]) time.sleep(1) print("好的,了解了,那咱们进入下一个话题") e=input("你喜欢什么颜色呢?") while e not in B.keys(): if e!=B: print("对不起,宝宝不知道这种水果!请重新输入:") e=input() if e in B: print(B[e]) if ans == "B": e=input("你喜欢什么颜色呢?") while e not in B.keys(): if e!=B: print("对不起,宝宝没有收录这种颜色!请重新输入:") e=input() if e in B: print(B[e]) time.sleep(3) print("是不是感觉很无聊?") time.sleep(1) print("咱们接下来做一个性格测试吧!") score = 0 print("你是个不爱说话的人吗?") print("A.不爱说话 B.偶尔不爱说话 C.爱说话 D.非常多话") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("你觉得下面哪种动物代表自己的性格") print("A.小狗 B.兔子 C.猫咪 D.小鸟") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("吃过晚饭后,你一般会选择") print("A.整天 B.散步 C.追剧 D.玩手机") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("送你一栋别墅,你不会期待是在哪的?") print("A.湖边 B.森林 C.大城市 D.景点") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("曾经讨厌的东西,你不会怎样处置?") print("A.专门缴在一个盒子里 B.送人 C.扔掉 D.不记得放哪里了") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("你能说出身边人的心思吗?") print("A.别人不说看不出来 B.可以从话中听得出来 C.表情中能感受到 D.只须一个眼神") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("情侣之间如果没什么感觉了,你不会怎么办?") print("A:离开 B:保持着 C:迷茫 D:找寻新的爱情") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("你讨厌和哪种人做朋友?") print("A:古怪 B.不太聪明的人 C.心思极重的人 D.讨厌责备的人") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("假如用十年的寿命换过去或穿越未来的十天时间,你不会怎么分配?") print("A.返回过去 B.穿过未来 C.过去的就过去了,不得而知的正在经历 D.各去五天") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 print("你对自己的哪里不失望?") print("A.外貌 B.体重 C.品位 D.性别") ans = input() if ans == "A" or ans == "a": score = score + 2 elif ans == "B" or ans == "b": score = score + 3 elif ans == "C" or ans == "c": score = score + 4 else : score = score + 5 if 20<=score<=25 : print ("你是一个不擅于传达,不擅于交际,在外人面前总是很绝望,给人一种冰冷的感觉,但和你熟知的人都告诉,其实你是一个不错相处的人,对待朋友诚恳,热心,很不会照料别人的感觉。性格直率真诚,喜欢那些讨厌说出,生硬的人。个性独立国家,遇到困难想去麻烦别人,总是自己咬牙坚决,尽量自己解决问题。看起来是那种喜静不喜动的人,但内心向往的往往是性刺激,有挑战的事物,有自己的理想和执着,并不会为了自己的梦想去不懈努力奋斗。") elif 26<=score<=32 : print("你是个悲观大力的人,个性开朗外向,讨厌交朋友,爱人去繁华的地方,你总能在聚会中将气氛造就一起。会杞人忧天的去担忧那些还没有再次发生的事,每天维持着大力的心态。对每个人都很热情,你不会为了帮别人的忙去面面俱到。偶尔不会有点冲动,很有可能一腔热血却把事情搞砸,所以做事一定要多特思维,为自身多考虑到") elif 33<=score<=40 : print("你是个性格直率的人,最擅长于的就是与人恋情,朋友很多,行事简洁明了,不拖泥带水,遇上问题也能快速找到问题的所在,并快速寻找解决问题的办法。不管是在什么场合,你都能游刃有余,展现你的沉稳大方。你的悲观开朗,在他人显然总是那么的无忧无虑,样子没什么问题都可以难倒你,但其实你的内心是比较薄弱的,只是你习惯了什么事都一个人抬。") else : print("你是个慎重的人,行事面面俱到,对待身边的朋友非常热情,也很有冷静,是一个很合格的倾听者,但是内心非常薄弱。总是无法用语言表达自己的内心,总把自己的真实点子藏在心里。因为长期的安全感的缺陷,总是惧怕不会和别人产生冲突,从而显得绝望。人不仅要不会做到一个倾听者,也要宣泄自己内心的不无聊,始终压迫自己的点子,内心也不会越来越寂寞、学会的获释自己的压力,有时候能让自己更开朗。") time.sleep(3) print("测试结束,不管怎样都要时常开心。") time.sleep(2) print("看了有趣的剧、吃到好吃的东西、收到爱人的玫瑰......这些都是生活的解药,在这病恹恹的生活里,总有某些时刻会点亮希望,要爱自己哟")
二、tkinter实现交互式界面
用tkinter模块设计登录界面,跳转页面进行交互式操作。
tkinter登录界面
代码如下:
import tkinter as tk
from tkinter.dialog import *
from tkinter import *
import random
def pace2():
root2=tk.Tk()
root2.geometry("300x200")
d=Dialog(None,title='快乐指数',text='2023年的你觉得过的快乐吗?',
bitmap=DIALOG_ICON,default=0,strings=('不快乐','还可以','很快乐'))
if d.num==0:
t=Label(text='name,剩余的时光一起寻找快乐')
t.place(relx=0.5,rely=0.3,anchor=CENTER)
if d.num==1:
t=Label(text='name,要一起追寻更多的快乐')
t.place(relx=0.5,rely=0.3,anchor=CENTER)
if d.num==2:
t=Label(text='name,我们要努力留住现在的快乐')
t.place(relx=0.5,rely=0.3,anchor=CENTER)
bu1=tk.Button(root2,text="关闭",command=lambda:[root2.destroy()])
bu1.place(relx=0.5,rely=0.5,anchor=CENTER)
root2.mainloop()
#生成大写字母、小写字母、数字组成的6位随机验证码
def yzm():
res1=""
res2=""
res3=""
for i in range(2):
num=random.randint(0,9)
res1+=str(num)
num=random.randint(65,91)
res2+=str(chr(num))
num=random.randint(97,123)
res3+=str(chr(num))
string=str(res1+res2+res3)
txt.set(string)
def login():
s1 = text1.get()
s2 = text2.get()
s3 = code1.get()
if s1 == "name" and s2=="password":
root1.destroy()
pace2()
else:
t=Label(text='用户名或密码错误!请重新输入')
t.place(relx=0.5,rely=0.5,anchor=CENTER)
#创建窗口
root1=tk.Tk()
root1.title("登录界面")
root1.geometry("800x500")
#设置账号输入框
ID=Label(root1,text="账号:")
ID.place(relx=0.2,rely=0.2,anchor=CENTER)
text1=Entry(root1)
text1.place(relx=0.5,rely=0.2,anchor=CENTER,width=150,height=25)
#设置密码码输入框
password=Label(root1,text="密码:")
password.place(relx=0.2,rely=0.3,anchor=CENTER)
text2=Entry(root1,show="*")
text2.place(relx=0.5,rely=0.3,anchor=CENTER,width=150,height=25)
#设置验证码输入框
code=Label(root1,text="验证码:")
code.place(relx=0.2,rely=0.4,anchor=CENTER)
code1=Entry(root1)
code1.place(relx=0.5,rely=0.4,anchor=CENTER,width=150,height=25)
#设置验证码按钮
txt=StringVar()
txt.set("获取验证码")
mi=yzm()
codestr=Button(root1,textvariable=txt,command=yzm,fg="red",bg="white")
codestr.place(relx=0.65,rely=0.4,anchor=CENTER)
#设置登录按钮
enter=Button(root1,text="登录",command=login)
enter.place(relx=0.5,rely=0.6,anchor=CENTER)
root1.mainloop()
总结
1.第一部分用input、print进行人机对话的时候没有设置中途结束按钮,要等所有问题回答完成才能结束,后续优化考虑加上。
2.第二部分用tkinter模块的时候,有个BUG就是验证码输不输入都不会影响跳转,原因是我考虑在登录条件中加入验证码的条件,但验证码是随机数,不知道怎么去传递这个参数变成一个判断值,所以把验证码条件删除了正常运行,希望各位大佬可以帮忙解答一下。
3.最终目标是加入机器学习的方法,训练一个对话库来进行交互式操作,实现人机对话,目前还在探索中,希望各位大佬指点指点,分享经验。