总线通信架构整改完成
This commit is contained in:
		@@ -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()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user