# 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()