在 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()
所以...我想将我的控制台聊天机器人变成 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()