用Python中的tkinter模块构建简易的登录、交互式界面,人机对话


前言

        工作内容不多的时候,突然想能不能自己写一个人机对话的程序来打发无聊的时间,一开始的思路是用最简单的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.最终目标是加入机器学习的方法,训练一个对话库来进行交互式操作,实现人机对话,目前还在探索中,希望各位大佬指点指点,分享经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值