利用ChatGPT辅助编写程序——问答系统

本文将介绍如何使用Python和Tkinter库编写一个带有问题和答案数据的简单问答系统,并利用ChatGPT辅助编写。

准备工作

在编写代码之前,需要准备一个包含问题和答案的txt文件,每个问题和答案占两行,且问题和答案之间没有其他内容。例如:

1
2
3
4
什么是Python?
Python是一种高级编程语言。
什么是Tkinter?
Tkinter是Python自带的GUI库。

读取txt文件中的数据

首先,我们需要定义一个函数,用于读取txt文件中的数据。在该函数中,我们使用with open()语句打开txt文件,使用read()函数读取文件内容,并使用splitlines()函数将内容按行分割为一个列表。然后,我们遍历这个列表,将每两行作为一组数据,将问题和答案分别存储为一个字典,最后将这个字典返回。

1
2
3
4
5
6
7
8
9
10
11
import re

def read_txt_file(filename):
with open(filename, 'r', encoding='utf-8') as f:
data = f.read().splitlines()
question_dict = {}
for i in range(0, len(data), 2):
question = data[i].strip().lower()
answer = data[i+1].strip()
question_dict[question] = answer
return question_dict

获取问题对应的答案

接下来,我们需要定义一个函数,用于获取问题对应的答案。在该函数中,我们首先将输入的问题去除空格并转换为小写字母,并使用[:100]截取前100个字符,以便匹配速度更快。然后,我们使用正则表达式将问题中的空格替换为.*,这样就可以进行关键词匹配了。最后,我们遍历存储问题和答案的字典,使用re.search()函数匹配关键词,如果匹配成功,则返回对应的答案。

1
2
3
4
5
6
7
def get_answer(question, question_dict):
question = question.strip().lower()[:100]
pattern = '.*'.join(question.split())
for key in question_dict.keys():
if re.search(pattern, key):
return question_dict[key]
return None

创建GUI界面

对于 GUI 的创建,我们创建了一个标签对象,用于显示问题,一个输入框对象,用于输入问题,一个按钮对象,用于获取答案,以及一个标签对象,用于显示答案。接下来,我们需要将这些对象放置在窗口中,同时还需要对这些对象进行一些设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建一个标签对象,用于显示问题
question_label = tk.Label(window, text='请输入问题:', font=('微软雅黑', 20))
question_label.grid(row=0, column=0, padx=10, pady=10)

# 创建一个输入框对象,用于输入问题
question_entry = tk.Entry(window, font=('微软雅黑', 20))
question_entry.grid(row=0, column=1, padx=10, pady=10)

# 创建一个按钮对象,用于获取答案
button = tk.Button(window, text='获取答案', font=('微软雅黑', 20), command=lambda: answer_label.config(
text=get_answer(question_entry.get(), question_dict)))
button.grid(row=0, column=2, padx=10, pady=10)

# 创建一个标签对象,用于显示答案
answer_label = tk.Label(window, text='', font=('微软雅黑', 20))
answer_label.grid(row=1, column=0, columnspan=3, padx=10, pady=10)

在这里,我们通过 grid 函数将每个对象放置在窗口的指定行和列位置。padxpady 参数用于设置对象的水平和垂直间距。columnspan 参数用于将答案标签跨越多列,使其占据整个窗口的宽度。

为了使窗口始终处于顶部,我们还使用了 attributes 函数,并将 '-topmost' 参数设置为 True。最后,我们使用 mainloop 函数进入消息循环,等待用户输入问题。

总结

在本文中,我们使用 Python 和 Tkinter 库编写了一个问答系统,并使用 ChatGPT 辅助开发这个系统。我们使用了一个 GUI,包括标签、输入框、按钮和标签等对象,用于输入问题、获取答案和显示答案。我们还实现了一个函数,用于读取 txt 文件中的数据,并实现了一个函数,用于获取问题对应的答案。最后,我们进入了消息循环,等待用户输入问题并获取答案。

在实际开发中,我们可以进一步优化这个问答系统,例如使用更先进的自然语言处理技术,支持多语言输入和输出,提供更加友好的界面等。

注意:ChatGPT一般不会一次性完成你想要的程序效果,必须学会进行有效的提问,让AI能够准确get你的需求

完整程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 导入Tkinter、re模块
import re
import tkinter as tk

# 定义一个函数,用于读取txt文件中的数据


def read_txt_file(filename):
with open(filename, 'r', encoding='utf-8') as f:
data = f.read().splitlines()
question_dict = {}
for i in range(0, len(data), 2):
question = data[i].strip().lower() # 获取问题并去除空格和换行符
answer = data[i+1].strip() # 获取答案并去除空格和换行符
question_dict[question] = answer
return question_dict


# 定义一个函数,用于获取问题对应的答案

def get_answer(question, question_dict):
question = question.strip().lower()[:100] # 去除空格并转换为小写字母,并截取前100个字符
pattern = '.*'.join(question.split()) # 将空格替换为.*
for key in question_dict.keys():
if re.search(pattern, key):
return question_dict[key]
return None


# 创建一个窗口对象
window = tk.Tk()
window.title('问答系统')
window.geometry('800x100')

# 创建一个标签对象,用于显示问题
question_label = tk.Label(window, text='请输入问题:', font=('微软雅黑', 20))
question_label.grid(row=0, column=0, padx=10, pady=10)

# 创建一个输入框对象,用于输入问题
question_entry = tk.Entry(window, font=('微软雅黑', 20))
question_entry.grid(row=0, column=1, padx=10, pady=10)

# 创建一个按钮对象,用于获取答案
button = tk.Button(window, text='获取答案', font=('微软雅黑', 20), command=lambda: answer_label.config(
text=get_answer(question_entry.get(), question_dict)))
button.grid(row=0, column=2, padx=10, pady=10)

# 创建一个标签对象,用于显示答案
answer_label = tk.Label(window, text='', font=('微软雅黑', 20))
answer_label.grid(row=1, column=0, columnspan=3, padx=10, pady=10)

# 读取txt文件中的数据
question_dict = read_txt_file('data.txt')

# 让窗口总在前端
window.attributes('-topmost', True)

# 进入消息循环
window.mainloop()

程序效果示例

v5.png