当前位置: 首页 > article >正文

数据集搜集器(百科)008

对数据集搜集器(百科)007进行一下改进:
错误处理:增加更多的错误处理,比如网络请求超时、解析错误等。
用户界面:增加一些提示信息,让用户更清楚当前的操作状态。
多线程处理:确保多线程处理更加安全,避免多个线程同时操作同一资源。
日志记录:增加更多的日志记录,方便调试和追踪问题。
配置文件:引入配置文件,方便修改一些常量(如记录文件夹名称)。
完善后的代码
python

import tkinter as tk
from tkinter import filedialog, messagebox
import requests
from bs4 import BeautifulSoup
import json
import os
import threading
from tkinter import ttk
import logging

# 配置日志
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 读取配置文件
CONFIG_FILE = 'config.json'
DEFAULT_CONFIG = {
    "record_folder": "记录",
    "log_file": "app.log"
}

def load_config():
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, 'r', encoding='utf-8') as file:
            return json.load(file)
    return DEFAULT_CONFIG

config = load_config()

class BaikeSearchApp:
    def __init__(self, root):
        self.root = root
        self.root.title("百度百科查询工具")

        # 创建输入框
        self.input_label = tk.Label(root, text="输入问题:")
        self.input_label.pack(pady=5)
        self.input_entry = tk.Entry(root, width=80)
        self.input_entry.pack(pady=5)

        # 创建文本框
        self.text = tk.Text(root, wrap='word', height=20, width=80)
        self.text.pack(pady=10)

        # 创建按钮
        self.load_button = tk.Button(root, text="加载文件", command=self.load_file)
        self.load_button.pack(side=tk.LEFT, padx=10)

        self.query_button = tk.Button(root, text="获取回答", command=self.get_answer)
        self.query_button.pack(side=tk.LEFT, padx=10)

        self.save_button = tk.Button(root, text="保存记录", command=self.save_record)
        self.save_button.pack(side=tk.LEFT, padx=10)

        self.history_button = tk.Button(root, text="查看历史记录", command=self.show_history)
        self.history_button.pack(side=tk.LEFT, padx=10)

        self.help_button = tk.Button(root, text="帮助", command=self.show_help)
        self.help_button.pack(side=tk.LEFT, padx=10)

        # 创建状态栏
        self.status_var = tk.StringVar()
        self.status_bar = tk.Label(root, textvariable=self.status_var, bd=1, relief=tk.SUNKEN, anchor=tk.W)
        self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)

        # 创建进度条
        self.progress = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
        self.progress.pack(pady=10)

        # 初始化历史记录
        self.history = []

        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)

    def on_closing(self):
        if hasattr(self, 'thread') and self.thread.is_alive():
            messagebox.showinfo("提示", "请等待所有任务完成后再关闭窗口。")
        else:
            self.root.destroy()

    def load_file(self):
        file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
        if file_path:
            with open(file_path, 'r', encoding='utf-8') as file:
                lines = file.readlines()
                total_lines = len(lines)
                self.progress["maximum"] = total_lines
                for i, line in enumerate(lines):
                    self.text.insert(tk.END, f"问题: {line.strip()}\n")
                    self.get_answer(line.strip())
                    self.progress["value"] = i + 1
                    self.root.update_idletasks()
            self.status_var.set(f"已加载文件: {file_path}")

    def get_answer(self, query=None):
        if not query:
            query = self.input_entry.get().strip()
            if not query:
                query = self.text.get("insert linestart", "insert lineend").strip()
            if not query:
                messagebox.showwarning("警告", "请先输入或选择一个问题")
                return

        self.status_var.set(f"正在查询: {query}")
        logging.info(f"开始查询: {query}")
        self.thread = threading.Thread(target=self._get_answer, args=(query,))
        self.thread.start()

    def _get_answer(self, query):
        url = f"https://baike.baidu.com/item/{query}"
        try:
            response = requests.get(url, timeout=10)
            response.raise_for_status()
            soup = BeautifulSoup(response.content, 'html.parser')

            # 从<meta>标签中提取描述
            description_tag = soup.find('meta', attrs={'name': 'description'})
            if description_tag and 'content' in description_tag.attrs:
                content = description_tag['content']
            else:
                content = "未找到相关词条"

            answer = {
                "question": query,
                "human_answers": [content],
                "chatgpt_answers": [content]
            }

            formatted_answer = f"问题: {query}\n答案: {content}\n\n"
            self.text.insert(tk.END, formatted_answer)
            self.history.append(answer)
            self.status_var.set(f"查询完成: {query}")
            logging.info(f"查询完成: {query}")
        except requests.RequestException as e:
            self.text.insert(tk.END, f"请求失败: {e}\n")
            self.status_var.set("请求失败")
            logging.error(f"请求失败: {e}")

    def save_record(self):
        record_folder = config["record_folder"]
        if not os.path.exists(record_folder):
            os.makedirs(record_folder)

        with open(os.path.join(record_folder, "bata.txt"), 'w', encoding='utf-8') as file:
            for record in self.history:
                file.write(json.dumps(record, ensure_ascii=False) + "\n")
        self.status_var.set("记录已保存")

    def show_history(self):
        history_window = tk.Toplevel(self.root)
        history_window.title("历史记录")

        history_text = tk.Text(history_window, wrap='word', height=20, width=80)
        history_text.pack(pady=10)

        for record in self.history:
            history_text.insert(tk.END, json.dumps(record, ensure_ascii=False) + "\n")

        clear_button = tk.Button(history_window, text="清空历史记录", command=self.clear_history)
        clear_button.pack(pady=10)

    def clear_history(self):
        self.history = []
        self.text.delete(1.0, tk.END)
        self.status_var.set("历史记录已清空")

    def show_help(self):
        help_window = tk.Toplevel(self.root)
        help_window.title("帮助文档")

        help_text = tk.Text(help_window, wrap='word', height=20, width=80)
        help_text.pack(pady=10)

        help_content = """
        使用说明:
        1. 在输入框中输入问题,点击“获取回答”按钮查询答案。
        2. 点击“加载文件”按钮,选择包含问题的文本文件,批量查询答案。
        3. 查询结果会显示在文本框中,并自动保存到历史记录。
        4. 点击“保存记录”按钮,将历史记录保存到文件中。
        5. 点击“查看历史记录”按钮,查看和管理历史记录。
        6. 点击“帮助”按钮,查看使用说明。
        """
        help_text.insert(tk.END, help_content)

