划词搜索1.0-本地题库版

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


image.png (56.27 KB, 下载次数: 0)
下载附件
2024-10-24 16:13 上传

https://wwtm.lanzouq.com/ircNm2d4ncgb
密码:52pj
源代码在二楼

题库, 微软

redapple2015   

python高手真多。看来要好好学学py了。
helh0275   

感谢楼主制作分享,对于单位答题、背题挺好用,
哇...实战了一把,挺好挺快挺准确,唯一遗憾:要是题库内容能列分行显示会更好
Corvus
OP
  

[Python] 纯文本查看 复制代码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事件循环
ice7733   

能不能传一个测试用的题库
zgb   

先下载,有空试一下,顶楼主
Zzy985570612   

值得支持,好样的楼主,会用AI也是一种技能
LXLLXM123321   

训练AI是门技术活
arg10   

厉害  还有代码
注册个id   

支持楼主开源
您需要登录后才可以回帖 登录 | 立即注册

返回顶部