查看: 32|回复: 1

[电脑应用] 划词搜索1.0-本地题库版

[复制链接]
累计签到:377 天
连续签到:1 天

1295

主题

-15

回帖

1万

积分

域主

名望
126
星币
6580
星辰
15
好评
328
发表于 2024-10-26 09:00:00 | 显示全部楼层 |阅读模式

注册登录后全站资源免费查看下载

您需要 登录 才可以下载或查看,没有账号?立即注册

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




https://wwtm.lanzouq.com/ircNm2d4ncgb
密码:52pj
源代码
  1. import os  # 用于文件路径操作
  2. import pyperclip  # 用于剪贴板操作
  3. import re  # 用于正则表达式操作
  4. import tkinter as tk  # 用于创建GUI
  5. from tkinter import filedialog, scrolledtext, messagebox  # GUI部件
  6. from docx import Document  # 用于读取Word文档
  7. import openpyxl  # 用于读取Excel文件
  8. import xlrd  # 用于读取旧版Excel文件
  9. from win32com import client  # 用于操作Word文档
  10. import threading  # 用于线程操作
  11. from concurrent.futures import ThreadPoolExecutor  # 用于线程池操作
  12. import time  # 用于时间操作

  13. # 初始化全局变量
  14. file_content = []  # 用于存储文件内容的列表
  15. monitoring = False  # 剪贴板监控状态标志
  16. initial_clipboard_content = ''  # 用于记录初始剪贴板内容
  17. root = tk.Tk()  # 创建Tkinter主窗口
  18. text_display = None  # 用于显示结果的文本框
  19. toggle_button = None  # 用于切换监控的按钮
  20. keyword_var = tk.StringVar(root)  # 关键词的Tkinter变量
  21. result = tk.StringVar(root)  # 状态信息的Tkinter变量

  22. def create_gui():
  23.     """创建GUI界面"""
  24.     global text_display, toggle_button
  25.     root.title("划词搜索1.0-本地题库版")  # 设置窗口标题
  26.     root.geometry("450x370")  # 设置窗口大小
  27.     root.attributes('-topmost', True)  # 窗口置顶

  28.     tk.Label(root, text="当前剪贴板内容:").pack(pady=5)  # 显示剪贴板内容标签
  29.     tk.Entry(root, textvariable=keyword_var, width=50).pack(pady=5)  # 输入框绑定关键词变量
  30.     tk.Label(root, text="搜索结果:").pack(pady=5)  # 显示搜索结果标签
  31.     text_display = scrolledtext.ScrolledText(root, wrap=tk.WORD, height=10, width=50, state=tk.DISABLED)  # 创建滚动文本框
  32.     text_display.pack(pady=5)  # 显示滚动文本框

  33.     button_frame = tk.Frame(root)  # 创建按钮框架
  34.     button_frame.pack(pady=5)  # 显示按钮框架

  35.     tk.Button(button_frame, text="加载题库", command=select_files).pack(side=tk.LEFT, padx=5)  # 创建加载题库按钮
  36.     toggle_button = tk.Button(button_frame, text="开始监控", command=toggle_monitoring)  # 创建切换监控按钮
  37.     toggle_button.pack(side=tk.LEFT, padx=5)  # 显示切换监控按钮

  38.     # 创建一个新的Frame用于透明度调节
  39.     transparency_frame = tk.Frame(root)
  40.     transparency_frame.pack(pady=5)  # 显示透明度调节框架

  41.     tk.Label(transparency_frame, text="透明度调节:", anchor='center').pack(side=tk.LEFT)  # 显示透明度调节标签,左对齐
  42.     transparency_slider = tk.Scale(transparency_frame, from_=0.1, to=1.0, resolution=0.1, orient=tk.HORIZONTAL,command=adjust_transparency)  # 创建透明度滑动条
  43.     transparency_slider.set(1.0)  # 设置初始透明度
  44.     transparency_slider.pack(side=tk.LEFT, padx=5)  # 显示透明度滑动条

  45.     # 创建一个新的Frame用于状态信息、帮助按钮和标签
  46.     status_frame = tk.Frame(root)
  47.     status_frame.pack(fill=tk.X, pady=2, padx=10)

  48.     help_button = tk.Button(status_frame, text="帮助", command=show_help)  # 创建帮助按钮
  49.     help_button.pack(side=tk.LEFT, padx=5)  # 定位在左侧

  50.     tk.Label(status_frame, textvariable=result).pack(side=tk.LEFT, expand=True)  # 显示状态信息标签并居中

  51.     label = tk.Label(status_frame, text="by Corvus", font=("Arial", 10))  # 创建标签
  52.     label.pack(side=tk.RIGHT)  # 定位在右边

  53.     # 初始化状态信息
  54.     result.set("请先加载题库")  # 默认提示信息

  55. def read_file(filepath):
  56.     """根据文件扩展名选择合适的读取方式"""
  57.     ext = os.path.splitext(filepath)[1].lower()  # 获取文件扩展名并转为小写
  58.     if ext == '.txt':
  59.         return read_txt(filepath)  # 调用读取txt文件函数
  60.     elif ext == '.docx':
  61.         return read_docx(filepath)  # 调用读取docx文件函数
  62.     elif ext == '.xlsx':
  63.         return read_xlsx(filepath)  # 调用读取xlsx文件函数
  64.     elif ext == '.xls':
  65.         return read_xls(filepath)  # 调用读取xls文件函数
  66.     elif ext == '.doc':
  67.         return read_doc(filepath)  # 调用读取doc文件函数
  68.     return []  # 不支持的文件类型返回空列表

  69. def read_txt(filepath):
  70.     """读取txt文件内容"""
  71.     try:
  72.         with open(filepath, 'r', encoding='utf-8') as file:
  73.             return file.readlines()  # 返回文件的所有行
  74.     except Exception as e:
  75.         print(f"Error reading {filepath}: {e}")  # 打印错误信息
  76.     return []  # 读取失败返回空列表

  77. def read_docx(filepath):
  78.     """读取docx文件内容"""
  79.     try:
  80.         doc = Document(filepath)  # 打开docx文件
  81.         return [para.text for para in doc.paragraphs]  # 返回所有段落的文本
  82.     except Exception as e:
  83.         print(f"Error reading docx file {filepath}: {e}")  # 打印错误信息
  84.     return []  # 读取失败返回空列表

  85. def read_xlsx(filepath):
  86.     """读取xlsx文件内容"""
  87.     try:
  88.         wb = openpyxl.load_workbook(filepath, read_only=True)  # 以只读模式打开Excel文件
  89.         lines = []  # 初始化行列表
  90.         for sheet in wb:  # 遍历所有工作表
  91.             for row in sheet.iter_rows(values_only=True):  # 遍历所有行
  92.                 lines.append(' '.join(str(cell) for cell in row if cell))  # 将行内容拼接成字符串
  93.         return lines  # 返回所有行的列表
  94.     except Exception as e:
  95.         print(f"Error reading xlsx file {filepath}: {e}")  # 打印错误信息
  96.     return []  # 读取失败返回空列表

  97. def read_xls(filepath):
  98.     """读取xls文件内容"""
  99.     try:
  100.         wb = xlrd.open_workbook(filepath)  # 打开xls文件
  101.         lines = []  # 初始化行列表
  102.         for sheet in wb.sheets():  # 遍历所有工作表
  103.             for row_idx in range(sheet.nrows):  # 遍历所有行
  104.                 lines.append(' '.join(str(cell.value) for cell in sheet.row(row_idx) if cell.value))  # 拼接行内容
  105.         return lines  # 返回所有行的列表
  106.     except Exception as e:
  107.         print(f"Error reading xls file {filepath}: {e}")  # 打印错误信息
  108.     return []  # 读取失败返回空列表

  109. def read_doc(filepath):
  110.     """读取doc文件内容"""
  111.     try:
  112.         word = client.Dispatch("Word.Application")  # 启动Word应用程序
  113.         word.Visible = False  # 设置Word应用程序不可见
  114.         doc = word.Documents.Open(filepath)  # 打开Word文档
  115.         text = doc.Content.Text  # 获取文档内容
  116.         doc.Close()  # 关闭文档
  117.         word.Quit()  # 退出Word应用
  118.         return text.splitlines()  # 按行分割并返回
  119.     except Exception as e:
  120.         print(f"Error reading doc file {filepath}: {e}")  # 打印错误信息
  121.     return []  # 读取失败返回空列表

  122. def load_files_async(filepaths):
  123.     """异步加载文件内容"""
  124.     local_content = []  # 局部文件内容列表
  125.     with ThreadPoolExecutor(max_workers=4) as executor:  # 创建线程池
  126.         futures = [executor.submit(read_file, filepath) for filepath in filepaths]  # 提交读取文件任务
  127.         for future in futures:
  128.             local_content.extend(future.result())  # 合并任务结果
  129.     global file_content
  130.     file_content = local_content  # 更新全局文件内容
  131.     result.set("已加载所有题库")  # 更新状态信息

  132. def select_files():
  133.     """打开文件选择对话框"""
  134.     filepaths = filedialog.askopenfilenames(
  135.         filetypes=[("All supported files", "*.txt;*.docx;*.doc;*.xlsx;*.xls"),
  136.                    ("Text files", "*.txt"),
  137.                    ("Word files", "*.docx;*.doc"),
  138.                    ("Excel files", "*.xlsx;*.xls")]
  139.     )
  140.     if filepaths:  # 如果选中文件
  141.         result.set("正在加载文件...")  # 更新状态信息
  142.         threading.Thread(target=load_files_async, args=(filepaths,), daemon=True).start()  # 异步加载文件

  143. def toggle_monitoring():
  144.     """切换剪贴板监控状态"""
  145.     global monitoring, initial_clipboard_content
  146.     monitoring = not monitoring  # 切换监控状态
  147.     if monitoring:
  148.         initial_clipboard_content = pyperclip.paste().strip()  # 获取并记录当前剪贴板内容
  149.         toggle_button.config(text="停止监控")  # 更新按钮文本
  150.         result.set("正在监控剪贴板...")  # 更新状态信息
  151.         threading.Thread(target=monitor_clipboard, daemon=True).start()  # 启动监控线程
  152.     else:
  153.         toggle_button.config(text="开始监控")  # 更新按钮文本
  154.         result.set("监控已停止")  # 更新状态信息

  155. def monitor_clipboard():
  156.     """监控剪贴板内容变化"""
  157.     global monitoring, initial_clipboard_content
  158.     while monitoring:  # 监控状态为True时
  159.         try:
  160.             tmp_value = pyperclip.paste().strip()  # 获取当前剪贴板内容
  161.             if tmp_value and tmp_value != initial_clipboard_content:  # 只处理新复制的内容
  162.                 initial_clipboard_content = tmp_value  # 更新初始剪贴板内容
  163.                 keyword_var.set(tmp_value)  # 更新关键词变量
  164.                 threading.Thread(target=update_text_area, args=(tmp_value,), daemon=True).start()  # 更新文本区域
  165.             time.sleep(0.5)  # 每0.5秒检查一次
  166.         except Exception as e:
  167.             print(f"Error accessing clipboard: {e}")  # 打印错误信息
  168.             time.sleep(1)  # 出现错误等待1秒再试

  169. def update_text_area(keyword_value):
  170.     """更新文本显示区域"""
  171.     result_text = search_context(file_content, keyword_value)  # 搜索关键词上下文
  172.     text_display.config(state=tk.NORMAL)  # 启用文本框编辑
  173.     text_display.delete(1.0, tk.END)  # 清空文本框
  174.     text_display.insert(tk.END, result_text)  # 显示搜索结果
  175.     text_display.config(state=tk.DISABLED)  # 禁用文本框编辑

  176. def search_context(content_lines, keyword):
  177.     """在文件内容中搜索关键词"""
  178.     if not keyword:  # 如果关键词为空
  179.         return "请输入关键词"  # 返回提示信息

  180.     pattern = re.escape(keyword)  # 转义关键词
  181.     contexts = []  # 初始化上下文列表

  182.     for line in content_lines:  # 遍历所有行
  183.         if re.search(pattern, line):  # 搜索匹配行
  184.             contexts.append(line.strip())  # 添加匹配行

  185.     if not contexts:  # 如果未找到匹配
  186.         return f'未找到 "{keyword}"'  # 返回未找到信息

  187.     return '\n\n'.join(contexts)  # 返回所有匹配行

  188. def adjust_transparency(value):
  189.     """调整窗口透明度"""
  190.     root.attributes('-alpha', float(value))  # 设置窗口透明度

  191. def show_help():
  192.     """显示帮助信息"""
  193.     help_text = (
  194.         "帮助文档\n\n"
  195.         "1. 使用指南:\n"
  196.         "- 加载题库:点击'加载题库'按钮可以选择多个题库加载\n"
  197.         "- 开始监控:点击'开始监控'按钮以监控剪贴板内容。\n"
  198.         "- 透明度调节:使用滑动条调整窗口透明度。\n\n"
  199.         "2. 功能说明:\n"
  200.         "- 本程序用于文件内容搜索,题库支持doc,docx,txt,xls,xlsx。\n"
  201.         "- 题库内容没有固定格式,题目、选項和答案尽量放在一起。\n"
  202.         "- 剪贴板监控功能可自动检测并搜索新的剪贴板内容。\n"
  203.         "- 该程序自动置顶,可用于测试进行中不允许切换页面的程序。\n"
  204.     )
  205.     messagebox.showinfo("帮助文档", help_text)  # 显示帮助信息的弹出窗口



  206. if __name__ == "__main__":
  207.     create_gui()  # 创建并显示GUI
  208.     root.mainloop()  # 启动Tkinter事件循环
复制代码



默认签名:偏爱是我家,发展靠大家! 社区反馈邮箱Mail To:service@pai.al或paijishu@outlook.com
回复

使用道具 举报

累计签到:158 天
连续签到:1 天

0

主题

98

回帖

921

积分

星空

名望
0
星币
766
星辰
0
好评
0
发表于 2024-10-29 21:56:49 | 显示全部楼层
感谢大佬分享 支持大佬一下啊
默认签名:偏爱是我家,发展靠大家! 社区反馈邮箱Mail To:service@pai.al或paijishu@outlook.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网--教开服-游戏源码

偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网-游戏源码

Powered by Discuz! X3.5

GMT+8, 2025-9-13 05:06 , Processed in 0.087103 second(s), 36 queries .

快速回复 返回顶部 返回列表