if __name__ == "__main__":
    root = tk.Tk()
    app = BaikeSearchApp(root)
    root.mainloop()

主要改进点

配置文件:引入了 config.json 文件来存储一些常量,如记录文件夹名称。
错误处理:增加了网络请求的超时处理。
日志记录:增加了更多的日志记录,方便调试和追踪问题。
用户界面:增加了更多的状态提示,让用户更清楚当前的操作状态。


http://www.kler.cn/a/419268.html

相关文章:

  • PMP–一、二、三模、冲刺–分类–8.质量管理
  • 数据结构 (16)特殊矩阵的压缩存储
  • 《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)
  • 基于Python制作一个简易UI界面
  • 不同类型转换
  • mysql查询语句执行全流程
  • 容器化与 Kubernetes:现代应用的编排与管理
  • LwIP协议栈 基础知识介绍
  • 电商项目高级篇06-缓存
  • 前端将echarts的图和element表格 一起导出到excel中
  • el-tree的使用及控制全选、反选、获取选中
  • 韩顺平 一周学会Linux | Linux 实操篇-组管理和权限管理
  • 根据后台数据结构,构建搜索目录树
  • openssl 基本命令使用方法
  • Oracle之提高PLSQL的执行性能
  • 三十二:网络爬虫的工作原理与应对方式
  • ASP网络安全讲述
  • 易速鲜花聊天客服机器人的开发(上)
  • 一体化数据安全平台uDSP 入选【年度创新安全产品 TOP10】榜单
  • Ubuntu 22.04 LTS vs Ubuntu 24.04 LTS:深度剖析,哪个版本更胜一筹?
  • ORB-SLAM2源码学习:LocalMapping.cc: LocalMapping::MapPointCulling剔除不合格的地图点
  • 使用 Docker 容器创建一个 Web 服务器:从入门到实践
  • 怎么选拔人才
  • MySQL--SQL优化
  • 私有库gitea安装
  • DRM(数字权限管理技术)防截屏录屏----ffmpeg安装