From 24e218465970bd80d83353d00ca6c8ad87c80100 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Fri, 19 Jul 2024 14:42:38 -0400 Subject: [PATCH] =?UTF-8?q?dev:=20=E6=94=AF=E6=8C=81=E5=9B=9E=E8=BD=A6?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 2 +- src/gbx_kps_login.py | 44 ++++++++++++++++++++++++++++++++++++------- src/mw_kps_unifier.py | 21 ++++++++++++++++++++- src/page_load.py | 28 ++++++--------------------- 4 files changed, 64 insertions(+), 31 deletions(-) diff --git a/main.py b/main.py index 131a553..e3001b8 100644 --- a/main.py +++ b/main.py @@ -22,7 +22,7 @@ def main(): config = read_config(ORG_NAME, APP_NAME) db_path = get_default_db_path(config, ORG_NAME, APP_NAME) - win = KpsUnifier(db_path, config) + win = KpsUnifier(db_path, config, __version__) win.show() return app.exec() diff --git a/src/gbx_kps_login.py b/src/gbx_kps_login.py index d31f2f3..b1c8c8e 100644 --- a/src/gbx_kps_login.py +++ b/src/gbx_kps_login.py @@ -1,11 +1,18 @@ # coding: utf8 +from pathlib import Path from PySide6 import QtWidgets, QtGui, QtCore +from pykeepass.exceptions import CredentialsError + +from lib.Sqlite3Helper import Sqlite3Worker +from lib.kps_operations import read_kps_to_db class GbxKpsLogin(QtWidgets.QGroupBox): - def __init__(self, path: str, parent=None): + def __init__(self, path: str, sqh: Sqlite3Worker, config: dict, parent=None): super().__init__(parent) - self.is_loaded = False + self.sqh = sqh + self.config = config + self.path = path self.icon_eye = QtGui.QIcon(":/asset/img/eye.svg") self.icon_eye_off = QtGui.QIcon(":/asset/img/eye-off.svg") @@ -41,12 +48,21 @@ class GbxKpsLogin(QtWidgets.QGroupBox): self.lb_loaded.setVisible(False) self.hly_bottom.addStretch(1) - self.pbn_load = PushButtonWithItem(self, self, "加载") + self.pbn_load = QtWidgets.QPushButton("加载", self) self.hly_bottom.addWidget(self.pbn_load) self.pbn_remove = PushButtonWithItem(self, self, "移除") self.hly_bottom.addWidget(self.pbn_remove) self.pbn_eye.clicked.connect(self.on_pbn_eye_clicked) + self.pbn_load.clicked.connect(self.on_pbn_load_clicked) + # 回车加载 + self.lne_password.returnPressed.connect(self.on_pbn_load_clicked) + + def set_loaded(self, loaded: bool): + self.lb_loaded.setVisible(loaded) + self.pbn_load.setDisabled(loaded) + # 防止回车键触发加载 + self.lne_password.setDisabled(loaded) def on_pbn_eye_clicked(self): is_pass_mode = self.lne_password.echoMode() == QtWidgets.QLineEdit.EchoMode.Password @@ -57,10 +73,24 @@ class GbxKpsLogin(QtWidgets.QGroupBox): self.lne_password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.pbn_eye.setIcon(self.icon_eye_off) - def set_loaded(self, loaded: bool): - self.is_loaded = loaded - self.lb_loaded.setVisible(loaded) - self.pbn_load.setDisabled(loaded) + def on_pbn_load_clicked(self): + try: + read_kps_to_db(kps_file=self.lne_path.text(), + password=self.lne_password.text(), + table_name=self.config["table_name"], + sqh=self.sqh) + except CredentialsError: + QtWidgets.QMessageBox.critical(self, "密码错误", + f"{self.lne_path.text()}\n密码错误") + return + + self.lne_password.clear() + self.set_loaded(True) + loaded_mem = self.config["loaded_memory"] + db_name = Path(self.sqh.db_name).name + if db_name not in loaded_mem: + loaded_mem[db_name] = [] + loaded_mem[db_name].append(self.lne_path.text()) class PushButtonWithItem(QtWidgets.QPushButton): diff --git a/src/mw_kps_unifier.py b/src/mw_kps_unifier.py index 2cf05b9..d754c2a 100644 --- a/src/mw_kps_unifier.py +++ b/src/mw_kps_unifier.py @@ -28,6 +28,11 @@ class UiKpsUnifier(object): self.act_query = QtGui.QAction("查询", self.cw) self.menu_view.addActions([self.act_load, self.act_query]) + self.menu_help = self.menu_bar.addMenu("帮助") + self.act_about = QtGui.QAction("关于", self.cw) + self.act_about_qt = QtGui.QAction("关于 Qt", self.cw) + self.menu_help.addActions([self.act_about, self.act_about_qt]) + self.hly_top = QtWidgets.QHBoxLayout() self.vly_m.addLayout(self.hly_top) @@ -35,6 +40,7 @@ class UiKpsUnifier(object): self.lne_db_path.setEnabled(False) self.lne_db_path.setPlaceholderText(default_db_path) self.cmbx_styles = StyleComboBox(self.cw) + self.cmbx_styles.setMinimumWidth(110) self.hly_top.addWidget(self.lne_db_path) self.hly_top.addWidget(self.cmbx_styles) @@ -52,10 +58,11 @@ class UiKpsUnifier(object): class KpsUnifier(QtWidgets.QMainWindow): - def __init__(self, db_path: str, config: dict, parent=None): + def __init__(self, db_path: str, config: dict, version: str, parent=None): super().__init__(parent) self.db_path = db_path self.config = config + self.version = version self.sqh = self.init_db() self.ui = UiKpsUnifier(self.db_path, self.config, self.sqh, self) @@ -64,6 +71,8 @@ class KpsUnifier(QtWidgets.QMainWindow): self.ui.act_open.triggered.connect(self.on_act_open_triggered) self.ui.act_load.triggered.connect(self.on_act_load_triggered) self.ui.act_query.triggered.connect(self.on_act_query_triggered) + self.ui.act_about.triggered.connect(self.on_act_about_triggered) + self.ui.act_about_qt.triggered.connect(self.on_act_about_qt_triggered) def __del__(self): self.config["last_db_path"] = self.db_path @@ -104,3 +113,13 @@ class KpsUnifier(QtWidgets.QMainWindow): def on_act_query_triggered(self): self.ui.sw_m.setCurrentIndex(1) + + def on_act_about_triggered(self): + QtWidgets.QMessageBox.about( + self, + "关于", + f"一个可以同时处理多个 keepass 文件的工具。\n\n版本:v{self.version}" + ) + + def on_act_about_qt_triggered(self): + QtWidgets.QMessageBox.aboutQt(self, "关于 Qt") diff --git a/src/page_load.py b/src/page_load.py index 71e76ec..2dc6e91 100644 --- a/src/page_load.py +++ b/src/page_load.py @@ -3,12 +3,10 @@ import sqlite3 from pathlib import Path from PySide6 import QtWidgets -from pykeepass.exceptions import CredentialsError from .gbx_kps_login import GbxKpsLogin from .utils import accept_warning from lib.Sqlite3Helper import Sqlite3Worker -from lib.kps_operations import read_kps_to_db class WgLoadKps(QtWidgets.QWidget): @@ -31,9 +29,13 @@ class WgLoadKps(QtWidgets.QWidget): wg.set_loaded(False) def add_kps(self, path: str): - wg = GbxKpsLogin(path, self) + for wg in self.kps_wgs: + if wg.path == path: + QtWidgets.QMessageBox.warning(self, "警告", "该 KPS 文件已添加。") + return + + wg = GbxKpsLogin(path, self.sqh, self.config, self) wg.pbn_remove.clicked_with_item.connect(self.on_item_pbn_remove_clicked) - wg.pbn_load.clicked_with_item.connect(self.on_item_pbn_load_clicked) # 从倒数第二个位置插入,保证弹簧始终在最后 self.vly_m.insertWidget(self.vly_m.count() - 1, wg) self.kps_wgs.append(wg) @@ -46,24 +48,6 @@ class WgLoadKps(QtWidgets.QWidget): self.kps_wgs.remove(item) item.deleteLater() - def on_item_pbn_load_clicked(self, item: GbxKpsLogin): - try: - read_kps_to_db(kps_file=item.lne_path.text(), - password=item.lne_password.text(), - table_name=self.config["table_name"], - sqh=self.sqh) - except CredentialsError: - QtWidgets.QMessageBox.critical(self, "密码错误", - f"{item.lne_path.text()}\n密码错误") - return - - item.set_loaded(True) - loaded_mem = self.config["loaded_memory"] - db_name = Path(self.sqh.db_name).name - if db_name not in loaded_mem: - loaded_mem[db_name] = [] - loaded_mem[db_name].append(item.lne_path.text()) - def update_sqh(self, sqh: Sqlite3Worker): self.sqh = sqh for wg in self.kps_wgs: