gpt4 book ai didi

python - 在 python 中使用 tkinter 为我的简单聊天机器人创建一个简单的 gui 时遇到问题

转载 作者:行者123 更新时间:2023-12-01 02:44:15 26 4
gpt4 key购买 nike

所以...我想将我的控制台聊天机器人变成 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 语句更改为 import Tkinter as tk 。这比 from tkinter import *得多 ,因为它可以让我们看到从 Tkinter 导入的名称,并且它不会将超过一百个名称转储到我们的命名空间中。

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

我们创建一个标签小部件来保存机器人的响应文本,我们可以使用标签 s 更新它。 .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 编程,因为控制流不是您习惯的控制台编程。对于在控制台中运行的代码,代码会在需要时执行其想要执行的操作,并且用户会做出响应。在 GUI 代码中,我们设置所有内容,然后等待用户操作生成的事件,然后我们的代码响应这些操作。这称为event-driven programming 。尽管一开始可能会有点迷失方向,但通过练习,您很快就会掌握窍门。 ;)

<小时/>

我们真的不需要那个按钮。相反,我们可以将回调绑定(bind)到 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()

关于python - 在 python 中使用 tkinter 为我的简单聊天机器人创建一个简单的 gui 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45387453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com