查存背--python英语词典

查看 102|回复 9
作者:55229lwj   
查存背——python英语词典
数据来源:bing词典
来源于以前写的爬虫小项目,现在完善了下,加入了单词保存及导出word的功能。(其实说不上完善{:1_907:} )
比如判断是否存在数据库文件之类的功能也没加上,暂且直接用附件的文件吧 。
估计会有许多bug,由于个人原因没法完成,仅作交流学习,欢迎各路大佬前来指正!{:1_921:}
[Python] 纯文本查看 复制代码import requests
import re
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from ttkbootstrap.dialogs import Messagebox
import sqlite3
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
def search(word):
    P = {
        "q": f"{word}"
    }
    resp = s.get(url=url, params=P)
    goal = resp.text
    obj = re.compile(
        r'.*?)" />')
    it = obj.search(goal)
    try:
        meaning = it.group("meaning")
        res = word + "\n" + meaning + "\n"
        wlist.append([word, meaning])
        return res
    except:
        return f"对不起,查询{word}无果\n"
def append_word(word, meaning):
    try:
        c.execute(
            f"INSERT INTO words (word,meaning) VALUES ('{word}', '{meaning}')")
        conn.commit()
    except:
        return -1
    else:
        return 0
def db_get():
    return c.execute("SELECT word,meaning  from words")
def db_update():
    count = len(wlist)
    f_c = 0
    for i in wlist:
        f_c += append_word(i[0], i[1])
    Messagebox().show_info(message=f"{count+f_c}个添加成功,{0-f_c}个失败")
def db_delete(window):
    try:
        c.execute("delete from words")
    except:
        Messagebox().show_error(parent=window, message='错误')
    else:
        Messagebox().show_info(parent=window, message='成功')
def to_word(window):
    doc = Document()
    for row in db_get():
        p1 = doc.add_paragraph()
        w = p1.add_run(row[0])
        w.bold = True
        w.font.name = 'Times New Roman'
        w.font.size = Pt(15)
        p2 = doc.add_paragraph()
        p = p2.add_run(row[1].split(',')[:2])
        p.bold = True
        p.font.name = '微软雅黑'
        p._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
        p.font.size = Pt(9)
        p2.add_run('\t')
        m = p2.add_run(row[1].split(',')[2:])
        m.font.name = '微软雅黑'
        m._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
        m.font.size = Pt(10)
    doc.save('单词表.docx')
    Messagebox().show_info(parent=window, message='成功')
def check_word():
    window = ttk.Toplevel(title='单词库')
    window.protocol("WM_DELETE_WINDOW", window.destroy)
    tv = ttk.Treeview(
        master=window,
        columns=[0, 1],
        show=HEADINGS,
    )
    tv.heading(0, text='单词')
    tv.heading(1, text='释义')
    tv.column(0, width=60)
    tv.column(1, width=1000, anchor=W)
    cursor = db_get()
    for row in cursor:
        tv.insert('', END, values=(row[0], row[1]))
        # print("word=", row[0])
        # print("meaning = ", row[1], "\n")
    tv.pack(side=LEFT, anchor=NE, fill=X)
    def delete():
        if Messagebox().yesno(parent=window, message='你确定?') == "确认":
            obj = tv.get_children()  # 获取所有对象
            for o in obj:
                tv.delete(o)  # 删除对象
            db_delete(window)
        else:
            return
    def b_to_word():
        to_word(window)
    ttk.Button(window, text='删库', command=delete).pack(side=RIGHT)
    ttk.Button(window, text='导出word', command=b_to_word).pack(side=LEFT)
    window.mainloop()
def appear():
    text.config(state='normal')
    text.insert('end', search(input.get()))
    text.config(state='disable')
def root_close():
    conn.commit()
    conn.close()
    s.close()
    root.destroy()
def cls():
    wlist.clear()
    text.config(state='normal')
    text.delete(1.0, "end")
    text.config(state='disable')
