create my toolbox -- first commit
This commit is contained in:
		
							
								
								
									
										208
									
								
								toolbox/codes/ui/main_ui.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										208
									
								
								toolbox/codes/ui/main_ui.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,208 @@
 | 
			
		||||
import json
 | 
			
		||||
from math import lgamma
 | 
			
		||||
from shutil import copy
 | 
			
		||||
from random import choice
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import sys
 | 
			
		||||
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
 | 
			
		||||
from PySide6.QtCore import Qt, QTime, QSize, QRect,QEvent, QThread
 | 
			
		||||
from PySide6.QtGui import QCursor, QFont, QIcon, QImage, QPixmap, QShortcut, QAction, QKeySequence, QResizeEvent
 | 
			
		||||
from codes.common import clibs, db_operation
 | 
			
		||||
from codes.ui.widget_bg_ui import WidgetWithBg
 | 
			
		||||
from codes.common.worker import Worker
 | 
			
		||||
from typing import Callable, Any
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MainWindow(QMainWindow):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        super().__init__()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.predos()
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setMinimumSize(clibs.win_width, clibs.win_height)
 | 
			
		||||
        self.resize(clibs.win_width, clibs.win_height)
 | 
			
		||||
        self.setWindowTitle("Toolbox")
 | 
			
		||||
        self.setWindowIcon(QIcon(f"{clibs.base_path}/assets/media/icon.ico"))
 | 
			
		||||
        self.setFont(QFont("Consolas", 14))
 | 
			
		||||
        # 任务栏/主窗口/状态栏
 | 
			
		||||
        self.toolBar = QToolBar()
 | 
			
		||||
        self.addToolBar(self.toolBar)
 | 
			
		||||
        self.toolBar.setMovable(False)
 | 
			
		||||
        self.centralW = QWidget()
 | 
			
		||||
        self.setCentralWidget(self.centralW)
 | 
			
		||||
        self.statusBar = QStatusBar()
 | 
			
		||||
        self.setStatusBar(self.statusBar)
 | 
			
		||||
 | 
			
		||||
        # toolbar
 | 
			
		||||
        self.ac_homepage = QAction()
 | 
			
		||||
        self.ac_homepage.setMenuRole(QAction.MenuRole.NoRole)
 | 
			
		||||
        self.ac_homepage.setStatusTip("Go to homepage")
 | 
			
		||||
        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)
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.ac_homepage.triggered.connect(self.ac_hp)
 | 
			
		||||
        # QShortcut("Esc", self).activated.connect(self.close)
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
        self.home_overlay = None
 | 
			
		||||
        db_operation.db_backup()
 | 
			
		||||
        self.conn, self.cursor = db_operation.db_conn()
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
        def del_repeat_proverb(proverbs: list):
 | 
			
		||||
            _proverbs = []
 | 
			
		||||
            for proverb in proverbs:
 | 
			
		||||
                if proverb not in _proverbs:
 | 
			
		||||
                    _proverbs.append(proverb)
 | 
			
		||||
            return _proverbs
 | 
			
		||||
 | 
			
		||||
        def get_resources():
 | 
			
		||||
            # background image
 | 
			
		||||
            bing = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=8"
 | 
			
		||||
            req = requests.get(bing)
 | 
			
		||||
            res = req.json()
 | 
			
		||||
            _, files = get_files(f"{clibs.base_path}/assets/media/bg")
 | 
			
		||||
            image_names = []
 | 
			
		||||
            for file in files:
 | 
			
		||||
                image_names.append(file.name.removesuffix(".jpg"))
 | 
			
		||||
            for image in res["images"]:
 | 
			
		||||
                startdate = image["startdate"]
 | 
			
		||||
                if startdate 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")
 | 
			
		||||
                    try:
 | 
			
		||||
                        req = requests.get(image_url, stream=True, timeout=10)
 | 
			
		||||
                        with open(file, "wb") as f:
 | 
			
		||||
                            for chunk in req.iter_content(chunk_size=8192):
 | 
			
		||||
                                f.write(chunk)
 | 
			
		||||
                    except Exception as e:
 | 
			
		||||
                        pass
 | 
			
		||||
            # 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
 | 
			
		||||
 | 
			
		||||
        def change_resources():
 | 
			
		||||
            # avatar
 | 
			
		||||
            src, _ = get_files(f"{clibs.base_path}/assets/media/avatar")
 | 
			
		||||
            dst = f"{clibs.base_path}/assets/media/avatar.jpg"
 | 
			
		||||
            copy(src, dst)
 | 
			
		||||
            # proverbs
 | 
			
		||||
            with open(f"{clibs.base_path}/assets/media/hitokoto.json", mode="r", encoding="utf-8") as f:
 | 
			
		||||
                proverbs = json.load(f)
 | 
			
		||||
                res = choice(proverbs)
 | 
			
		||||
                sentence = res["hitokoto"]
 | 
			
		||||
                from_where = res["from"]
 | 
			
		||||
                from_who = res["from_who"]
 | 
			
		||||
                clibs.proverb = f"{sentence}\t\t※⌈{from_where}⌋ | {from_who}※"
 | 
			
		||||
            # bg
 | 
			
		||||
            src, _ = get_files(f"{clibs.base_path}/assets/media/bg")
 | 
			
		||||
            dst = f"{clibs.base_path}/assets/media/bg.jpg"
 | 
			
		||||
            copy(src, dst)
 | 
			
		||||
 | 
			
		||||
        def gen_page():
 | 
			
		||||
            self.set_shortcuts(False)
 | 
			
		||||
            self.home_overlay = WidgetWithBg(parent=self)
 | 
			
		||||
            self.home_overlay.on_closed.connect(self.exit_overlay)
 | 
			
		||||
            self.home_overlay.on_full_screen.connect(self.full_screen)
 | 
			
		||||
            self.home_overlay.show()
 | 
			
		||||
            width, height = self.width(), self.height()
 | 
			
		||||
            if width > clibs.win_width:
 | 
			
		||||
                self.resize(self.width()-1, self.height()-1)
 | 
			
		||||
            else:
 | 
			
		||||
                self.resize(clibs.win_width+1, clibs.win_height+1)
 | 
			
		||||
 | 
			
		||||
        change_resources()
 | 
			
		||||
        self.launch_get_resources(get_resources)
 | 
			
		||||
        gen_page()
 | 
			
		||||
 | 
			
		||||
    def full_screen(self, flag: bool):
 | 
			
		||||
        if flag == 0:
 | 
			
		||||
            if self.isFullScreen():
 | 
			
		||||
                self.setWindowFlags(self.windowFlags() ^ Qt.WindowType.WindowStaysOnTopHint)
 | 
			
		||||
                self.show()
 | 
			
		||||
                self.showMaximized()
 | 
			
		||||
            else:
 | 
			
		||||
                self.setWindowFlags(Qt.WindowType.WindowStaysOnTopHint)
 | 
			
		||||
                self.showFullScreen()
 | 
			
		||||
        elif flag == 1:
 | 
			
		||||
            self.setWindowFlags(self.windowFlags() ^ Qt.WindowType.WindowStaysOnTopHint)
 | 
			
		||||
            self.show()
 | 
			
		||||
            self.showMaximized()
 | 
			
		||||
 | 
			
		||||
    def exit_overlay(self):
 | 
			
		||||
        self.set_shortcuts(True)
 | 
			
		||||
        if self.isFullScreen():
 | 
			
		||||
            self.setWindowFlags(self.windowFlags() ^ Qt.WindowType.WindowStaysOnTopHint)
 | 
			
		||||
            self.show()
 | 
			
		||||
            self.showMaximized()
 | 
			
		||||
 | 
			
		||||
    def set_shortcuts(self, stat: bool = True):
 | 
			
		||||
        if stat:
 | 
			
		||||
            self.ac_homepage.setShortcut(QKeySequence("Ctrl+Alt+H"))
 | 
			
		||||
            # self.ac_settings.setShortcut(QKeySequence("Ctrl+Alt+S"))
 | 
			
		||||
            # self.ac_logs.setShortcut(QKeySequence("Ctrl+Alt+L"))
 | 
			
		||||
            # self.ac_about.setShortcut(QKeySequence("Ctrl+Alt+A"))
 | 
			
		||||
            # self.ac_caging.setShortcut(QKeySequence("Ctrl+Alt+C"))
 | 
			
		||||
            # self.ac_quit.setShortcut(QKeySequence("Ctrl+Alt+Q"))
 | 
			
		||||
        else:
 | 
			
		||||
            self.ac_homepage.setShortcut(QKeySequence())
 | 
			
		||||
            # self.ac_settings.setShortcut(QKeySequence())
 | 
			
		||||
            # self.ac_logs.setShortcut(QKeySequence())
 | 
			
		||||
            # self.ac_about.setShortcut(QKeySequence())
 | 
			
		||||
            # self.ac_caging.setShortcut(QKeySequence())
 | 
			
		||||
            # self.ac_quit.setShortcut(QKeySequence())
 | 
			
		||||
 | 
			
		||||
    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 resizeEvent(self, event: QResizeEvent):
 | 
			
		||||
        super().resizeEvent(event)
 | 
			
		||||
        if self.home_overlay:
 | 
			
		||||
            self.home_overlay.setGeometry(self.rect())
 | 
			
		||||
 | 
			
		||||
    def closeEvent(self, event):
 | 
			
		||||
        if self.isFullScreen():
 | 
			
		||||
            event.ignore()
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        reply = QMessageBox.question(self, "退出", "\n程序可能在运行,确定要退出吗?")
 | 
			
		||||
        if reply == QMessageBox.StandardButton.Yes:
 | 
			
		||||
            db_operation.db_close(self.conn, self.cursor)
 | 
			
		||||
            event.accept()
 | 
			
		||||
        else:
 | 
			
		||||
            event.ignore()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    app = QApplication(sys.argv)
 | 
			
		||||
    window = MainWindow()
 | 
			
		||||
    window.show()
 | 
			
		||||
    sys.exit(app.exec())
 | 
			
		||||
		Reference in New Issue
	
	Block a user