鱼C论坛

 找回密码
 立即注册
查看: 47|回复: 7

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

[复制链接]
发表于 昨天 20:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

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

oaldpe.mdx
oaldpe.mdd
oaldpe.1.mdd
oaldpe.2.mdd
oaldpe.3.mdd
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 20:50 | 显示全部楼层
下面是一个使用 PySide6 创建的简单查词词典程序,可以读取 mdx 文件和配套的 mdd 资源文件:


  1. import sys
  2. from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget,
  3.                                QVBoxLayout, QHBoxLayout, QLineEdit,
  4.                                QPushButton, QTextBrowser)
  5. from PySide6.QtCore import Qt
  6. from readmdict import MDict
  7. import os

  8. class DictionaryApp(QMainWindow):
  9.     def __init__(self):
  10.         super().__init__()
  11.         self.setWindowTitle("简单词典")
  12.         self.setGeometry(100, 100, 800, 600)
  13.         
  14.         # 加载词典文件
  15.         base_path = "."  # 假设词典文件在当前目录
  16.         mdx_file = "oaldpe.mdx"
  17.         mdd_files = ["oaldpe.mdd", "oaldpe.1.mdd", "oaldpe.2.mdd", "oaldpe.3.mdd"]
  18.         
  19.         try:
  20.             self.mdict = MDict(os.path.join(base_path, mdx_file))
  21.             self.mdd_dicts = [MDict(os.path.join(base_path, mdd)) for mdd in mdd_files
  22.                             if os.path.exists(os.path.join(base_path, mdd))]
  23.         except Exception as e:
  24.             print(f"加载词典文件出错: {e}")
  25.             self.mdict = None
  26.             self.mdd_dicts = []
  27.         
  28.         self.init_ui()
  29.    
  30.     def init_ui(self):
  31.         central_widget = QWidget()
  32.         self.setCentralWidget(central_widget)
  33.         
  34.         layout = QVBoxLayout(central_widget)
  35.         
  36.         # 搜索栏
  37.         search_layout = QHBoxLayout()
  38.         self.search_input = QLineEdit()
  39.         self.search_input.setPlaceholderText("输入要查询的单词")
  40.         self.search_input.returnPressed.connect(self.search_word)
  41.         
  42.         search_button = QPushButton("搜索")
  43.         search_button.clicked.connect(self.search_word)
  44.         
  45.         search_layout.addWidget(self.search_input)
  46.         search_layout.addWidget(search_button)
  47.         
  48.         # 结果显示区域
  49.         self.result_display = QTextBrowser()
  50.         self.result_display.setOpenExternalLinks(True)
  51.         
  52.         layout.addLayout(search_layout)
  53.         layout.addWidget(self.result_display)
  54.    
  55.     def search_word(self):
  56.         if not self.mdict:
  57.             self.result_display.setHtml("<h3>词典文件加载失败</h3>")
  58.             return
  59.             
  60.         word = self.search_input.text().strip()
  61.         if not word:
  62.             return
  63.             
  64.         try:
  65.             # 查询单词
  66.             result = self.mdict.lookup(word)
  67.             if result:
  68.                 # 获取HTML内容
  69.                 html_content = result[0].decode('utf-8', errors='ignore')
  70.                 self.result_display.setHtml(html_content)
  71.             else:
  72.                 self.result_display.setHtml(f"<h3>未找到单词: {word}</h3>")
  73.         except Exception as e:
  74.             self.result_display.setHtml(f"<h3>查询出错: {str(e)}</h3>")

  75. if __name__ == "__main__":
  76.     app = QApplication(sys.argv)
  77.     window = DictionaryApp()
  78.     window.show()
  79.     sys.exit(app.exec())
复制代码


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