url = "https://cn.bing.com/dict/search"
s = requests.session()
conn = sqlite3.connect('wordlist.db')
c = conn.cursor()
wlist = []
root = ttk.Window(title="词典")
ttk.Label(root, text="欢迎来到词典,内容来源于网络 55229lwj").grid(row=0, column=0)
input = ttk.Entry(root)
text = ttk.ScrolledText(root)
text.grid(row=1, column=2)
text.config(state='disable')
input.grid(row=1, column=0)
ttk.Button(root, text="查询", command=appear).grid(row=1, column=1)
ttk.Button(root, text="清空", command=cls).grid(row=2, column=3)
ttk.Button(root, text="添加入库", command=db_update).grid(row=2, column=2)
ttk.Button(root, text="查看库中单词", command=check_word).grid(row=1, column=3)
root.protocol("WM_DELETE_WINDOW", root_close)
if __name__ == '__main__':
    root.mainloop()

微软, 单词

kenxy   

[Python] 纯文本查看 复制代码import requests
import re
import sys
# 在文件顶部添加导入
from tkinter import filedialog
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from ttkbootstrap.dialogs import Messagebox, Querybox
import sqlite3
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
import os
from datetime import datetime
import webbrowser

class DictionaryApp:
    def __init__(self):
        # 初始化配置
        self.url = "https://cn.bing.com/dict/search"
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        })
         
        # 数据库连接
        self.db_file = 'wordlist.db'
        self.conn = sqlite3.connect(self.db_file)
        self.cursor = self.conn.cursor()
        self._init_db()
         
        # 临时存储列表
        self.temp_words = []
         
        # 创建主界面
        self.root = ttk.Window(title="高级词典工具", themename="litera")
        self.root.geometry("800x600")
        self._setup_ui()
         
    def _init_db(self):
        """初始化数据库表结构"""
        self.cursor.execute("""
        CREATE TABLE IF NOT EXISTS words (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            word TEXT UNIQUE,
            meaning TEXT,
            add_time TEXT,
            difficulty INTEGER DEFAULT 1
        )
        """)
        self.conn.commit()
     
    def _setup_ui(self):
        """设置用户界面"""
        # 顶部标题
        ttk.Label(
            self.root,
            text="高级词典工具",
            font=("微软雅黑", 16, "bold"),
            bootstyle="primary"
        ).pack(pady=10)
         
        # 搜索区域
        search_frame = ttk.Frame(self.root)
        search_frame.pack(fill=X, padx=10, pady=5)
         
        self.search_entry = ttk.Entry(
            search_frame,
            width=40,
            font=("微软雅黑", 12)
        )
        self.search_entry.pack(side=LEFT, padx=5)
        self.search_entry.bind("", lambda e: self.search_word())
         
        ttk.Button(
            search_frame,
            text="查询",
            command=self.search_word,
            bootstyle="primary"
        ).pack(side=LEFT, padx=5)
         
        ttk.Button(
            search_frame,
            text="在线搜索",
            command=self.search_online,
            bootstyle="info"
        ).pack(side=LEFT, padx=5)
         
        # 结果显示区域
        result_frame = ttk.Frame(self.root)
        result_frame.pack(fill=BOTH, expand=True, padx=10, pady=5)
         
        self.result_text = ttk.ScrolledText(
            result_frame,
            font=("微软雅黑", 11),
            wrap=WORD,
            height=15
        )
        self.result_text.pack(fill=BOTH, expand=True)
        self.result_text.config(state=DISABLED)
         
        # 操作按钮区域
        btn_frame = ttk.Frame(self.root)
        btn_frame.pack(fill=X, padx=10, pady=10)
         
        ttk.Button(
            btn_frame,
            text="添加到生词本",
            command=self.add_to_vocabulary,
            bootstyle="success"
        ).pack(side=LEFT, padx=5)
         
        ttk.Button(
            btn_frame,
            text="清空结果",
            command=self.clear_results,
            bootstyle="warning"
        ).pack(side=LEFT, padx=5)
         
        ttk.Button(
            btn_frame,
            text="管理生词本",
            command=self.manage_vocabulary,
            bootstyle="secondary"
        ).pack(side=LEFT, padx=5)
         
        ttk.Button(
            btn_frame,
            text="导出为Word",
            command=self.export_to_word,
            bootstyle="primary-outline"
        ).pack(side=RIGHT, padx=5)
         
        # 状态栏
        self.status_var = ttk.StringVar()
        self.status_var.set("就绪")
        ttk.Label(
            self.root,
            textvariable=self.status_var,
            relief=SUNKEN,
            anchor=W
        ).pack(fill=X, side=BOTTOM, ipady=2)
         
        # 窗口关闭事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_close)
     
    def search_word(self):
        """查询单词"""
        word = self.search_entry.get().strip()
        if not word:
            Messagebox.show_warning("请输入要查询的单词", parent=self.root)
            return
         
        self.status_var.set(f"正在查询: {word}...")
        self.root.update()
         
        try:
            result = self._search_word(word)
            self._display_result(word, result)
            self.status_var.set(f"查询完成: {word}")
        except Exception as e:
            Messagebox.show_error(f"查询失败: {str(e)}", parent=self.root)
            self.status_var.set("查询失败")
     
    def _search_word(self, word):
        """实际执行查询"""
        params = {"q": word}
        resp = self.session.get(self.url, params=params)
        resp.raise_for_status()
         
        # 使用正则提取释义
        pattern = re.compile(
            r'.*?)" />'
        )
        match = pattern.search(resp.text)
         
        if match:
            meaning = match.group("meaning")
            return meaning
        return None
     
    def _display_result(self, word, meaning):
        """显示查询结果"""
        self.result_text.config(state=NORMAL)
        self.result_text.delete(1.0, END)
         
        if meaning:
            # 添加单词
            self.result_text.insert(END, f"单词: ", "bold")
            self.result_text.insert(END, f"{word}\n", "word")
            
            # 添加释义
            self.result_text.insert(END, "\n释义:\n", "bold")
            meanings = meaning.split(',')
            for i, m in enumerate(meanings, 1):
                self.result_text.insert(END, f"{i}. {m}\n")
            
            # 临时存储
            self.temp_words = [(word, meaning)]
        else:
            self.result_text.insert(END, f"未找到单词 '{word}' 的释义\n", "error")
         
        self.result_text.config(state=DISABLED)
     
    def add_to_vocabulary(self):
        """添加到生词本"""
        if not self.temp_words:
            Messagebox.show_warning("没有可添加的单词", parent=self.root)
            return
         
        success = 0
        for word, meaning in self.temp_words:
            try:
                self.cursor.execute(
                    "INSERT OR IGNORE INTO words (word, meaning, add_time) VALUES (?, ?, ?)",
                    (word, meaning, datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
                )
                success += 1
            except sqlite3.Error as e:
                continue
         
        self.conn.commit()
        Messagebox.show_info(
            f"成功添加 {success}/{len(self.temp_words)} 个单词到生词本",
            parent=self.root
        )
        self.temp_words = []
     
    def clear_results(self):
        """清空结果"""
        self.result_text.config(state=NORMAL)
        self.result_text.delete(1.0, END)
        self.result_text.config(state=DISABLED)
        self.temp_words = []
        self.status_var.set("已清空结果")
     
    def manage_vocabulary(self):
        """管理生词本"""
        manage_window = ttk.Toplevel(title="生词本管理")
        manage_window.geometry("900x600")
         
        # 创建树形表格
        columns = ("word", "meaning", "add_time")
        tree = ttk.Treeview(
            manage_window,
            columns=columns,
            show="headings",
            selectmode="extended",
            bootstyle="primary"
        )
         
        # 设置列
        tree.heading("word", text="单词", anchor=W)
        tree.heading("meaning", text="释义", anchor=W)
        tree.heading("add_time", text="添加时间", anchor=W)
         
        tree.column("word", width=150, minwidth=100)
        tree.column("meaning", width=500, minwidth=300)
        tree.column("add_time", width=150, minwidth=100)
         
        # 添加滚动条
        scrollbar = ttk.Scrollbar(
            manage_window,
            orient=VERTICAL,
            command=tree.yview
        )
        tree.configure(yscrollcommand=scrollbar.set)
        scrollbar.pack(side=RIGHT, fill=Y)
        tree.pack(fill=BOTH, expand=True, padx=5, pady=5)
         
        # 加载数据
        self._load_vocabulary_data(tree)
         
        # 操作按钮区域
        btn_frame = ttk.Frame(manage_window)
        btn_frame.pack(fill=X, padx=5, pady=5)
         
        ttk.Button(
            btn_frame,
            text="删除选中",
            command=lambda: self._delete_selected_words(tree),
            bootstyle="danger"
        ).pack(side=LEFT, padx=5)
         
        ttk.Button(
            btn_frame,
            text="导出选中",
            command=lambda: self._export_selected_words(tree),
            bootstyle="success"
        ).pack(side=LEFT, padx=5)
         
        ttk.Button(
            btn_frame,
            text="刷新列表",
            command=lambda: self._load_vocabulary_data(tree),
            bootstyle="info"
        ).pack(side=RIGHT, padx=5)
     
    def _load_vocabulary_data(self, tree):
        """加载生词本数据到表格"""
        for item in tree.get_children():
            tree.delete(item)
         
        try:
            rows = self.cursor.execute("""
                SELECT word, meaning, add_time FROM words
                ORDER BY add_time DESC
            """).fetchall()
            
            for row in rows:
                tree.insert("", END, values=row)
        except sqlite3.Error as e:
            Messagebox.show_error(f"加载数据失败: {str(e)}", parent=tree.winfo_toplevel())
     
    def _delete_selected_words(self, tree):
        """删除选中的单词"""
        selected_items = tree.selection()
        if not selected_items:
            Messagebox.show_warning("请先选择要删除的单词", parent=tree.winfo_toplevel())
            return
         
        if Messagebox.show_question(
            f"确定要删除这 {len(selected_items)} 个单词吗?",
            parent=tree.winfo_toplevel()
        ) != "是":
            return
         
        deleted = 0
        for item in selected_items:
            word = tree.item(item)['values'][0]
            try:
                self.cursor.execute("DELETE FROM words WHERE word=?", (word,))
                deleted += 1
            except sqlite3.Error:
                continue
         
        self.conn.commit()
        Messagebox.show_info(
            f"成功删除 {deleted}/{len(selected_items)} 个单词",
            parent=tree.winfo_toplevel()
        )
        self._load_vocabulary_data(tree)
     
    def _export_selected_words(self, tree):
        """导出选中的单词"""
        selected_items = tree.selection()
        if not selected_items:
            Messagebox.show_warning("请先选择要导出的单词", parent=tree.winfo_toplevel())
            return
         
        words = []
        for item in selected_items:
            word_data = tree.item(item)['values']
            words.append({
                "word": word_data[0],
                "meaning": word_data[1],
                "time": word_data[2]
            })
         
        self._export_words_to_file(words)
     
    def export_to_word(self):
        """导出全部单词到Word"""
        words = []
        try:
            rows = self.cursor.execute("""
                SELECT word, meaning, add_time FROM words
                ORDER BY word COLLATE NOCASE
            """).fetchall()
            
            for row in rows:
                words.append({
                    "word": row[0],
                    "meaning": row[1],
                    "time": row[2]
                })
        except sqlite3.Error as e:
            Messagebox.show_error(f"加载数据失败: {str(e)}", parent=self.root)
            return
         
        if not words:
            Messagebox.show_warning("生词本为空,没有可导出的单词", parent=self.root)
            return
         
        self._export_words_to_file(words)
     
    def _export_words_to_file(self, words):
        """实际执行导出到Word文件"""
        default_filename = f"单词表_{datetime.now().strftime('%Y%m%d_%H%M%S')}.docx"
         
        # 让用户选择保存位置
##        filepath = Querybox.get_saveasfilename(
##            initialfile=default_filename,
##            defaultextension=".docx",
##            filetypes=[("Word文档", "*.docx")],
##            parent=self.root
##        )
        # 修正后的文件保存对话框调用方式
        filepath = filedialog.asksaveasfilename(
            title="保存单词表",
            defaultextension=".docx",
            initialfile=default_filename,
            filetypes=[("Word文档", "*.docx"), ("所有文件", "*.*")]
        )
         
        if not filepath:
            return
         
        try:
            doc = Document()
            
            # 添加标题
            title = doc.add_heading("我的生词本", level=1)
            title.alignment = 1  # 居中
            
            # 添加统计信息
            doc.add_paragraph(f"共 {len(words)} 个单词 | 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
            doc.add_paragraph("\n")
            
            # 添加单词内容
            for item in words:
                # 单词行
                p_word = doc.add_paragraph()
                run_word = p_word.add_run(item["word"])
                run_word.bold = True
                run_word.font.name = "Times New Roman"
                run_word.font.size = Pt(14)
                run_word.font.color.rgb = RGBColor(0, 0, 139)  # 深蓝色
                 
                # 添加时间(小字)
                p_word.add_run(f"  ({item['time']})").font.size = Pt(8)
                 
                # 释义行
                p_meaning = doc.add_paragraph()
                meanings = item["meaning"].split(',')
                 
                # 前两个释义加粗
                first_part = ','.join(meanings[:2])
                run_meaning1 = p_meaning.add_run(first_part)
                run_meaning1.font.name = "微软雅黑"
                run_meaning1._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
                run_meaning1.font.size = Pt(10)
                run_meaning1.bold = True
                 
                # 剩余释义正常
                if len(meanings) > 2:
                    remaining_part = ','.join(meanings[2:])
                    p_meaning.add_run(remaining_part).font.name = "微软雅黑"
                    p_meaning.runs[-1]._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
                 
                # 添加分隔线
                doc.add_paragraph("_"*50).runs[0].font.color.rgb = RGBColor(200, 200, 200)
            
            doc.save(filepath)
            Messagebox.show_info(
                f"成功导出 {len(words)} 个单词到:\n{filepath}",
                parent=self.root
            )
            
            # 询问是否打开文件
            if Messagebox.show_question(
                "导出成功,是否现在打开文件?",
                parent=self.root
            ) == "确认":
                #webbrowser.open(filepath)
                try:
                    # 确保文件存在
                    if os.path.exists(filepath):
                        # 使用系统原生方式打开
                        if sys.platform == "win32":
                            os.startfile(filepath)
                        else:
                            opener = "open" if sys.platform == "darwin" else "xdg-open"
                            subprocess.call([opener, filepath])
                    else:
                        Messagebox.show_warning("文件不存在,可能保存失败", parent=self.root)
                except Exception as e:
                    Messagebox.show_error(f"打开文件失败: {str(e)}", parent=self.root)
                 
        except Exception as e:
            Messagebox.show_error(f"导出失败: {str(e)}", parent=self.root)
     
    def search_online(self):
        """在浏览器中在线搜索"""
        word = self.search_entry.get().strip()
        if not word:
            Messagebox.show_warning("请输入要查询的单词", parent=self.root)
            return
         
        url = f"https://cn.bing.com/dict/search?q={word}"
        webbrowser.open(url)
     
    def on_close(self):
        """关闭窗口时的清理工作"""
        try:
            self.conn.commit()
            self.conn.close()
            self.session.close()
            self.root.destroy()
        except:
            self.root.destroy()

if __name__ == '__main__':
    app = DictionaryApp()
    app.root.mainloop()
Twining   

[Python] 纯文本查看 复制代码import requests
import re
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from ttkbootstrap.dialogs import Messagebox, Querybox
import sqlite3
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
import os
from datetime import datetime
import webbrowser
class DictionaryApp:
    def __init__(self):
        # 初始化配置
        self.url = "https://cn.bing.com/dict/search"
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        })
        
        # 数据库连接
        self.db_file = 'wordlist.db'
        self.conn = sqlite3.connect(self.db_file)
        self.cursor = self.conn.cursor()
        self._init_db()
        
        # 临时存储列表
        self.temp_words = []
        
        # 创建主界面
        self.root = ttk.Window(title="高级词典工具", themename="litera")
        self.root.geometry("800x600")
        self._setup_ui()
        
    def _init_db(self):
        """初始化数据库表结构"""
        self.cursor.execute("""
        CREATE TABLE IF NOT EXISTS words (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            word TEXT UNIQUE,
            meaning TEXT,
            add_time TEXT,
            difficulty INTEGER DEFAULT 1
        )
        """)
        self.conn.commit()
   
    def _setup_ui(self):
        """设置用户界面"""
        # 顶部标题
        ttk.Label(
            self.root,
            text="高级词典工具",
            font=("微软雅黑", 16, "bold"),
            bootstyle="primary"
        ).pack(pady=10)
        
        # 搜索区域
        search_frame = ttk.Frame(self.root)
        search_frame.pack(fill=X, padx=10, pady=5)
        
        self.search_entry = ttk.Entry(
            search_frame,
            width=40,
            font=("微软雅黑", 12)
        )
        self.search_entry.pack(side=LEFT, padx=5)
        self.search_entry.bind("", lambda e: self.search_word())
        
        ttk.Button(
            search_frame,
            text="查询",
            command=self.search_word,
            bootstyle="primary"
        ).pack(side=LEFT, padx=5)
        
        ttk.Button(
            search_frame,
            text="在线搜索",
            command=self.search_online,
            bootstyle="info"
        ).pack(side=LEFT, padx=5)
        
        # 结果显示区域
        result_frame = ttk.Frame(self.root)
        result_frame.pack(fill=BOTH, expand=True, padx=10, pady=5)
        
        self.result_text = ttk.ScrolledText(
            result_frame,
            font=("微软雅黑", 11),
            wrap=WORD,
            height=15
        )
        self.result_text.pack(fill=BOTH, expand=True)
        self.result_text.config(state=DISABLED)
        
        # 操作按钮区域
        btn_frame = ttk.Frame(self.root)
        btn_frame.pack(fill=X, padx=10, pady=10)
        
        ttk.Button(
            btn_frame,
            text="添加到生词本",
            command=self.add_to_vocabulary,
            bootstyle="success"
        ).pack(side=LEFT, padx=5)
        
        ttk.Button(
            btn_frame,
            text="清空结果",
            command=self.clear_results,
            bootstyle="warning"
        ).pack(side=LEFT, padx=5)
        
        ttk.Button(
            btn_frame,
            text="管理生词本",
            command=self.manage_vocabulary,
            bootstyle="secondary"
        ).pack(side=LEFT, padx=5)
        
        ttk.Button(
            btn_frame,
            text="导出为Word",
            command=self.export_to_word,
            bootstyle="primary-outline"
        ).pack(side=RIGHT, padx=5)
        
        # 状态栏
        self.status_var = ttk.StringVar()
        self.status_var.set("就绪")
        ttk.Label(
            self.root,
            textvariable=self.status_var,
            relief=SUNKEN,
            anchor=W
        ).pack(fill=X, side=BOTTOM, ipady=2)
        
        # 窗口关闭事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_close)
   
    def search_word(self):
        """查询单词"""
        word = self.search_entry.get().strip()
        if not word:
            Messagebox.show_warning("请输入要查询的单词", parent=self.root)
            return
        
        self.status_var.set(f"正在查询: {word}...")
        self.root.update()
        
        try:
            result = self._search_word(word)
            self._display_result(word, result)
            self.status_var.set(f"查询完成: {word}")
        except Exception as e:
            Messagebox.show_error(f"查询失败: {str(e)}", parent=self.root)
            self.status_var.set("查询失败")
   
    def _search_word(self, word):
        """实际执行查询"""
        params = {"q": word}
        resp = self.session.get(self.url, params=params)
        resp.raise_for_status()
        
        # 使用正则提取释义
        pattern = re.compile(
            r'.*?)" />'
        )
        match = pattern.search(resp.text)
        
        if match:
            meaning = match.group("meaning")
            return meaning
        return None
   
    def _display_result(self, word, meaning):
        """显示查询结果"""
        self.result_text.config(state=NORMAL)
        self.result_text.delete(1.0, END)
        
        if meaning:
            # 添加单词
            self.result_text.insert(END, f"单词: ", "bold")
            self.result_text.insert(END, f"{word}\n", "word")
            
            # 添加释义
            self.result_text.insert(END, "\n释义:\n", "bold")
            meanings = meaning.split(',')
            for i, m in enumerate(meanings, 1):
                self.result_text.insert(END, f"{i}. {m}\n")
            
            # 临时存储
            self.temp_words = [(word, meaning)]
        else:
            self.result_text.insert(END, f"未找到单词 '{word}' 的释义\n", "error")
        
        self.result_text.config(state=DISABLED)
   
    def add_to_vocabulary(self):
        """添加到生词本"""
        if not self.temp_words:
            Messagebox.show_warning("没有可添加的单词", parent=self.root)
            return
        
        success = 0
        for word, meaning in self.temp_words:
            try:
                self.cursor.execute(
                    "INSERT OR IGNORE INTO words (word, meaning, add_time) VALUES (?, ?, ?)",
                    (word, meaning, datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
                )
                success += 1
            except sqlite3.Error as e:
                continue
        
        self.conn.commit()
        Messagebox.show_info(
            f"成功添加 {success}/{len(self.temp_words)} 个单词到生词本",
            parent=self.root
        )
        self.temp_words = []
   
    def clear_results(self):
        """清空结果"""
        self.result_text.config(state=NORMAL)
        self.result_text.delete(1.0, END)
        self.result_text.config(state=DISABLED)
        self.temp_words = []
        self.status_var.set("已清空结果")
   
    def manage_vocabulary(self):
        """管理生词本"""
        manage_window = ttk.Toplevel(title="生词本管理")
        manage_window.geometry("900x600")
        
        # 创建树形表格
        columns = ("word", "meaning", "add_time")
        tree = ttk.Treeview(
            manage_window,
            columns=columns,
            show="headings",
            selectmode="extended",
            bootstyle="primary"
        )
        
        # 设置列
        tree.heading("word", text="单词", anchor=W)
        tree.heading("meaning", text="释义", anchor=W)
        tree.heading("add_time", text="添加时间", anchor=W)
        
        tree.column("word", width=150, minwidth=100)
        tree.column("meaning", width=500, minwidth=300)
        tree.column("add_time", width=150, minwidth=100)
        
        # 添加滚动条
        scrollbar = ttk.Scrollbar(
            manage_window,
            orient=VERTICAL,
            command=tree.yview
        )
        tree.configure(yscrollcommand=scrollbar.set)
        scrollbar.pack(side=RIGHT, fill=Y)
        tree.pack(fill=BOTH, expand=True, padx=5, pady=5)
        
        # 加载数据
        self._load_vocabulary_data(tree)
        
        # 操作按钮区域
        btn_frame = ttk.Frame(manage_window)
        btn_frame.pack(fill=X, padx=5, pady=5)
        
        ttk.Button(
            btn_frame,
            text="删除选中",
            command=lambda: self._delete_selected_words(tree),
            bootstyle="danger"
        ).pack(side=LEFT, padx=5)
        
        ttk.Button(
            btn_frame,
            text="导出选中",
            command=lambda: self._export_selected_words(tree),
            bootstyle="success"
        ).pack(side=LEFT, padx=5)
        
        ttk.Button(
            btn_frame,
            text="刷新列表",
            command=lambda: self._load_vocabulary_data(tree),
            bootstyle="info"
        ).pack(side=RIGHT, padx=5)
   
    def _load_vocabulary_data(self, tree):
        """加载生词本数据到表格"""
        for item in tree.get_children():
            tree.delete(item)
        
        try:
            rows = self.cursor.execute("""
                SELECT word, meaning, add_time FROM words
                ORDER BY add_time DESC
            """).fetchall()
            
            for row in rows:
                tree.insert("", END, values=row)
        except sqlite3.Error as e:
            Messagebox.show_error(f"加载数据失败: {str(e)}", parent=tree.winfo_toplevel())
   
    def _delete_selected_words(self, tree):
        """删除选中的单词"""
        selected_items = tree.selection()
        if not selected_items:
            Messagebox.show_warning("请先选择要删除的单词", parent=tree.winfo_toplevel())
            return
        
        if Messagebox.show_question(
            f"确定要删除这 {len(selected_items)} 个单词吗?",
            parent=tree.winfo_toplevel()
        ) != "是":
            return
        
        deleted = 0
        for item in selected_items:
            word = tree.item(item)['values'][0]
            try:
                self.cursor.execute("DELETE FROM words WHERE word=?", (word,))
                deleted += 1
            except sqlite3.Error:
                continue
        
        self.conn.commit()
        Messagebox.show_info(
            f"成功删除 {deleted}/{len(selected_items)} 个单词",
            parent=tree.winfo_toplevel()
        )
        self._load_vocabulary_data(tree)
   
    def _export_selected_words(self, tree):
        """导出选中的单词"""
        selected_items = tree.selection()
        if not selected_items:
            Messagebox.show_warning("请先选择要导出的单词", parent=tree.winfo_toplevel())
            return
        
        words = []
        for item in selected_items:
            word_data = tree.item(item)['values']
            words.append({
                "word": word_data[0],
                "meaning": word_data[1],
                "time": word_data[2]
            })
        
        self._export_words_to_file(words)
   
    def export_to_word(self):
        """导出全部单词到Word"""
        words = []
        try:
            rows = self.cursor.execute("""
                SELECT word, meaning, add_time FROM words
                ORDER BY word COLLATE NOCASE
            """).fetchall()
            
            for row in rows:
                words.append({
                    "word": row[0],
                    "meaning": row[1],
                    "time": row[2]
                })
        except sqlite3.Error as e:
            Messagebox.show_error(f"加载数据失败: {str(e)}", parent=self.root)
            return
        
        if not words:
            Messagebox.show_warning("生词本为空,没有可导出的单词", parent=self.root)
            return
        
        self._export_words_to_file(words)
   
    def _export_words_to_file(self, words):
        """实际执行导出到Word文件"""
        default_filename = f"单词表_{datetime.now().strftime('%Y%m%d_%H%M%S')}.docx"
        
        # 让用户选择保存位置
        filepath = Querybox.get_saveasfilename(
            initialfile=default_filename,
            defaultextension=".docx",
            filetypes=[("Word文档", "*.docx")],
            parent=self.root
        )
        
        if not filepath:
            return
        
        try:
            doc = Document()
            
            # 添加标题
            title = doc.add_heading("我的生词本", level=1)
            title.alignment = 1  # 居中
            
            # 添加统计信息
            doc.add_paragraph(f"共 {len(words)} 个单词 | 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
            doc.add_paragraph("\n")
            
            # 添加单词内容
            for item in words:
                # 单词行
                p_word = doc.add_paragraph()
                run_word = p_word.add_run(item["word"])
                run_word.bold = True
                run_word.font.name = "Times New Roman"
                run_word.font.size = Pt(14)
                run_word.font.color.rgb = RGBColor(0, 0, 139)  # 深蓝色
               
                # 添加时间(小字)
                p_word.add_run(f"  ({item['time']})").font.size = Pt(8)
               
                # 释义行
                p_meaning = doc.add_paragraph()
                meanings = item["meaning"].split(',')
               
                # 前两个释义加粗
                first_part = ','.join(meanings[:2])
                run_meaning1 = p_meaning.add_run(first_part)
                run_meaning1.font.name = "微软雅黑"
                run_meaning1._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
                run_meaning1.font.size = Pt(10)
                run_meaning1.bold = True
               
                # 剩余释义正常
                if len(meanings) > 2:
                    remaining_part = ','.join(meanings[2:])
                    p_meaning.add_run(remaining_part).font.name = "微软雅黑"
                    p_meaning.runs[-1]._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
               
                # 添加分隔线
                doc.add_paragraph("_"*50).runs[0].font.color.rgb = RGBColor(200, 200, 200)
            
            doc.save(filepath)
            Messagebox.show_info(
                f"成功导出 {len(words)} 个单词到:\n{filepath}",
                parent=self.root
            )
            
            # 询问是否打开文件
            if Messagebox.show_question(
                "导出成功,是否现在打开文件?",
                parent=self.root
            ) == "是":
                webbrowser.open(filepath)
               
        except Exception as e:
            Messagebox.show_error(f"导出失败: {str(e)}", parent=self.root)
   
    def search_online(self):
        """在浏览器中在线搜索"""
        word = self.search_entry.get().strip()
        if not word:
            Messagebox.show_warning("请输入要查询的单词", parent=self.root)
            return
        
        url = f"https://cn.bing.com/dict/search?q={word}"
        webbrowser.open(url)
   
    def on_close(self):
        """关闭窗口时的清理工作"""
        try:
            self.conn.commit()
            self.conn.close()
            self.session.close()
            self.root.destroy()
        except:
            self.root.destroy()
if __name__ == '__main__':
    app = DictionaryApp()
    app.root.mainloop()
mryouan   

运行是什么样的效果啊?
seanjared123   

想问下音标的发音有吗?
BBA119   

运行界面及效果展示能看看吗
cc5i1   


BBA119 发表于 2025-4-28 08:14
运行界面及效果展示能看看吗

同问,看看效果怎么样
retsyo   

要是有个截图,就更好了
8204118   

我英语就26字母水平
abch891   

不错的,有空试一下
您需要登录后才可以回帖 登录 | 立即注册

返回顶部