You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
main/ui.py

210 lines
8.5 KiB

# ui.py 文件
import tkinter as tk
import threading
import sys
sys.path.append(r"./datas")
from calculate import *
class GUI:
def __init__(self):
self.root = tk.Tk()
self.root.title('图书查询系统')
self.root.geometry("600x800")
self.root.configure(bg='#f0f0f0')
self.create_widgets()
self.setup_layout()
def create_widgets(self):
"""创建所有界面组件"""
# 主框架
self.main_frame = tk.Frame(self.root, padx=20, pady=20, bg='#f0f0f0')
# 标题
self.title_label = tk.Label(self.main_frame,
text="图书ISBN查询系统",
font=('微软雅黑', 16, 'bold'),
bg='#f0f0f0')
# 输入区域
self.input_frame = tk.Frame(self.main_frame, bg='#f0f0f0')
self.input_label = tk.Label(self.input_frame,
text="请输入ISBN:",
font=('微软雅黑', 10),
bg='#f0f0f0')
self.entry00 = tk.StringVar()
self.entry = tk.Entry(self.input_frame,
textvariable=self.entry00,
font=('微软雅黑', 10),
width=30,
relief=tk.GROOVE,
borderwidth=2)
# 查询按钮
self.query_button = tk.Button(self.main_frame,
text="查询",
command=self.start,
font=('微软雅黑', 10),
bg='#4CAF50',
fg='white',
activebackground='#45a049',
padx=15,
pady=5)
# 结果区域
self.result_frame = tk.Frame(self.main_frame,
bg='white',
relief=tk.GROOVE,
borderwidth=1)
# 添加滚动条
self.scrollbar = tk.Scrollbar(self.result_frame)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 使用Text组件替代Label以便支持滚动
self.result_text = tk.Text(self.result_frame,
yscrollcommand=self.scrollbar.set,
font=('微软雅黑', 10),
wrap=tk.WORD,
bg='white',
padx=10,
pady=10)
self.result_text.pack(expand=True, fill='both')
self.scrollbar.config(command=self.result_text.yview)
# 初始文本
self.result_text.insert(tk.END, "查询结果将显示在这里...")
self.result_text.config(state=tk.DISABLED) # 设置为只读
# 添加模糊搜索按钮
self.fuzzy_button = tk.Button(self.main_frame,
text="模糊搜索",
command=self.fuzzy_search,
font=('微软雅黑', 10),
bg='#2196F3', # 蓝色按钮
fg='white',
activebackground='#0b7dda',
padx=15,
pady=5)
# 添加模糊搜索输入框
self.fuzzy_entry00 = tk.StringVar()
self.fuzzy_entry = tk.Entry(self.input_frame,
textvariable=self.fuzzy_entry00,
font=('微软雅黑', 10),
width=30,
relief=tk.GROOVE,
borderwidth=2)
def setup_layout(self):
"""设置组件布局"""
self.main_frame.pack(expand=True, fill='both')
self.title_label.pack(pady=(0, 20))
# 输入区域布局
self.input_frame.pack(pady=10)
self.input_label.grid(row=0, column=0, padx=5)
self.entry.grid(row=0, column=1, padx=5)
# 按钮和结果区域
self.query_button.pack(pady=15)
self.result_frame.pack(fill='both', expand=True, pady=(10,0))
# 删除下面这行
# self.result_label.pack(expand=True, fill='both')
# 添加模糊搜索输入框和按钮布局
tk.Label(self.input_frame,
text="模糊搜索:",
font=('微软雅黑', 10),
bg='#f0f0f0').grid(row=1, column=0, padx=5)
self.fuzzy_entry.grid(row=1, column=1, padx=5)
self.fuzzy_button.pack(pady=10)
def fuzzy_search(self):
"""处理模糊搜索按钮点击事件"""
keyword = self.fuzzy_entry00.get().strip()
if not keyword:
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, "请输入搜索关键词")
self.result_text.config(state=tk.DISABLED)
return
self.fuzzy_button.config(state=tk.DISABLED, text="搜索中...")
self.root.update()
try:
results = fuzzy_search_book(keyword)
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
if isinstance(results, str):
self.result_text.insert(tk.END, results)
else:
formatted_results = "\n\n".join(
"\n".join(f"{k}: {v}" for k, v in book.items())
for book in results
)
self.result_text.insert(tk.END, formatted_results)
self.result_text.config(state=tk.DISABLED)
except Exception as e:
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, f"搜索出错: {str(e)}")
self.result_text.config(state=tk.DISABLED)
finally:
self.fuzzy_button.config(state=tk.NORMAL, text="模糊搜索")
def start(self):
"""处理查询按钮点击事件"""
isbn = self.entry00.get().strip()
if not isbn:
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, "请输入ISBN编号")
self.result_text.config(state=tk.DISABLED)
return
# 禁用按钮防止重复点击
self.query_button.config(state=tk.DISABLED, text="查询中...")
self.root.update() # 强制更新界面
try:
result = query_isbn(isbn)
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
if isinstance(result, dict):
formatted_result = "\n".join(f"{k}: {v}" for k, v in result.items())
self.result_text.insert(tk.END, formatted_result)
else:
self.result_text.insert(tk.END, result)
self.result_text.config(state=tk.DISABLED)
except Exception as e:
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, f"查询出错: {str(e)}")
self.result_text.config(state=tk.DISABLED)
finally:
# 恢复按钮状态
self.query_button.config(state=tk.NORMAL, text="查询")
def display_results(self, results):
"""以表格形式显示查询结果"""
# 清空原有内容
self.result_text.config(state=tk.NORMAL)
self.result_text.delete(1.0, tk.END)
if isinstance(results, str) or (isinstance(results, list) and len(results) == 1 and isinstance(results[0], str)):
# 处理错误信息
self.result_text.insert(tk.END, results if isinstance(results, str) else results[0])
else:
# 创建表格形式的文本
for book in results:
for key, value in book.items():
self.result_text.insert(tk.END, f"{key}: {value}\n")
self.result_text.insert(tk.END, "\n")
self.result_text.config(state=tk.DISABLED) # 恢复为只读
if __name__ == '__main__':
app = GUI()
app.root.mainloop()