From 9f25a4e310d0eb2292fdd19e50b9ee207c707308 Mon Sep 17 00:00:00 2001 From: Allan Date: Sun, 10 Oct 2021 21:05:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9C=AC=E5=9C=B0=E8=AF=8D?= =?UTF-8?q?=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/UI/clipboard.py | 17 +++- src/UI/download_dict.py | 174 ++++++++++++++++++++++++++++++++++++++++ src/UI/find_word.py | 12 ++- src/UI/result.py | 14 +++- src/UI/setting.py | 174 ++++++++++++++++++++++++++++++++-------- src/UI/util.py | 84 +++++++++++++++++++ src/backend/stardict.py | 45 ++++++++--- src/main.py | 9 ++- src/main_window.py | 8 +- src/setting.py | 20 ++++- src/util.py | 3 +- t.py | 3 + 12 files changed, 503 insertions(+), 60 deletions(-) create mode 100644 src/UI/download_dict.py create mode 100644 src/UI/util.py create mode 100644 t.py diff --git a/src/UI/clipboard.py b/src/UI/clipboard.py index 008c239..893fc72 100644 --- a/src/UI/clipboard.py +++ b/src/UI/clipboard.py @@ -6,14 +6,17 @@ from PyQt5.QtWidgets import QVBoxLayout, QLabel, QApplication, QWidget from src.UI.result import ResultWindow +from src.backend.stardict import StartDict from src.backend.youdao import YouDaoFanYi +from src.setting import setting class TipWindow(QWidget): last_text = "" - def __init__(self, youdao: YouDaoFanYi): + def __init__(self, youdao: YouDaoFanYi, star_dict: StartDict): super().__init__() + self.star_dict = star_dict self.setMinimumSize(QSize(360, 280)) self.clipboard = QApplication.clipboard() self.clipboard.dataChanged.connect(self.on_data_changed) @@ -51,7 +54,6 @@ def on_data_changed(self): return self.last_text = "" is_word, result = self.youdao.translate(data) - print(json.dumps(result, indent=4, ensure_ascii=False)) if is_word: succeed = self.result.show_word_result(result) self.label_src.setText(data) @@ -59,6 +61,17 @@ def on_data_changed(self): else: succeed = self.result.show_text_result(result) self.label_src.hide() + res = self.star_dict.translate_word(data) + for k in res.keys(): + if res[k] == '': + continue + count = len(setting.dicts_for_clipboard) + if count < 1: + continue + if k in setting.dicts_for_clipboard\ + or (count == 1 and setting.dicts_for_clipboard[0] == "*"): + self.result.add_word_result(k, res[k]) + succeed = True if succeed: self.show() diff --git a/src/UI/download_dict.py b/src/UI/download_dict.py new file mode 100644 index 0000000..1622d13 --- /dev/null +++ b/src/UI/download_dict.py @@ -0,0 +1,174 @@ +import os +import threading + +import requests +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtWidgets import QDialog, QVBoxLayout, \ + QTableWidget, QHeaderView, QAbstractItemView, QTableView, QTableWidgetItem, QPushButton, QProgressBar +from pystardict import Dictionary + +from src import setting +from src.UI.util import create_line, create_widget_with_layout +from src.backend.stardict import StartDict + + +class MyPushButton(QPushButton): + d: Dictionary = None + + +class DownloadDialog(QDialog): + signal_reload_dict = pyqtSignal() + signal_change_progress = pyqtSignal(int, int) + dicts = { + "朗道英汉字典5.0": { + "url": "http://download.huzheng.org/zh_CN/stardict-langdao-ec-gb-2.4.2.tar.bz2", + "count": 435468, + "size": "9.1M" + }, + "朗道汉英字典5.0": { + "url": "http://download.huzheng.org/zh_CN/stardict-langdao-ce-gb-2.4.2.tar.bz2", + "count": 405719, + "size": "7.8M" + }, + "懒虫简明英汉词典": { + "url": "http://download.huzheng.org/zh_CN/stardict-lazyworm-ec-2.4.2.tar.bz2", + "count": 452185, + "size": "10M" + }, + "懒虫简明汉英词典": { + "url": "http://download.huzheng.org/zh_CN/stardict-lazyworm-ce-2.4.2.tar.bz2", + "count": 119592, + "size": "1.7M" + }, + "新世纪英汉科技大词典": { + "url": "http://download.huzheng.org/zh_CN/stardict-ncce-ec-2.4.2.tar.bz2", + "count": 626953, + "size": "10.4M" + }, + "新世纪汉英科技大词典": { + "url": "http://download.huzheng.org/zh_CN/stardict-ncce-ce-2.4.2.tar.bz2", + "count": 621241, + "size": "10.6M" + }, + "计算机词汇": { + "url": "http://download.huzheng.org/zh_CN/stardict-kdic-computer-gb-2.4.2.tar.bz2", + "count": 6131, + "size": "683K" + }, + "新华字典": { + "url": "http://download.huzheng.org/zh_CN/stardict-xhzd-2.4.2.tar.bz2", + "count": 74025, + "size": "8.9M" + }, + "汉语成语词典": { + "url": "http://download.huzheng.org/zh_CN/stardict-hanyuchengyucidian_fix-2.4.2.tar.bz2", + "count": 13305, + "size": "2.8M" + }, + } + + def __init__(self, parent, star_dict: StartDict): + super().__init__(parent) + self.setWindowTitle("下载离线词典") + self.star_dict = star_dict + self.star_dict.signal_load_dict_finish.connect(self.init_dict) + self.signal_reload_dict.connect(self.init_dict) + self.signal_change_progress.connect(self.on_progress) + self.setMinimumHeight(520) + self.setMinimumWidth(760) + self.list_dicts = QTableWidget() + self.list_dicts.setRowCount(len(self.dicts.keys())) + self.list_dicts.setColumnCount(4) + self.list_dicts.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) + self.list_dicts.setEditTriggers(QTableView.NoEditTriggers) + self.list_dicts.setSelectionMode(QAbstractItemView.SingleSelection) + self.list_dicts.setSelectionBehavior(QAbstractItemView.SelectRows) + + self.can_download = True + self.btn_cancel_download = QPushButton("取消") + self.btn_cancel_download.clicked.connect(self.on_cancel_download) + self.btn_cancel_download.hide() + + self.progress = QProgressBar() + self.progress.hide() + vbox = QVBoxLayout() + vbox.addWidget(self.list_dicts) + vbox.addItem(create_line([self.progress, self.btn_cancel_download])) + self.setLayout(vbox) + + self.init_dict() + + def init_dict(self): + self.list_dicts.clear() + self.list_dicts.setHorizontalHeaderLabels(['名称', '词汇数量', '大小', '管理']) + for i, k in enumerate(self.dicts.keys()): + self.list_dicts.setRowHeight(i, 64) + info = self.dicts[k] + self.list_dicts.setItem(i, 0, QTableWidgetItem(k)) + self.list_dicts.setItem(i, 1, QTableWidgetItem(str(info["count"]))) + self.list_dicts.setItem(i, 2, QTableWidgetItem(info["size"])) + if not self.star_dict.exist(k): + btn_add = MyPushButton("下载") + btn_add.d = self.dicts[k] + btn_add.clicked.connect(self.on_download) + self.list_dicts.setCellWidget(i, 3, create_widget_with_layout(create_line([btn_add]))) + + for d in self.star_dict.dists: + d: Dictionary + if d.ifo.bookname in self.dicts.keys(): + continue + i = self.list_dicts.rowCount() + self.list_dicts.setRowHeight(i, 64) + self.list_dicts.setItem(i, 0, QTableWidgetItem(d.ifo.bookname)) + self.list_dicts.setItem(i, 1, QTableWidgetItem(str(d.ifo.wordcount))) + self.list_dicts.setItem(i, 2, QTableWidgetItem(str(d.ifo.idxfilesize))) + if self.progress: + self.progress.hide() + if self.btn_cancel_download: + self.btn_cancel_download.hide() + + def on_download(self): + sender = self.sender() + sender: MyPushButton + self.can_download = True + self.progress.setValue(0) + self.progress.show() + self.btn_cancel_download.show() + self.btn_cancel_download.setEnabled(not self.can_download) + # download dict may be use very long time, so do it in a thread + t = threading.Thread(target=self.do_download, args=(sender.d["url"], )) + t.start() + + def on_progress(self, curr, total): + self.progress.setMaximum(total) + self.progress.setValue(curr) + + def do_download(self, url): + path = "{}/tmp".format(setting.setting_folder) + if not os.path.exists(path): + os.makedirs(path) + filename = os.path.split(url)[-1] + f = open(os.path.join(path, filename), "w+b") + with requests.get(url, stream=True) as r: + filesize = r.headers["Content-Length"] + chunk_size = 128 + total = int(filesize) // chunk_size + self.signal_change_progress.emit(0, total) + curr = 1 + for chunk in r.iter_content(chunk_size): + if not self.can_download: + break + f.write(chunk) + if curr <= total: + self.signal_change_progress.emit(curr, total) + curr += 1 + f.close() + if self.can_download: + os.system("tar -xf {} -C {}".format(os.path.join(path, filename), setting.setting.star_dict_folder)) + self.star_dict.load() + self.signal_reload_dict.emit() + os.remove(os.path.join(path, filename)) + + def on_cancel_download(self): + self.can_download = False + self.btn_cancel_download.setEnabled(not self.can_download) diff --git a/src/UI/find_word.py b/src/UI/find_word.py index a204c5a..642a7c0 100644 --- a/src/UI/find_word.py +++ b/src/UI/find_word.py @@ -8,10 +8,9 @@ class FindWord(QWidget): - def __init__(self, youdao: YouDaoFanYi, parent=None): + def __init__(self, youdao: YouDaoFanYi, star_dict: StartDict, parent=None): super().__init__(parent) - - self.star_dict = StartDict(setting.star_dict_folder, True) + self.star_dict = star_dict self.youdao = youdao self.edit_word = QLineEdit() self.edit_word.setPlaceholderText("搜索单词") @@ -44,4 +43,9 @@ def on_find(self): for k in res.keys(): if res[k] == '': continue - self.result.add_word_result(k, res[k]) + count = len(setting.dicts_for_query) + if count < 1: + continue + if k in setting.dicts_for_query\ + or (count == 1 and setting.dicts_for_query[0] == "*"): + self.result.add_word_result(k, res[k]) diff --git a/src/UI/result.py b/src/UI/result.py index 9de9175..6136125 100644 --- a/src/UI/result.py +++ b/src/UI/result.py @@ -10,6 +10,12 @@ class ResultWindow(QWidget): last_text = "" + css = '' def __init__(self, parent): super().__init__(parent) @@ -92,7 +98,7 @@ def show_word_result(self, result): if res != '': res += "
" res += "    {}".format(self.plan2html(item)) - res = "
有道词典

