本文主要介绍如何用 Python 内置的 tkinter 写一个查询工具。
准备
- 环境Windows 10Python 3.7.3VS Code
- 依赖tkinterpython-Levenshteinfuzzywuzzy
目录结构及运行界面
图1 目录结构图
?
图2 查询界面图
?
图3 查询结果图
具体实现
import tkinter as tk
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from fuzzywuzzy import fuzz
class Window(object):
def __init__(self):
root = tk.Tk()
root.minsize(580, 320) # 窗口大小
root.resizable(width=False, height=False) # False窗口大小不可变
# root.iconbitmap('data/icon.ico') # 无法显示图片
root.title('鲁迅:都是我说的?!') # 窗口标题
label1 = Label(text='句子:') # 标签
label1.place(x=10, y=10, width=80, height=25) # 确定位置
self.line_text = Entry(root) # 单行文本输入
self.line_text.place(x=80, y=10, width=300, height=25)
button = Button(text='开始查询', command=self.inquiry) # 按钮
button.place(x=390, y=10, width=60, height=25)
self.filemenu = tk.StringVar() # 下拉列表
self.file_menu = ttk.Combobox(root, width=12, textvariable=self.filemenu)
# 列表内容
self.file_menu['values'] = ('匹配度: 100%', '匹配度: 90%',
'匹配度: 80%', '匹配度: 70%')
self.file_menu.place(x=460, y=10, width=100, height=25)
self.file_menu.current(0) # 当前显示 100%
label2 = Label(text='查询结果:')
label2.place(x=10, y=100, width=80, height=20)
self.text = Text(root) # 多行文本显示
self.text.place(x=80, y=50, width=480, height=240)
self.paragraphs = self.load_data('data/book.txt') # 数据文件
root.mainloop() # 主循环
'''查询'''
def inquiry(self):
sentence = self.line_text.get() # 获取输入的内容
matched = []
score_thresh = self.get_score_thresh()
self.text.delete(1.0, tk.END) # 用于删除后续显示的文件
if not sentence: # 没有输入句子就查询,会出现弹窗警告
messagebox.showinfo("Warning", '请先输入需要查询的鲁迅名言')
else:
for p in self.paragraphs:
score = fuzz.partial_ratio(p, sentence)
if score >= score_thresh and len(sentence) <= len(p):
matched.append([score, p])
infos = []
# 查找相匹配的内容
for match in matched:
infos.append('[匹配度]: %d
[内容]: %s
' % (match[0], match[1]))
if not infos:
infos.append('未匹配到任何相似度大于或等于%d的句子,请修改匹配度.
' % score_thresh)
# 查找到的内容插入文本,并显示
self.text.insert('insert', '
'.join(infos)[:-1])
'''根据下拉列表获取匹配度'''
def get_score_thresh(self):
if self.file_menu.current() == 0:
return 100
elif self.file_menu.current() == 1:
return 90
elif self.file_menu.current() == 2:
return 80
elif self.file_menu.current() == 3:
return 70
'''数据导入'''
def load_data(self, data_path):
paragraphs = []
with open(data_path, 'r', encoding='utf-8') as f:
for line in f.readlines():
if line.strip():
paragraphs.append(line.strip('
'))
return paragraphs
if __name__ == '__main__':
Window()
小结
- 本文借鉴地址:https://github.com/CharlesPikachu/Tools/tree/master/luxunSentencesQuery 此地址代码基于 PyQt5 模块,Python 版本为 3.6。由于我的 Python 版本为3.7,兼容存在问题,所以我用tkinter 模块改写了代码。原地址教程很详细,感兴趣,可以尝试 PyQt5。
- 以鲁迅全集为例,通过一句话,查询是否为鲁迅所说。您可以替换成自己想要查询的人物,或者其他资料。
- 小问题窗口默认图标为羽毛,这里想要设置自定义图标,通过以下代码 root.iconbitmap('data/icon.ico'),并不能成功,修改图片格式为 .jpg 仍不能成功,各位如能解决,劳烦告知,谢谢。