总线通信架构整改完成

This commit is contained in:
2025-09-27 19:03:05 +08:00
parent c7c0d15545
commit 1c47497fc2
272 changed files with 592 additions and 304 deletions

View File

@@ -1,17 +1,22 @@
import json
from shutil import copy
from random import choice
from pathlib import Path
import sys
from random import choice
from shutil import copy
import requests
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QListWidget, QStackedWidget, QCheckBox, QSpinBox, QToolBox, QLineEdit, QTableWidget, QTreeWidget, QCalendarWidget, QMessageBox, QToolBar, QSizePolicy, QMainWindow, QStatusBar, QListWidgetItem
from PySide6.QtCore import Qt, QTime, QSize, QRect,QEvent, QThread
from PySide6.QtGui import QCursor, QFont, QIcon, QImage, QPixmap, QShortcut, QAction, QKeySequence, QResizeEvent
import json
import sys
from PySide6.QtWidgets import QApplication, QWidget, QHBoxLayout, QListWidget, QStackedWidget, QMessageBox, QToolBar, QMainWindow, QStatusBar
from PySide6.QtGui import QFont, QIcon, QResizeEvent, QShortcut, QKeySequence, QAction
from PySide6.QtCore import Qt
from codes.common import clibs, db_operation
from codes.ui.widget_bg_ui import WidgetWithBg
from codes.ui.components.toolbar_ui import SToolBar
from codes.ui.components.list_widget_ui import SListWidget
from codes.ui.components.stacked_widget_ui import SStackedWidget
from codes.common.signal_bus import signal_bus
from codes.common.worker import Worker
from typing import Callable, Any
from codes.common.exception_handler import handle_exception
from codes.ui.overlay_page.overlay_ui import WidgetWithBg
class MainWindow(QMainWindow):
@@ -26,7 +31,7 @@ class MainWindow(QMainWindow):
self.m = Path(__file__).stem
self.home_overlay = None
db_operation.db_backup()
clibs.conn, clibs.cursor = db_operation.db_conn()
db_operation.db_conn()
def init_ui(self):
self.setMinimumSize(clibs.win_width, clibs.win_height)
@@ -35,7 +40,7 @@ class MainWindow(QMainWindow):
self.setWindowIcon(QIcon(f"{clibs.base_path}/assets/media/icon.ico"))
self.setFont(QFont("Consolas", 14))
# 任务栏/主窗口/状态栏
self.toolBar = QToolBar()
self.toolBar = SToolBar()
self.addToolBar(self.toolBar)
self.toolBar.setMovable(False)
self.centralW = QWidget()
@@ -51,106 +56,65 @@ class MainWindow(QMainWindow):
""")
self.setStatusBar(self.statusBar)
# toolbar
# homepage
self.ac_homepage = QAction()
self.ac_homepage.setMenuRole(QAction.MenuRole.NoRole)
self.ac_homepage.setStatusTip("Go to home page")
self.ac_homepage.setToolTip("Ctrl+Alt+H")
self.ac_homepage.setText("主页")
self.ac_homepage.setShortcut(QKeySequence("Ctrl+Alt+H"))
self.toolBar.addAction(self.ac_homepage)
# setting
self.ac_setting = QAction()
self.ac_setting.setMenuRole(QAction.MenuRole.NoRole)
self.ac_setting.setStatusTip("Go to setting page")
self.ac_setting.setToolTip("Ctrl+Alt+S")
self.ac_setting.setText("设置")
self.ac_setting.setShortcut(QKeySequence("Ctrl+Alt+S"))
self.toolBar.addAction(self.ac_setting)
# log
self.ac_log = QAction()
self.ac_log.setMenuRole(QAction.MenuRole.NoRole)
self.ac_log.setStatusTip("Go to log page")
self.ac_log.setToolTip("Ctrl+Alt+L")
self.ac_log.setText("日志")
self.ac_log.setShortcut(QKeySequence("Ctrl+Alt+L"))
self.toolBar.addAction(self.ac_log)
# about
self.ac_about = QAction()
self.ac_about.setMenuRole(QAction.MenuRole.NoRole)
self.ac_about.setStatusTip("Go to about page")
self.ac_about.setToolTip("Ctrl+Alt+A")
self.ac_about.setText("关于")
self.ac_about.setShortcut(QKeySequence("Ctrl+Alt+A"))
self.toolBar.addAction(self.ac_about)
layout_h = QHBoxLayout()
# list widget
self.listW = QListWidget()
for item in clibs.listW_items:
_ = QListWidgetItem(item)
_.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
self.listW.addItem(_)
layout_h.addWidget(self.listW)
# stacked widget 1x: 10为一级按钮页其余为二级按钮页2-9同理 | 0x. 日志/设置/关于等页面
self.stackedW =QStackedWidget()
self.w00_setting = QWidget()
self.stackedW.addWidget(self.w00_setting)
self.lb_test00 = QLabel("testing text on setting widget", parent=self.w00_setting)
self.w08_log = QWidget()
self.stackedW.addWidget(self.w08_log)
self.lb_test08 = QLabel("testing text on log widget", parent=self.w08_log)
self.w09_about = QWidget()
self.stackedW.addWidget(self.w09_about)
self.lb_test09 = QLabel("testing text on about widget", parent=self.w09_about)
self.w10_practical = QWidget()
self.stackedW.addWidget(self.w10_practical)
self.lb_test10 = QLabel("testing text on practical widget", parent=self.w10_practical)
self.w20_efficiency = QWidget()
self.stackedW.addWidget(self.w20_efficiency)
self.lb_test20 = QLabel("testing text on efficiency widget", parent=self.w20_efficiency)
self.w30_financial = QWidget()
self.stackedW.addWidget(self.w30_financial)
self.lb_test30 = QLabel("testing text on financial widget", parent=self.w30_financial)
layout_h.addWidget(self.stackedW)
layout_h.setStretch(0, 1)
layout_h.setStretch(1, 5)
self.listW = SListWidget()
layout_h.addWidget(self.listW, stretch=1)
self.stackedW =SStackedWidget()
layout_h.addWidget(self.stackedW, stretch=5)
self.centralW.setLayout(layout_h)
def setup_slot(self):
self.ac_homepage.triggered.connect(self.ac_hp)
self.ac_setting.triggered.connect(self.ac_sp)
self.ac_log.triggered.connect(self.ac_lp)
self.ac_about.triggered.connect(self.ac_ap)
self.f11_sc = QShortcut(QKeySequence("F11"), self)
self.f11_sc.activated.connect(self.sc_F11)
# self.listW.currentItemChanged.connect(self.change_stackedW)
self.listW.itemClicked.connect(self.change_stackedW)
signal_bus.home_overlay_trigger.connect(self.ac_hp)
signal_bus.home_overlay_close.connect(self.exit_overlay)
self.install_sc()
def setup_sc(self, stat: bool = True):
if stat:
self.ac_homepage.setShortcut(QKeySequence("Ctrl+Alt+H"))
self.f11_sc.setEnabled(True)
else:
self.ac_homepage.setShortcut(QKeySequence())
self.f11_sc.setEnabled(False)
def setup_sc(self, enable: bool = True):
for sc_id, obj in self.sc_pool.items():
if isinstance(obj, QAction):
obj.setEnabled(enable)
elif isinstance(obj, QShortcut):
obj.setEnabled(enable)
if enable == False and (sc_id == "esc" or sc_id == "ctrl_alt_m") and self.home_overlay:
obj.setEnabled(True)
if (sc_id == "esc" or sc_id == "ctrl_alt_m") and self.home_overlay is None:
obj.setEnabled(False)
def install_sc(self):
self.sc_pool = {}
# QAction
self.toolBar.ac_switch.setShortcut(QKeySequence("Ctrl+Alt+T"))
self.sc_pool["ctrl_alt_t"] = self.toolBar.ac_switch
self.toolBar.ac_homepage.setShortcut(QKeySequence("Ctrl+Alt+H"))
self.sc_pool["ctrl_alt_h"] = self.toolBar.ac_homepage
self.toolBar.ac_setting.setShortcut(QKeySequence("Ctrl+Alt+S"))
self.sc_pool["ctrl_alt_s"] = self.toolBar.ac_setting
self.toolBar.ac_log.setShortcut(QKeySequence("Ctrl+Alt+L"))
self.sc_pool["ctrl_alt_l"] = self.toolBar.ac_log
self.toolBar.ac_about.setShortcut(QKeySequence("Ctrl+Alt+A"))
self.sc_pool["ctrl_alt_a"] = self.toolBar.ac_about
# QShortcut
self.sc_f11 = QShortcut(QKeySequence("F11"), self)
self.sc_f11.activated.connect(self.shortcut_f11)
self.sc_pool["f11"] = self.sc_f11
# Subpage
self.sc_Esc = QShortcut(QKeySequence("Esc"), self)
self.sc_Esc.activated.connect(signal_bus.home_overlay_auth.emit)
self.sc_pool["esc"] = self.sc_Esc
self.sc_caM = QShortcut(QKeySequence("Ctrl+Alt+M"), self)
self.sc_caM.activated.connect(self.toggle_full_screen)
self.sc_pool["ctrl_alt_m"] = self.sc_caM
def ac_hp(self):
def get_files(dir_path):
folder = Path(dir_path)
files = [p for p in folder.rglob("*") if p.is_file()]
return choice(files), files
if files:
rand_choice = choice(files)
else:
rand_choice = ""
return rand_choice, files
def del_repeat_proverb(proverbs: list):
_proverbs = []
@@ -159,6 +123,7 @@ class MainWindow(QMainWindow):
_proverbs.append(proverb)
return _proverbs
@handle_exception()
def get_resources():
# background image
bing = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=8"
@@ -169,12 +134,12 @@ class MainWindow(QMainWindow):
for file in files:
image_names.append(file.name.removesuffix(".jpg"))
for image in res["images"]:
startdate = image["startdate"]
if startdate in image_names:
image_name = "-".join([image["startdate"], image["title"]])
if image_name in image_names:
continue
else:
image_url = f"""https://www.bing.com{image["url"]}"""
file = Path(f"{clibs.base_path}/assets/media/bg/{startdate}.jpg")
file = Path(f"{clibs.base_path}/assets/media/bg/{image_name}.jpg")
try:
req = requests.get(image_url, stream=True, timeout=10)
with open(file, "wb") as f:
@@ -185,18 +150,22 @@ class MainWindow(QMainWindow):
# proverbs
hitokoto = "https://v1.hitokoto.cn/"
proverbs = []
try:
req = requests.get(hitokoto)
with open(f"{clibs.base_path}/assets/media/hitokoto.json", mode="rt", encoding="utf-8") as f:
proverbs = json.load(f)
proverbs.append(eval(req.text))
proverbs = del_repeat_proverb(proverbs)
with open(f"{clibs.base_path}/assets/media/hitokoto.json", mode="wt", encoding="utf-8") as f:
json.dump(proverbs, f, ensure_ascii=False)
except Exception as e:
pass
proverb_file = Path(f"{clibs.base_path}/assets/media/hitokoto.json")
req = requests.get(hitokoto)
if not proverb_file.exists():
proverb_file.touch()
proverb_file.write_text("[]")
with open(proverb_file, "w") as f:
f.write("[]")
@handle_exception(self.m)
with open(proverb_file, mode="rt", encoding="utf-8") as f:
proverbs = json.load(f)
proverbs.append(eval(req.text))
proverbs = del_repeat_proverb(proverbs)
with open(proverb_file, mode="wt", encoding="utf-8") as f:
json.dump(proverbs, f, ensure_ascii=False)
@handle_exception()
def change_resources():
# avatar
src, _ = get_files(f"{clibs.base_path}/assets/media/avatar")
@@ -216,11 +185,9 @@ class MainWindow(QMainWindow):
copy(src, dst)
def gen_page():
self.setup_sc(False)
self.home_overlay = WidgetWithBg(parent=self)
self.home_overlay.on_closed.connect(self.exit_overlay)
self.home_overlay.on_full_screen.connect(self.toggle_full_screen)
self.home_overlay.show()
self.setup_sc(False)
width, height = self.width(), self.height()
if width > clibs.win_width:
self.resize(self.width()-1, self.height()-1)
@@ -231,14 +198,13 @@ class MainWindow(QMainWindow):
self.launch_get_resources(get_resources)
gen_page()
def ac_sp(self):
self.stackedW.setCurrentWidget(self.w00_setting)
def ac_lp(self):
self.stackedW.setCurrentWidget(self.w08_log)
def ac_ap(self):
self.stackedW.setCurrentWidget(self.w09_about)
def launch_get_resources(self, func, on_anything=None, *args, **kwargs):
self.td_get_resources = Worker(func, *args, **kwargs)
self.td_get_resources.started.connect(lambda: None)
self.td_get_resources.result.connect(lambda: None)
self.td_get_resources.error.connect(lambda: None)
self.td_get_resources.finished.connect(lambda: None)
self.td_get_resources.start()
def toggle_full_screen(self):
if self.isFullScreen():
@@ -250,30 +216,14 @@ class MainWindow(QMainWindow):
self.showFullScreen()
def exit_overlay(self):
self.setup_sc(True)
self.home_overlay = None
self.setup_sc()
if self.isFullScreen():
self.setWindowFlags(self.windowFlags() ^ Qt.WindowType.WindowStaysOnTopHint)
self.show()
self.showMaximized()
def change_stackedW(self, w_item):
if w_item.text() == "实用工具":
self.stackedW.setCurrentWidget(self.w10_practical)
elif w_item.text() == "效率提升":
self.stackedW.setCurrentWidget(self.w20_efficiency)
elif w_item.text() == "财务分析":
self.stackedW.setCurrentWidget(self.w30_financial)
def launch_get_resources(self, func, on_anything: Callable[..., Any] = None, *args, **kwargs):
self.td_get_resources = Worker(func, *args, **kwargs)
self.td_get_resources.started.connect(lambda: None)
self.td_get_resources.result.connect(lambda: None)
self.td_get_resources.error.connect(lambda: None)
self.td_get_resources.finished.connect(lambda: None)
self.td_get_resources.start()
def sc_F11(self):
def shortcut_f11(self):
if not self.home_overlay:
self.ac_hp()
self.toggle_full_screen()
@@ -287,6 +237,7 @@ class MainWindow(QMainWindow):
if self.isFullScreen():
event.ignore()
return
reply = QMessageBox.question(self, "退出", "\n程序可能在运行,确定要退出吗?")
if reply == QMessageBox.StandardButton.Yes:
db_operation.db_close()