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())