精华5
阅读权限90
最后登录2025-6-21
在线时间141 小时
累计签到:377 天 连续签到:1 天
域主
名望- 126 点
星币- 6580 枚
星辰- 15 颗
好评- 328 点
|
注册登录后全站资源免费查看下载
您需要 登录 才可以下载或查看,没有账号?立即注册
×
最近各种网课答题,奈何题库各种格式的都用,整理起来很麻烦,在网上一直没找到很合适的搜索本地题库工具。正好中奖了一枚阿水AI的账户,遂用AI辅/助编写一个本地题库划词搜索辅/助小程序。
通过给AI描述需求,生成框架,让标注好每一句的注释,再一边学习一遍调试,不断和AI沟通bug和解决方案,断断续续历时一个星期,终于能比较顺畅的使用。
本欢心喜地的发布到原创区,却遭当头一棒,遭删帖,答复:AI参与的不算原创。
心灰意冷,本打算就此作罢。然思索许久,似吾等普罗大众也,或难以靠自己编写出一个在大神眼里像小孩玩具的小程序,但仍为吾心血,遂再次发布,予各位方便。
帮助文档
1. 使用指南:
- 加载题库:点击'加载题库'按钮可以选择多个题库加载
- 开始监控:点击'开始监控'按钮以监控剪贴板内容。
- 透明度调节:使用滑动条调整窗口透明度。
2. 功能说明:
- 本程序用于文件内容搜索,题库支持doc,docx,txt,xls,xlsx。
- 题库内容没有固定格式,题目、选項和答案尽量放在一起。
- 剪贴板监控功能可自动检测并搜索新的剪贴板内容。
- 该程序自动置顶,可用于测试进行中不允许切换页面的程序。

