在 python 中使用 tkinter 为我的简单聊天机器人创建简单的图形用户界面时遇到问题

Having trouble using tkinter in python to create a simple gui for my simple 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) 谢谢!

这段代码还有很大的改进空间,但这应该能让您朝着正确的方向前进。

这是编写良好的 Tkinter 代码中的常见约定 import tkinter as tk。这让我们可以写 tk 而不是 tkinter,这样可以节省输入,并且如果我们需要的话,可以很容易地将 Python 2 上的代码更改为 运行:将导入语句更改为 import Tkinter as tk。它比 from tkinter import * 好得多,因为它让我们看到我们从 Tkinter 导入了哪些名称,并且它不会将超过一百个名称转储到我们的命名空间中。

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

我们创建了一个 Label 小部件来保存机器人的响应文本,我们可以使用 Labels.config` 方法对其进行更新。

import random
import tkinter as tk

root = tk.Tk()
user_input = tk.Entry(root)
user_input.pack()

greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!', 'hey']
question = ['How are you?', 'How are you doing?']
responses = ['Okay', "I'm fine"]
huh = "I did not understand what you said"

def cb():
    user_text = user_input.get()
    if user_text in greetings:
        bot_text = random.choice(greetings)
    elif user_text in question:
        bot_text = random.choice(responses)
    else:
        bot_text = huh
    output.config(text=bot_text)

button = tk.Button(root, text="Enter", command=cb)
button.pack()

output = tk.Label(root, text='')
output.pack()

tk.mainloop()

习惯 GUI 编程需要一点时间,因为控制流不是您习惯的控制台编程。使用控制台中 运行s 的代码,代码会在它想做的时候做它想做的事情,然后用户响应。在 GUI 代码中,我们设置所有内容,然后等待用户操作生成的事件,然后我们的代码响应这些操作。这叫做event-driven programming。虽然一开始可能有点迷失方向,但通过练习,您很快就会掌握窍门。 ;)


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

这是新版本:

import random
import tkinter as tk

root = tk.Tk()
user_input = tk.Entry(root)
user_input.pack()

greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!', 'hey']
question = ['How are you?', 'How are you doing?']
responses = ['Okay', "I'm fine"]
huh = "I did not understand what you said"

def cb(event):
    user_text = user_input.get()
    if user_text in greetings:
        bot_text = random.choice(greetings)
    elif user_text in question:
        bot_text = random.choice(responses)
    else:
        bot_text = huh
    output.config(text=bot_text)

user_input.bind("<Return>", cb)
output = tk.Label(root, text='')
output.pack()

tk.mainloop()