" + res + res = self.css + "
有道词典

" + res + "

" if 'ukspeach' in result and result['ukspeach'] != '': self.media_player_uk.setMedia( QMediaContent(QUrl(YouDaoFanYi.voice_addr(result['ukspeach']))) @@ -128,10 +134,12 @@ def plan2html(v: str): def add_word_result(self, k, v: str): html = self.edit_res.toHtml() + if self.css not in html: + html += self.css if "
" not in v and '
' not in v: v = v.replace('\n', '
') v = v.replace(' ', ' ') v = v.replace('\t', '    ') self.edit_res.setHtml("{}" - "
{}

" - "    
{}
".format(html, k, v)) + "
{}
" + "

{}

".format(html, k, v)) diff --git a/src/UI/setting.py b/src/UI/setting.py index b847f08..0d0aaf6 100644 --- a/src/UI/setting.py +++ b/src/UI/setting.py @@ -1,8 +1,15 @@ import os +import platform +import subprocess import sys -from PyQt5.QtWidgets import QVBoxLayout, QWidget, QCheckBox, QPushButton, QHBoxLayout +import pystardict +from PyQt5.QtWidgets import QWidget, QCheckBox, QPushButton, QLineEdit, QFileDialog, \ + QListWidget, QListWidgetItem +from src.UI.download_dict import DownloadDialog +from src.UI.util import create_grid, create_line, create_multi_line +from src.backend.stardict import StartDict from src.setting import setting @@ -20,46 +27,126 @@ class SettingWindow(QWidget): "Name[zh_CN]=我的词典\n"\ "Exec={}\n".format(sys.argv[0]) - def __init__(self, parent): + def __init__(self, parent, star_dict: StartDict): super().__init__(parent) - self.support_clipboard = QCheckBox("剪贴板取词(复制两次触发取词)") - self.support_clipboard.setToolTip("复制两次触发取词") - self.support_clipboard.clicked.connect(self.on_save) - self.show_main_window_when_startup = QCheckBox("启动时显示主窗口") - self.show_main_window_when_startup.clicked.connect(self.on_save) - self.auto_startup = QCheckBox("开机时启动") - self.auto_startup.clicked.connect(self.on_auto_startup) - self.create_desktop = QPushButton("创建快捷方式") - self.create_desktop.setMinimumWidth(180) - self.create_desktop.clicked.connect(self.on_create_desktop) - - self.support_clipboard.setChecked(setting.support_clipboard) - self.show_main_window_when_startup.setChecked(setting.show_main_window_when_startup) - self.auto_startup.setChecked(self.is_auto_startup()) - - vbox = QVBoxLayout() - vbox.setSpacing(8) - vbox.addWidget(self.support_clipboard) - vbox.addWidget(self.show_main_window_when_startup) - vbox.addWidget(self.auto_startup) - hbox = QHBoxLayout() - hbox.addWidget(self.create_desktop) - hbox.addStretch(1) - vbox.addItem(hbox) - vbox.addStretch(1) - - self.setLayout(vbox) + self.star_dict = star_dict + self.star_dict.signal_load_dict_finish.connect(self.init_dict) + + self.checkbox_use_dark_skin = QCheckBox("使用灰色主题") + self.checkbox_use_dark_skin.setChecked(setting.use_dark_skin) + self.checkbox_use_dark_skin.clicked.connect(self.on_save) + + self.checkbox_support_clipboard = QCheckBox("剪贴板取词(复制两次触发取词)") + self.checkbox_support_clipboard.setToolTip("复制两次触发取词") + self.checkbox_support_clipboard.clicked.connect(self.on_save) + + self.checkbox_show_main_window_when_startup = QCheckBox("启动时显示主窗口") + self.checkbox_show_main_window_when_startup.clicked.connect(self.on_save) + + self.checkbox_auto_startup = QCheckBox("开机时启动") + self.checkbox_auto_startup.clicked.connect(self.on_auto_startup) + + self.btn_create_desktop = QPushButton("创建快捷方式") + self.btn_create_desktop.setMinimumWidth(180) + self.btn_create_desktop.clicked.connect(self.on_create_desktop) + + self.btn_download_dict = QPushButton("下载离线词典") + self.btn_download_dict.setMinimumWidth(180) + self.btn_download_dict.clicked.connect(self.on_download_dict) + + self.edit_dict_folder = QLineEdit(setting.star_dict_folder) + self.btn_select_dict_folder = QPushButton("...") + self.btn_select_dict_folder.setMinimumWidth(80) + self.btn_select_dict_folder.clicked.connect(self.on_select_dict_folder) + self.btn_open_dict_folder = QPushButton("浏览") + self.btn_open_dict_folder.setMinimumWidth(80) + self.btn_open_dict_folder.clicked.connect(self.on_open_dict_folder) + + self.checkbox_support_clipboard.setChecked(setting.support_clipboard) + self.checkbox_show_main_window_when_startup.setChecked(setting.show_main_window_when_startup) + self.checkbox_auto_startup.setChecked(self.is_auto_startup()) + + self.list_query_dicts = QListWidget() + self.list_clipboard_dicts = QListWidget() + self.init_dict() + line_dicts = create_line([ + create_multi_line(["查询词典:", self.list_query_dicts]), + create_multi_line(["取词词典:", self.list_clipboard_dicts]) + ]) + items = [ + [self.checkbox_use_dark_skin], + [self.checkbox_support_clipboard], + [self.checkbox_show_main_window_when_startup], + [self.checkbox_auto_startup], + ["词典目录:", create_line([self.edit_dict_folder, self.btn_select_dict_folder, self.btn_open_dict_folder])], + [line_dicts], + [create_line([self.btn_create_desktop, self.btn_download_dict])], + ] + + self.setLayout(create_multi_line([create_grid(items), 1])) + + def init_dict(self): + self.list_query_dicts.clear() + self.list_clipboard_dicts.clear() + for i in self.star_dict.list(): + i: pystardict.Dictionary + item = QListWidgetItem() + self.list_query_dicts.addItem(item) + checkbox1 = QCheckBox(i.ifo.bookname) + checkbox1.clicked.connect(self.on_clicked_list_query_dicts) + if i.ifo.bookname in setting.dicts_for_query or\ + (len(setting.dicts_for_query) == 1 and setting.dicts_for_query[0] == "*"): + checkbox1.setChecked(True) + self.list_query_dicts.setItemWidget(item, checkbox1) + item2 = QListWidgetItem() + self.list_clipboard_dicts.addItem(item2) + checkbox2 = QCheckBox(i.ifo.bookname) + checkbox2.clicked.connect(self.on_clicked_list_clipboard_dicts) + if i.ifo.bookname in setting.dicts_for_clipboard or\ + (len(setting.dicts_for_clipboard) == 1 and setting.dicts_for_clipboard[0] == "*"): + checkbox2.setChecked(True) + self.list_clipboard_dicts.setItemWidget(item2, checkbox2) + + def on_clicked_list_query_dicts(self): + count = self.list_query_dicts.count() + cb_list = [self.list_query_dicts.itemWidget(self.list_query_dicts.item(i)) + for i in range(count)] + chooses = [] + for cb in cb_list: + if cb.isChecked(): + chooses.append(cb.text()) + if len(chooses) == count: + setting.dicts_for_query = ["*"] + else: + setting.dicts_for_query = chooses + setting.save() + + def on_clicked_list_clipboard_dicts(self): + count = self.list_clipboard_dicts.count() + cb_list = [self.list_clipboard_dicts.itemWidget(self.list_clipboard_dicts.item(i)) + for i in range(count)] + chooses = [] + for cb in cb_list: + if cb.isChecked(): + chooses.append(cb.text()) + if len(chooses) == count: + setting.dicts_for_clipboard = ["*"] + else: + setting.dicts_for_clipboard = chooses + setting.save() def on_save(self): - setting.support_clipboard = self.support_clipboard.isChecked() - setting.show_main_window_when_startup = self.show_main_window_when_startup.isChecked() + setting.use_dark_skin = self.checkbox_use_dark_skin.isChecked() + setting.support_clipboard = self.checkbox_support_clipboard.isChecked() + setting.show_main_window_when_startup = self.checkbox_show_main_window_when_startup.isChecked() + setting.star_dict_folder = self.edit_dict_folder.text() setting.save() def is_auto_startup(self): return os.path.exists(self.auto_startup_filename) def on_auto_startup(self): - if self.auto_startup.isChecked(): + if self.checkbox_auto_startup.isChecked(): with open(self.auto_startup_filename, "w+") as f: f.write(self.cfg_desktop) else: @@ -70,3 +157,26 @@ def on_create_desktop(self): with open("{}/.local/share/applications/my_dict.desktop".format(os.environ["HOME"]), "w+") as f: f.write(self.cfg_desktop) + def on_select_dict_folder(self): + dict_folder = QFileDialog.getExistingDirectory(self, "选择字典目录", self.edit_dict_folder.text()) + if dict_folder is None: + return + self.edit_dict_folder.setText(setting.star_dict_folder) + + def on_open_dict_folder(self): + file_path = self.edit_dict_folder.text() + if not os.path.exists(file_path): + return + + system_name = platform.system() + if system_name == 'Windows': + os.startfile(file_path) + elif system_name == 'Darwin': + subprocess.call(["open", file_path]) + else: + subprocess.call(["xdg-open", file_path]) + + def on_download_dict(self): + dd = DownloadDialog(self, self.star_dict) + dd.exec_() + self.init_dict() diff --git a/src/UI/util.py b/src/UI/util.py new file mode 100644 index 0000000..eecdd6e --- /dev/null +++ b/src/UI/util.py @@ -0,0 +1,84 @@ +from PyQt5 import QtCore +from PyQt5.QtWidgets import QGridLayout, QFormLayout, QLabel, QHBoxLayout, QLayout, QVBoxLayout, QWidget + + +def create_line(items, space=5): + hbox = QHBoxLayout() + hbox.setSpacing(space) + for item in items: + if isinstance(item, int): + hbox.addStretch(item) + elif isinstance(item, str): + hbox.addWidget(QLabel(item)) + elif isinstance(item, QLayout): + hbox.addItem(item) + else: + hbox.addWidget(item) + return hbox + + +def create_widget_with_layout(layout): + widget = QWidget() + widget.setLayout(layout) + return widget + + +def create_multi_line(items, space=8): + vbox = QVBoxLayout() + vbox.setSpacing(space) + for item in items: + if isinstance(item, int): + vbox.addStretch(item) + elif isinstance(item, str): + vbox.addWidget(QLabel(item)) + elif isinstance(item, QLayout): + vbox.addItem(item) + else: + vbox.addWidget(item) + return vbox + + +def create_grid(items, space=5): + col_count = 0 + for line in items: + col_count = max(col_count, len(line)) + + gl = QGridLayout() + gl.setSpacing(space) + for row, line_items in enumerate(items): + n = len(line_items) + for col, item in enumerate(line_items): + if isinstance(item, str): + item = QLabel(item) + if isinstance(item, QLayout): + gl.addItem(item, row, col, rowSpan=1, columnSpan=int(col_count/n)) + else: + gl.addWidget(item, row, col, 1, int(col_count/n), QtCore.Qt.AlignLeft) + + return gl + + +def create_form(items): + col_count = 0 + for line in items: + col_count = max(col_count, len(line)) + + qfl = QFormLayout() + for line in items: + if len(line) == 0: + qfl.addWidget(QLabel("")) + elif len(line) == 1: + qfl.addWidget(line[0]) + elif isinstance(line[0], str): + hbox = QHBoxLayout() + hbox.setSpacing(5) + for i in line[1:]: + hbox.addWidget(i) + qfl.addRow(line[0], hbox) + else: + hbox = QHBoxLayout() + hbox.setSpacing(5) + for i in line: + hbox.addWidget(i) + qfl.addItem(hbox) + return qfl diff --git a/src/backend/stardict.py b/src/backend/stardict.py index 23ae0cf..4a0691a 100644 --- a/src/backend/stardict.py +++ b/src/backend/stardict.py @@ -1,26 +1,53 @@ import os +import threading +from PyQt5.QtCore import pyqtSignal, QObject from pystardict import Dictionary -class StartDict(object): +class StartDict(QObject): dists = [] + signal_load_dict_finish = pyqtSignal() def __init__(self, folder, in_memory=False): - if not os.path.exists(folder): + super().__init__() + self.folder = folder + self.in_memory = in_memory + # load dict is very slowly, so do it in a thread + t = threading.Thread(target=self.load) + t.start() + + def load(self): + if not os.path.exists(self.folder): return - for f in os.listdir(folder): - self.load(os.path.join(folder, f), in_memory) + self.dists.clear() + for f in os.listdir(self.folder): + self._load(os.path.join(self.folder, f), self.in_memory) + self.signal_load_dict_finish.emit() + + def exist(self, name): + for k in self.dists: + k: Dictionary + if k.ifo.bookname == name: + return True + return False + + def get(self, name): + for k in self.dists: + k: Dictionary + if k.ifo.bookname == name: + return k + return None - def list(self): - return [d.ifo for d in self.dists] + def list(self) -> list: + return self.dists - def load(self, folder, in_memory): + def _load(self, folder, in_memory): if not os.path.isdir(folder): return for f in os.listdir(folder): if os.path.isdir(os.path.join(folder, f)): - self.load(os.path.join(folder, f), in_memory) + self._load(os.path.join(folder, f), in_memory) continue items = os.path.splitext(f) if items[-1] != '.ifo': @@ -31,7 +58,7 @@ def load(self, folder, in_memory): except Exception as err: print(err) return - print("load", d.ifo.bookname, "succeed") + print("load", d.ifo.bookname, "succeed", len(self.dists)) self.dists.append(d) def translate_word(self, word): diff --git a/src/main.py b/src/main.py index 3e652a6..af56766 100644 --- a/src/main.py +++ b/src/main.py @@ -4,16 +4,17 @@ from PyQt5.QtWidgets import QApplication from src.main_window import MainWindow -from setting import setting +from src.setting import setting def main(): # os.environ['QT_DEBUG_PLUGINS'] = '1' QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) app = QApplication(sys.argv) - import qdarkstyle - dark_stylesheet = qdarkstyle.load_stylesheet_pyqt5() - app.setStyleSheet(dark_stylesheet) + if setting.use_dark_skin: + import qdarkstyle + dark_stylesheet = qdarkstyle.load_stylesheet_pyqt5() + app.setStyleSheet(dark_stylesheet) app.setApplicationName("MyDict") app.setQuitOnLastWindowClosed(False) main_window = MainWindow() diff --git a/src/main_window.py b/src/main_window.py index c0a0dae..6b3df6e 100644 --- a/src/main_window.py +++ b/src/main_window.py @@ -1,6 +1,7 @@ from PyQt5.QtCore import QSize, QRect from PyQt5.QtWidgets import QWidget, QHBoxLayout, QDesktopWidget, QTabWidget, QMainWindow +from src.backend.stardict import StartDict from src.setting import setting from src.UI.find_text import FindText from src.UI.find_word import FindWord @@ -24,14 +25,15 @@ def __init__(self): self.setWindowTitle("我的词典 {}".format(get_version())) self.youdao = YouDaoFanYi() + self.star_dict = StartDict(setting.star_dict_folder, True) if setting.support_clipboard: - self.tip_window = TipWindow(self.youdao) + self.tip_window = TipWindow(self.youdao, self.star_dict) self.tip_window.hide() self.tab = QTabWidget() - self.tab.addTab(FindWord(self.youdao, self), '词典') + self.tab.addTab(FindWord(self.youdao, self.star_dict, self), '词典') self.tab.addTab(FindText(self.youdao, self), '翻译') - self.tab.addTab(SettingWindow(self), '设置') + self.tab.addTab(SettingWindow(self, self.star_dict), '设置') self.tab.tabBar().setMinimumWidth(200) self.tab.tabBar().setTabIcon(0, load_icon("word")) self.tab.tabBar().setTabIcon(1, load_icon("text")) diff --git a/src/setting.py b/src/setting.py index cba6cfe..bd4df7b 100644 --- a/src/setting.py +++ b/src/setting.py @@ -1,13 +1,27 @@ import json import os + +from PyQt5.QtCore import pyqtSignal, QObject + setting_folder = "{}/.config/my_dict".format(os.environ["HOME"]) setting_filename = "{}/setting.json".format(setting_folder) +class SettingSignal(QObject): + signal_setting_changed = pyqtSignal() + + def emit(self): + self.signal_setting_changed.emit() + + class Setting: + signal_setting = SettingSignal() star_dict_folder = "{}/star_dict".format(setting_folder) support_clipboard = True show_main_window_when_startup = True + use_dark_skin = True + dicts_for_query = ["*"] + dicts_for_clipboard = [] def __init__(self): self.load() @@ -33,7 +47,7 @@ def load(self): def dump(self): obj = {} for i in self.__dir__(): - if i.startswith("__"): + if i.startswith("__") or i.startswith("signal_"): continue attr = self.__getattribute__(i) if callable(attr): @@ -45,7 +59,9 @@ def save(self): if not os.path.exists(setting_folder): os.makedirs(setting_folder) with open(setting_filename, 'w+') as f: - f.write(json.dumps(self.dump(), indent=4, ensure_ascii=False)) + obj = json.dumps(self.dump(), indent=4, ensure_ascii=False) + f.write(obj) + self.signal_setting.emit() setting = Setting() diff --git a/src/util.py b/src/util.py index 9cc9e35..a6fc1df 100644 --- a/src/util.py +++ b/src/util.py @@ -4,12 +4,13 @@ from PyQt5.QtGui import QIcon, QPixmap version = { - "curr": "0.0.1", + "curr": "0.1.1", "history": { "0.0.1": "实现基本功能:\n" " 1、查词界面\n" " 2、翻译界面\n" " 3、剪贴板", + "0.1.1": "支持本地词典" } } diff --git a/t.py b/t.py new file mode 100644 index 0000000..9e90358 --- /dev/null +++ b/t.py @@ -0,0 +1,3 @@ +from src.main import main + +main()