Files
tools/textbook/app_1.py
2024-05-19 15:48:09 +08:00

174 lines
6.2 KiB
Python

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QTabWidget, QVBoxLayout, QWidget,QGraphicsDropShadowEffect,QLabel
from PySide6.QtCore import Qt, QPoint, QTimer
from PySide6.QtGui import QPainter, QBrush, QColor, QMouseEvent, QCursor,QPixmap
import sys
import json
import os
class CircularButton(QPushButton):
def __init__(self, parent=None):
super().__init__(parent)
self.setFixedSize(100, 100)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setStyleSheet("""
CircularButton {
background-color: rgba(1, 160, 196, 50);
border-radius: 50px;
}
QLabel{
color: rgba(255, 255, 255, 100);
font-size: 30px;
font-weight: bold;
text-align: center;
margin-top: 30px;
margin-bottom: 30px;
}
""")
self.text=QLabel(self)
self.text.setText("教材")
self.text.setAlignment(Qt.AlignCenter)
self.text.setGeometry(0, 0, 100, 100)
self.setToolTip("Click to open the main interface")
self.dragging = False
self.drag_position = None
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setBrush(QBrush(QColor(0, 0, 0, 128)))
painter.setPen(Qt.NoPen)
painter.drawEllipse(0, 0, self.width(), self.height())
super().paintEvent(event)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_position = event.pos()
QTimer.singleShot(200, self.check_drag) # Check for dragging after a short delay
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton and self.drag_position:
self.dragging = True
self.move(self.mapToParent(event.pos() - self.drag_position))
def mouseReleaseEvent(self, event):
if self.dragging:
self.dragging = False
else:
self.hide()
self.parent().show_rounded_interface(self)
self.drag_position = None
super().mouseReleaseEvent(event)
def check_drag(self):
if self.drag_position:
distance = (self.drag_position - QCursor.pos()).manhattanLength()
if distance > 5:
self.dragging = True
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(300, 300, 300, 550)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.circular_button = CircularButton(self)
self.circular_button.move(250, 150)
self.circular_button.show()
self.rounded_widget = RoundedWidget(self)
self.rounded_widget.hide()
def show_rounded_interface(self, circular_button):
# Move the main window near the circular button
button_pos = circular_button.mapToGlobal(QPoint(0, 0))
old = self.geometry().getRect()
self.setGeometry(button_pos.x() - 250, button_pos.y() - 150, old[2], old[3])
self.rounded_widget.show()
def hide_rounded_interface(self):
self.rounded_widget.hide()
self.circular_button.show()
def mousePressEvent(self, event: QMouseEvent):
if event.button() == Qt.LeftButton:
self.drag_position = event.globalPosition().toPoint()
event.accept()
def mouseMoveEvent(self, event: QMouseEvent):
if event.buttons() & Qt.LeftButton:
self.move(self.pos() + event.globalPosition().toPoint() - self.drag_position)
self.drag_position = event.globalPosition().toPoint()
event.accept()
class RoundedWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setGeometry(50, 50, 200, 450)
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setStyleSheet("""
QPushButton{
background-color: rgba(200, 200, 200, 180);
border-radius: 20px;
}
""")
self.shadow_effect = QGraphicsDropShadowEffect(self)
self.shadow_effect.setBlurRadius(20)
self.shadow_effect.setOffset(0, 0)
self.shadow_effect.setColor(QColor(0, 0, 0, 160))
self.setGraphicsEffect(self.shadow_effect)
self.layout = QVBoxLayout(self)
self.tab_widget = QTabWidget()
self.layout.addWidget(self.tab_widget)
self.close_button = QPushButton("Close", self)
self.close_button.setStyleSheet("font-size: 16px; padding: 10px;")
self.close_button.clicked.connect(self.close)
self.layout.addWidget(self.close_button)
self.close_program_button = QPushButton("Exit Program", self)
self.close_program_button.setStyleSheet("font-size: 16px; padding: 10px;")
self.close_program_button.clicked.connect(self.close_program)
self.layout.addWidget(self.close_program_button)
self.config = self.load_config()
self.create_tabs()
def load_config(self):
with open('config.json', 'r', encoding='utf-8') as file:
return json.load(file)
def create_tabs(self):
for subject, files in self.config.items():
tab = QWidget()
tab_layout = QVBoxLayout(tab)
for title, path in files.items():
button = QPushButton(title)
button.setStyleSheet("font-size: 16px; padding: 10px;")
button.clicked.connect(self.create_button_handler(path))
tab_layout.addWidget(button)
self.tab_widget.addTab(tab, subject)
def create_button_handler(self, path):
return lambda: self.open_file(path)
def open_file(self, path):
os.startfile(path)
def close(self):
self.parent().hide_rounded_interface()
def close_program(self):
QApplication.instance().quit()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())