blackantt 发表于 2025-9-8 20:48:52

用pyside6写1个简单的查词词典(1个mdx和4个配套的mdd文件的查词词典)

用pyside6写1个简单的查词词典(1个mdx和4个配套的mdd文件的查词词典)

oaldpe.mdx
oaldpe.mdd
oaldpe.1.mdd
oaldpe.2.mdd
oaldpe.3.mdd

FishC 发表于 2025-9-8 20:50:21

下面是一个使用 PySide6 创建的简单查词词典程序,可以读取 mdx 文件和配套的 mdd 资源文件:


import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget,
                               QVBoxLayout, QHBoxLayout, QLineEdit,
                               QPushButton, QTextBrowser)
from PySide6.QtCore import Qt
from readmdict import MDict
import os

class DictionaryApp(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("简单词典")
      self.setGeometry(100, 100, 800, 600)
      
      # 加载词典文件
      base_path = "."# 假设词典文件在当前目录
      mdx_file = "oaldpe.mdx"
      mdd_files = ["oaldpe.mdd", "oaldpe.1.mdd", "oaldpe.2.mdd", "oaldpe.3.mdd"]
      
      try:
            self.mdict = MDict(os.path.join(base_path, mdx_file))
            self.mdd_dicts = [MDict(os.path.join(base_path, mdd)) for mdd in mdd_files
                            if os.path.exists(os.path.join(base_path, mdd))]
      except Exception as e:
            print(f"加载词典文件出错: {e}")
            self.mdict = None
            self.mdd_dicts = []
      
      self.init_ui()
   
    def init_ui(self):
      central_widget = QWidget()
      self.setCentralWidget(central_widget)
      
      layout = QVBoxLayout(central_widget)
      
      # 搜索栏
      search_layout = QHBoxLayout()
      self.search_input = QLineEdit()
      self.search_input.setPlaceholderText("输入要查询的单词")
      self.search_input.returnPressed.connect(self.search_word)
      
      search_button = QPushButton("搜索")
      search_button.clicked.connect(self.search_word)
      
      search_layout.addWidget(self.search_input)
      search_layout.addWidget(search_button)
      
      # 结果显示区域
      self.result_display = QTextBrowser()
      self.result_display.setOpenExternalLinks(True)
      
      layout.addLayout(search_layout)
      layout.addWidget(self.result_display)
   
    def search_word(self):
      if not self.mdict:
            self.result_display.setHtml("<h3>词典文件加载失败</h3>")
            return
            
      word = self.search_input.text().strip()
      if not word:
            return
            
      try:
            # 查询单词
            result = self.mdict.lookup(word)
            if result:
                # 获取HTML内容
                html_content = result.decode('utf-8', errors='ignore')
                self.result_display.setHtml(html_content)
            else:
                self.result_display.setHtml(f"<h3>未找到单词: {word}</h3>")
      except Exception as e:
            self.result_display.setHtml(f"<h3>查询出错: {str(e)}</h3>")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DictionaryApp()
    window.show()
    sys.exit(app.exec())


使用前需要安装以下依赖:

安装必要的库:

pip install PySide6 readmdict


使用说明:
1. 确保 oaldpe.mdx 和配套的 mdd 文件在同一目录下
2. 运行程序后,在输入框中输入要查询的单词
3. 按回车或点击搜索按钮查看结果

注意事项:
1. 这个示例使用了 readmdict 库来读取 mdx 文件
2. 程序会尝试加载所有存在的 mdd 资源文件
3. 显示的内容是原始的 HTML 格式,可能包含样式和图片引用
4. 如果查询的单词不存在,会显示提示信息

扩展功能建议:
1. 添加历史记录功能
2. 实现单词收藏功能
3. 添加发音功能(需要处理音频资源)
4. 改进界面样式和用户体验
5. 添加模糊查询和自动补全功能

这个基础版本应该能够满足基本的查词需求。如果需要更复杂的功能,可以在此基础上进行扩展。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

blackantt 发表于 2025-9-8 20:53:18

FishC 发表于 2025-9-8 20:50
下面是一个使用 PySide6 创建的简单查词词典程序,可以读取 mdx 文件和配套的 mdd 资源文件:




Traceback (most recent call last):
File "h:\words-11\words11\test_mdd_viewer-fish.py", line 7, in <module>
    from readmdict import MDict
ImportError: cannot import name 'MDict' from 'readmdict' (C:\Users\dengz\anaconda3\envs\spacy_env311_gpu\Lib\site-packages\readmdict\__init__.py)

FishC 发表于 2025-9-8 20:55:05

blackantt 发表于 2025-09-08 20:53
FishC 发表于 2025-9-8 20:50
下面是一个使用 PySide ...

看起来您遇到了导入问题。让我提供一个使用纯 Python 解析 MDX 文件的简单词典实现,不需要额外的 `readmdict` 库:


import sys
import struct
import re
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget,
                               QVBoxLayout, QHBoxLayout, QLineEdit,
                               QPushButton, QTextBrowser)