安装必要的库:

  1. 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:53 | 显示全部楼层
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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 20:55 | 显示全部楼层
blackantt 发表于 2025-09-08 20:53
FishC 发表于 2025-9-8 20:50
下面是一个使用 PySide ...


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


  1. import sys
  2. import struct
  3. import re
  4. from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget,
  5.                                QVBoxLayout, QHBoxLayout, QLineEdit,
  6.                                QPushButton, QTextBrowser)
  7. from PySide6.QtCore import Qt

  8. class MDXParser:
  9.     def __init__(self, mdx_file):
  10.         self.mdx_file = mdx_file
  11.         self.entries = {}
  12.         self.load_mdx()
  13.    
  14.     def load_mdx(self):
  15.         try:
  16.             with open(self.mdx_file, 'rb') as f:
  17.                 # 读取文件头信息
  18.                 header = f.read(4)
  19.                 if header != b'MDX\x00':
  20.                     raise ValueError("不是有效的MDX文件")
  21.                
  22.                 # 跳过文件头,直接读取词条
  23.                 # 这是一个简化的实现,实际MDX文件结构更复杂
  24.                 f.seek(0)
  25.                 content = f.read()
  26.                
  27.                 # 使用正则表达式查找词条
  28.                 # 注意:这是一个简化的实现,实际MDX格式更复杂
  29.                 pattern = rb'@@@LINK=([^|]+)|<a href="([^"]+)">([^<]+)</a>'
  30.                 matches = re.findall(pattern, content)
  31.                
  32.                 for match in matches:
  33.                     if match[0]:  # LINK格式
  34.                         key = match[0].decode('utf-8', errors='ignore')
  35.                         self.entries[key] = f"重定向到: {key}"
  36.                     elif match[2]:  # 超链接格式
  37.                         key = match[2].decode('utf-8', errors='ignore')
  38.                         self.entries[key] = f"词条: {key}"
  39.         
  40.         except Exception as e:
  41.             print(f"加载MDX文件出错: {e}")
  42.    
  43.     def lookup(self, word):
  44.         return self.entries.get(word, b'')

  45. class DictionaryApp(QMainWindow):
  46.     def __init__(self):
  47.         super().__init__()
  48.         self.setWindowTitle("简单词典")
  49.         self.setGeometry(100, 100, 800, 600)
  50.         
  51.         # 加载词典文件
  52.         mdx_file = "oaldpe.mdx"
  53.         try:
  54.             self.parser = MDXParser(mdx_file)
  55.         except Exception as e:
  56.             print(f"初始化词典解析器出错: {e}")
  57.             self.parser = None
  58.         
  59.         self.init_ui()
  60.    
  61.     def init_ui(self):
  62.         central_widget = QWidget()
  63.         self.setCentralWidget(central_widget)
  64.         
  65.         layout = QVBoxLayout(central_widget)
  66.         
  67.         # 搜索栏
  68.         search_layout = QHBoxLayout()
  69.         self.search_input = QLineEdit()
  70.         self.search_input.setPlaceholderText("输入要查询的单词")
  71.         self.search_input.returnPressed.connect(self.search_word)
  72.         
  73.         search_button = QPushButton("搜索")
  74.         search_button.clicked.connect(self.search_word)
  75.         
  76.         search_layout.addWidget(self.search_input)
  77.         search_layout.addWidget(search_button)
  78.         
  79.         # 结果显示区域
  80.         self.result_display = QTextBrowser()
  81.         self.result_display.setOpenExternalLinks(True)
  82.         
  83.         layout.addLayout(search_layout)
  84.         layout.addWidget(self.result_display)
  85.    
  86.     def search_word(self):
  87.         if not self.parser:
  88.             self.result_display.setHtml("词典文件加载失败")
  89.             return
  90.             
  91.         word = self.search_input.text().strip()
  92.         if not word:
  93.             return
  94.             
  95.         try:
  96.             # 查询单词
  97.             result = self.parser.lookup(word)
  98.             if result:
  99.                 self.result_display.setPlainText(result)
  100.             else:
  101.                 self.result_display.setPlainText(f"未找到单词: {word}")
  102.         except Exception as e:
  103.             self.result_display.setPlainText(f"查询出错: {str(e)}")

  104. if __name__ == "__main__":
  105.     app = QApplication(sys.argv)
  106.     window = DictionaryApp()
  107.     window.show()
  108.     sys.exit(app.exec())
复制代码


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

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

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

  1. pip install readmdict
复制代码


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

  1. pip install mdict-utils
复制代码


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

  1. pip install git+[url=https://github.com/zhansliu/writemdict.git]https://github.com/zhansliu/writemdict.git[/url]
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层

找个好用的词典软件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
blackantt 发表于 2025-9-9 00:30
找个好用的词典软件

有道
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-9 11:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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