Files
Projects/toolbox/codes/ui/main_ui.py

209 lines
8.4 KiB
Python

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