无法在python中使用tkinter为我的简单聊天机器人创建一个简单的gui

时间:2017-07-29 09:02:57

标签: python tkinter chatbot

所以...我想把我的控制台聊天机器人变成一个GUI聊天机器人,每当我这样做时似乎永远不会工作...生病粘贴原始代码(在控制台中运行)然后我会粘贴相同的代码但添加了一些tkinter代码将其变成gui而不是控制台应用程序(只是再次澄清,我的gui代码真的不起作用)。我在gui代码中的错误是什么以及如何使它工作。

import random
#THIS IS THE CONSOLE APP CODE
greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!','hey']
random_greeting = random.choice(greetings)

question = ['How are you?','How are you doing?']
responses = ['Okay',"I'm fine"]
random_response = random.choice(responses)


while True:
    userInput = input(">>> ")
    if userInput in greetings:
        print(random_greeting)
    elif userInput in question:
        print(random_response)
    else:
        print("I did not understand what you said")

好吧,这是我尝试的潜在gui代码

import random
import tkinter
#GUI CODE
t = tkinter.Tk()
userInput = tkinter.Entry(t)
userInput.pack()
def cb():
    greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!','hey']
    random_greeting = random.choice(greetings)

    question = ['How are you?','How are you doing?']
    responses = ['Okay',"I'm fine"]
    random_response = random.choice(responses)


    while True:
        if 'hello' in userInput.get():
            lab = tkinter.Label(t,text =random_greeting)
            lab.pack()
        elif 'how are you' in userInput.get():
            labb = tkinter.Label(t,text =random_response)
            labb.pack()
        else:
            labc = tkinter.Label(t,text ="I did not understand what you said")
            labc.pack()
button = tkinter.Button(t, text="Enter",command=  cb)
button.pack()

tkinter.mainloop()

(这个聊天机器人代码的目的是为了让我能更好地理解GUI) 谢谢!

1 个答案:

答案 0 :(得分:1)

此代码还有很大的改进空间,但这可以让您朝着正确的方向前进。

这是使用精心编写的Tkinter代码执行import tkinter as tk的常见惯例。这让我们可以编写tk而不是tkinter来节省输入,并且如果我们需要这样做,可以很容易地将代码更改为在Python 2上运行:只需将import语句更改为{{1 }}。它比<{1}}更好 ,因为它可以让我们看到我们从Tkinter导入的名称,并且它不会超过一百个命名到我们的命名空间。

正如PRMoureu在评论中提到的,我们在回调函数中不需要import Tkinter as tk循环:我们只需要在用户按下时响应Entry小部件中的字符串按钮。

我们创建一个Label小部件来保存机器人的响应文本,我们可以使用Label from tkinter import *。config`方法更新它。

while

习惯GUI编程需要一点时间,因为控制流程不是您从控制台编程中习惯的。使用在控制台中运行的代码,代码执行它想要执行的操作,何时执行,以及用户响应。在GUI代码中,我们设置了所有内容,然后等待用户操作生成的事件,然后我们的代码响应这些操作。这称为event-driven programming。虽然起初可能有点迷惑,但通过练习,你很快就会掌握它。 ;)

我们真的不需要那个按钮。相反,我们可以将回调绑定到Entry小部件,以便在Entry小部件中按下 Enter 键时调用它。我们必须修改回调的签名,因为它现在会在调用时收到一个Event对象。但是我们不需要更改回调函数体内的任何内容,因为我们实际上并没有使用Event对象中的数据。

这是新版本:

s