https://wwtm.lanzouq.com/ircNm2d4ncgb
密码:52pj
源代码
- import os # 用于文件路径操作
- import pyperclip # 用于剪贴板操作
- import re # 用于正则表达式操作
- import tkinter as tk # 用于创建GUI
- from tkinter import filedialog, scrolledtext, messagebox # GUI部件
- from docx import Document # 用于读取Word文档
- import openpyxl # 用于读取Excel文件
- import xlrd # 用于读取旧版Excel文件
- from win32com import client # 用于操作Word文档
- import threading # 用于线程操作
- from concurrent.futures import ThreadPoolExecutor # 用于线程池操作
- import time # 用于时间操作
-
- # 初始化全局变量
- file_content = [] # 用于存储文件内容的列表
- monitoring = False # 剪贴板监控状态标志
- initial_clipboard_content = '' # 用于记录初始剪贴板内容
- root = tk.Tk() # 创建Tkinter主窗口
- text_display = None # 用于显示结果的文本框
- toggle_button = None # 用于切换监控的按钮
- keyword_var = tk.StringVar(root) # 关键词的Tkinter变量
- result = tk.StringVar(root) # 状态信息的Tkinter变量
-
- def create_gui():
- """创建GUI界面"""
- global text_display, toggle_button
- root.title("划词搜索1.0-本地题库版") # 设置窗口标题
- root.geometry("450x370") # 设置窗口大小
- root.attributes('-topmost', True) # 窗口置顶
-
- tk.Label(root, text="当前剪贴板内容:").pack(pady=5) # 显示剪贴板内容标签
- tk.Entry(root, textvariable=keyword_var, width=50).pack(pady=5) # 输入框绑定关键词变量
- tk.Label(root, text="搜索结果:").pack(pady=5) # 显示搜索结果标签
- text_display = scrolledtext.ScrolledText(root, wrap=tk.WORD, height=10, width=50, state=tk.DISABLED) # 创建滚动文本框
- text_display.pack(pady=5) # 显示滚动文本框
-
- button_frame = tk.Frame(root) # 创建按钮框架
- button_frame.pack(pady=5) # 显示按钮框架
-
- tk.Button(button_frame, text="加载题库", command=select_files).pack(side=tk.LEFT, padx=5) # 创建加载题库按钮
- toggle_button = tk.Button(button_frame, text="开始监控", command=toggle_monitoring) # 创建切换监控按钮
- toggle_button.pack(side=tk.LEFT, padx=5) # 显示切换监控按钮
-
- # 创建一个新的Frame用于透明度调节
- transparency_frame = tk.Frame(root)
- transparency_frame.pack(pady=5) # 显示透明度调节框架
-
- tk.Label(transparency_frame, text="透明度调节:", anchor='center').pack(side=tk.LEFT) # 显示透明度调节标签,左对齐
- transparency_slider = tk.Scale(transparency_frame, from_=0.1, to=1.0, resolution=0.1, orient=tk.HORIZONTAL,command=adjust_transparency) # 创建透明度滑动条
- transparency_slider.set(1.0) # 设置初始透明度
- transparency_slider.pack(side=tk.LEFT, padx=5) # 显示透明度滑动条
-
- # 创建一个新的Frame用于状态信息、帮助按钮和标签
- status_frame = tk.Frame(root)
- status_frame.pack(fill=tk.X, pady=2, padx=10)
-
- help_button = tk.Button(status_frame, text="帮助", command=show_help) # 创建帮助按钮
- help_button.pack(side=tk.LEFT, padx=5) # 定位在左侧
-
- tk.Label(status_frame, textvariable=result).pack(side=tk.LEFT, expand=True) # 显示状态信息标签并居中
-
- label = tk.Label(status_frame, text="by Corvus", font=("Arial", 10)) # 创建标签
- label.pack(side=tk.RIGHT) # 定位在右边
-
- # 初始化状态信息
- result.set("请先加载题库") # 默认提示信息
-
- def read_file(filepath):
- """根据文件扩展名选择合适的读取方式"""
- ext = os.path.splitext(filepath)[1].lower() # 获取文件扩展名并转为小写
- if ext == '.txt':
- return read_txt(filepath) # 调用读取txt文件函数
- elif ext == '.docx':
- return read_docx(filepath) # 调用读取docx文件函数
- elif ext == '.xlsx':
- return read_xlsx(filepath) # 调用读取xlsx文件函数
- elif ext == '.xls':
- return read_xls(filepath) # 调用读取xls文件函数
- elif ext == '.doc':
- return read_doc(filepath) # 调用读取doc文件函数
- return [] # 不支持的文件类型返回空列表
-
- def read_txt(filepath):
- """读取txt文件内容"""
- try:
- with open(filepath, 'r', encoding='utf-8') as file:
- return file.readlines() # 返回文件的所有行
- except Exception as e:
- print(f"Error reading {filepath}: {e}") # 打印错误信息
- return [] # 读取失败返回空列表
-
- def read_docx(filepath):
- """读取docx文件内容"""
- try:
- doc = Document(filepath) # 打开docx文件
- return [para.text for para in doc.paragraphs] # 返回所有段落的文本
- except Exception as e:
- print(f"Error reading docx file {filepath}: {e}") # 打印错误信息
- return [] # 读取失败返回空列表
-
- def read_xlsx(filepath):
- """读取xlsx文件内容"""
- try:
- wb = openpyxl.load_workbook(filepath, read_only=True) # 以只读模式打开Excel文件
- lines = [] # 初始化行列表
- for sheet in wb: # 遍历所有工作表
- for row in sheet.iter_rows(values_only=True): # 遍历所有行
- lines.append(' '.join(str(cell) for cell in row if cell)) # 将行内容拼接成字符串
- return lines # 返回所有行的列表
- except Exception as e:
- print(f"Error reading xlsx file {filepath}: {e}") # 打印错误信息
- return [] # 读取失败返回空列表
-
- def read_xls(filepath):
- """读取xls文件内容"""
- try:
- wb = xlrd.open_workbook(filepath) # 打开xls文件
- lines = [] # 初始化行列表
- for sheet in wb.sheets(): # 遍历所有工作表
- for row_idx in range(sheet.nrows): # 遍历所有行
- lines.append(' '.join(str(cell.value) for cell in sheet.row(row_idx) if cell.value)) # 拼接行内容
- return lines # 返回所有行的列表
- except Exception as e:
- print(f"Error reading xls file {filepath}: {e}") # 打印错误信息
- return [] # 读取失败返回空列表
-
- def read_doc(filepath):
- """读取doc文件内容"""
- try:
- word = client.Dispatch("Word.Application") # 启动Word应用程序
- word.Visible = False # 设置Word应用程序不可见
- doc = word.Documents.Open(filepath) # 打开Word文档
- text = doc.Content.Text # 获取文档内容
- doc.Close() # 关闭文档
- word.Quit() # 退出Word应用
- return text.splitlines() # 按行分割并返回
- except Exception as e:
- print(f"Error reading doc file {filepath}: {e}") # 打印错误信息
- return [] # 读取失败返回空列表
-
- def load_files_async(filepaths):
- """异步加载文件内容"""
- local_content = [] # 局部文件内容列表
- with ThreadPoolExecutor(max_workers=4) as executor: # 创建线程池
- futures = [executor.submit(read_file, filepath) for filepath in filepaths] # 提交读取文件任务
- for future in futures:
- local_content.extend(future.result()) # 合并任务结果
- global file_content
- file_content = local_content # 更新全局文件内容
- result.set("已加载所有题库") # 更新状态信息
-
- def select_files():
- """打开文件选择对话框"""
- filepaths = filedialog.askopenfilenames(
- filetypes=[("All supported files", "*.txt;*.docx;*.doc;*.xlsx;*.xls"),
- ("Text files", "*.txt"),
- ("Word files", "*.docx;*.doc"),
- ("Excel files", "*.xlsx;*.xls")]
- )
- if filepaths: # 如果选中文件
- result.set("正在加载文件...") # 更新状态信息
- threading.Thread(target=load_files_async, args=(filepaths,), daemon=True).start() # 异步加载文件
-
- def toggle_monitoring():
- """切换剪贴板监控状态"""
- global monitoring, initial_clipboard_content
- monitoring = not monitoring # 切换监控状态
- if monitoring:
- initial_clipboard_content = pyperclip.paste().strip() # 获取并记录当前剪贴板内容
- toggle_button.config(text="停止监控") # 更新按钮文本
- result.set("正在监控剪贴板...") # 更新状态信息
- threading.Thread(target=monitor_clipboard, daemon=True).start() # 启动监控线程
- else:
- toggle_button.config(text="开始监控") # 更新按钮文本
- result.set("监控已停止") # 更新状态信息
-
- def monitor_clipboard():
- """监控剪贴板内容变化"""
- global monitoring, initial_clipboard_content
- while monitoring: # 监控状态为True时
- try:
- tmp_value = pyperclip.paste().strip() # 获取当前剪贴板内容
- if tmp_value and tmp_value != initial_clipboard_content: # 只处理新复制的内容
- initial_clipboard_content = tmp_value # 更新初始剪贴板内容
- keyword_var.set(tmp_value) # 更新关键词变量
- threading.Thread(target=update_text_area, args=(tmp_value,), daemon=True).start() # 更新文本区域
- time.sleep(0.5) # 每0.5秒检查一次
- except Exception as e:
- print(f"Error accessing clipboard: {e}") # 打印错误信息
- time.sleep(1) # 出现错误等待1秒再试
-
- def update_text_area(keyword_value):
- """更新文本显示区域"""
- result_text = search_context(file_content, keyword_value) # 搜索关键词上下文
- text_display.config(state=tk.NORMAL) # 启用文本框编辑
- text_display.delete(1.0, tk.END) # 清空文本框
- text_display.insert(tk.END, result_text) # 显示搜索结果
- text_display.config(state=tk.DISABLED) # 禁用文本框编辑
-
- def search_context(content_lines, keyword):
- """在文件内容中搜索关键词"""
- if not keyword: # 如果关键词为空
- return "请输入关键词" # 返回提示信息
-
- pattern = re.escape(keyword) # 转义关键词
- contexts = [] # 初始化上下文列表
-
- for line in content_lines: # 遍历所有行
- if re.search(pattern, line): # 搜索匹配行
- contexts.append(line.strip()) # 添加匹配行
-
- if not contexts: # 如果未找到匹配
- return f'未找到 "{keyword}"' # 返回未找到信息
-
- return '\n\n'.join(contexts) # 返回所有匹配行
-
- def adjust_transparency(value):
- """调整窗口透明度"""
- root.attributes('-alpha', float(value)) # 设置窗口透明度
-
- def show_help():
- """显示帮助信息"""
- help_text = (
- "帮助文档\n\n"
- "1. 使用指南:\n"
- "- 加载题库:点击'加载题库'按钮可以选择多个题库加载\n"
- "- 开始监控:点击'开始监控'按钮以监控剪贴板内容。\n"
- "- 透明度调节:使用滑动条调整窗口透明度。\n\n"
- "2. 功能说明:\n"
- "- 本程序用于文件内容搜索,题库支持doc,docx,txt,xls,xlsx。\n"
- "- 题库内容没有固定格式,题目、选項和答案尽量放在一起。\n"
- "- 剪贴板监控功能可自动检测并搜索新的剪贴板内容。\n"
- "- 该程序自动置顶,可用于测试进行中不允许切换页面的程序。\n"
- )
- messagebox.showinfo("帮助文档", help_text) # 显示帮助信息的弹出窗口
-
-
-
- if __name__ == "__main__":
- create_gui() # 创建并显示GUI
- root.mainloop() # 启动Tkinter事件循环
复制代码
|
|