from PySide6.QtCore import Qt

class MDXParser:
    def __init__(self, mdx_file):
      self.mdx_file = mdx_file
      self.entries = {}
      self.load_mdx()
   
    def load_mdx(self):
      try:
            with open(self.mdx_file, 'rb') as f:
                # 读取文件头信息
                header = f.read(4)
                if header != b'MDX\x00':
                  raise ValueError("不是有效的MDX文件")
               
                # 跳过文件头,直接读取词条
                # 这是一个简化的实现,实际MDX文件结构更复杂
                f.seek(0)
                content = f.read()
               
                # 使用正则表达式查找词条
                # 注意:这是一个简化的实现,实际MDX格式更复杂
                pattern = rb'@@@LINK=([^|]+)|<a href="([^"]+)">([^<]+)</a>'
                matches = re.findall(pattern, content)
               
                for match in matches:
                  if match:# LINK格式
                        key = match.decode('utf-8', errors='ignore')
                        self.entries = f"重定向到: {key}"
                  elif match:# 超链接格式
                        key = match.decode('utf-8', errors='ignore')
                        self.entries = f"词条: {key}"
      
      except Exception as e:
            print(f"加载MDX文件出错: {e}")
   
    def lookup(self, word):
      return self.entries.get(word, b'')

class DictionaryApp(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("简单词典")
      self.setGeometry(100, 100, 800, 600)
      
      # 加载词典文件
      mdx_file = "oaldpe.mdx"
      try:
            self.parser = MDXParser(mdx_file)
      except Exception as e:
            print(f"初始化词典解析器出错: {e}")
            self.parser = None
      
      self.init_ui()
   
    def init_ui(self):
      central_widget = QWidget()
      self.setCentralWidget(central_widget)
      
      layout = QVBoxLayout(central_widget)
      
      # 搜索栏
      search_layout = QHBoxLayout()
      self.search_input = QLineEdit()
      self.search_input.setPlaceholderText("输入要查询的单词")
      self.search_input.returnPressed.connect(self.search_word)
      
      search_button = QPushButton("搜索")
      search_button.clicked.connect(self.search_word)
      
      search_layout.addWidget(self.search_input)
      search_layout.addWidget(search_button)
      
      # 结果显示区域
      self.result_display = QTextBrowser()
      self.result_display.setOpenExternalLinks(True)
      
      layout.addLayout(search_layout)
      layout.addWidget(self.result_display)
   
    def search_word(self):
      if not self.parser:
            self.result_display.setHtml("词典文件加载失败")
            return
            
      word = self.search_input.text().strip()
      if not word:
            return
            
      try:
            # 查询单词
            result = self.parser.lookup(word)
            if result:
                self.result_display.setPlainText(result)
            else:
                self.result_display.setPlainText(f"未找到单词: {word}")
      except Exception as e:
            self.result_display.setPlainText(f"查询出错: {str(e)}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DictionaryApp()
    window.show()
    sys.exit(app.exec())


注意:这个实现是一个简化版本,实际上MDX文件格式比较复杂,包含压缩数据和特定的结构。要完整解析MDX文件,您可能需要使用专门的库。

如果您想使用更完整的MDX解析功能,我建议尝试以下方法:

1. 安装正确版本的readmdict库:

pip install readmdict


2. 或者尝试使用另一个MDX解析库:

pip install mdict-utils


3. 如果仍然无法导入,您可以尝试直接从GitHub获取readmdict库:

pip install git+https://github.com/zhansliu/writemdict.git


如果您需要更完整的MDX文件支持,建议使用专门的MDX阅读器软件,或者寻找更成熟的MDX解析Python库。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 2025-9-8 23:03:21

blackantt 发表于 2025-9-9 00:30:56

某一个“天” 发表于 2025-9-8 23:03


找个好用的词典软件

某一个“天” 发表于 2025-9-9 00:31:58

blackantt 发表于 2025-9-9 00:30
找个好用的词典软件

有道

blackantt 发表于 2025-9-9 00:39:15

某一个“天” 发表于 2025-9-9 00:31
有道

代码 :)

某一个“天” 发表于 2025-9-9 23:09:21

blackantt 发表于 2025-9-9 00:39
代码 :)

{:5_104:}
页: [1]
查看完整版本: 用pyside6写1个简单的查词词典(1个mdx和4个配套的mdd文件的查词词典)