所以...我想把我的控制台聊天机器人变成一个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) 谢谢!
答案 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