PyQ5t 便利贴

功能描述

  • 无边框窗口:便利贴窗口使用无边框设计,可以拖动移动。
  • 顶部框架:包含标题、完成勾选框、菜单按钮和关闭按钮。
  • 颜色切换:支持切换便利贴的颜色。
  • 任务标记:可以勾选任务完成状态。
  • 菜单设置:通过菜单对话框设置标题和颜色。
  • 保存和加载设置:自动保存便利贴的设置并在启动时加载。

 

代码讲解

import sys
from PyQt5.QtWidgets import QWidget, QLabel, QFrame, QPushButton, QTextEdit, QCheckBox, QMessageBox
from PyQt5.QtWidgets import QDialog, QLineEdit, QComboBox
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QIcon
import configparser

class Note(QWidget):
    def __init__(self):
        super().__init__()
        self.offset = None
        self.title = "PyPostits"
        
        # 定义可选的颜色主题
        self.colours = [["#FFF68F", "#FFFACD", "#CDC673"], ["#FF9CCD", "#FFC4CD", "#B26E90"]]
        self.colour_item = 0
        self.colour = self.colours[self.colour_item]
        
        # 设置窗口大小和属性
        self.resize(400, 300)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.SplashScreen | Qt.WindowStaysOnTopHint)
        
        # 创建顶部框架
        self.top_frame = QFrame(self)
        self.top_frame.setGeometry(0, 0, 400, 40)
        self.top_frame.setStyleSheet(f"background-color: {self.colour[0]}")

        # 创建标题标签
        self.title_label = QLabel(self.top_frame)
        self.title_label.setText(self.title)
        self.title_label.setGeometry(15, 1, 90, 40)
        self.title_label.setStyleSheet("font: normal normal 20px \"Arial\";")

        # 创建完成勾选框
        self.check_done = QCheckBox(self.top_frame)
        self.check_done.setText("Done")
        self.check_done.setGeometry(120, 3, 60, 40)
        self.check_done.setChecked(False)

        # 创建菜单按钮
        self.menu_button = QPushButton(self.top_frame)
        self.menu_button.setIcon(QIcon("images/menu.png"))
        self.menu_button.setGeometry(320, 0, 40, 40)
        self.menu_button.setStyleSheet("""
            QPushButton {background: %s;border: none;} QPushButton:hover {background: %s;}
        """ % (self.colour[0], self.colour[2]))
        self.menu_button.clicked.connect(self.menu_event)

        # 创建关闭按钮
        self.close_button = QPushButton(self.top_frame)
        self.close_button.setIcon(QIcon("images/close.png"))
        self.close_button.setGeometry(360, 0, 40, 40)
        self.close_button.setStyleSheet("""
            QPushButton {background: %s;border: none;} QPushButton:hover {background: %s;}
        """ % (self.colour[0], self.colour[2]))
        self.close_button.clicked.connect(self.close_event)

        # 创建文本编辑区域
        self.textedit = QTextEdit(self)
        self.textedit.setGeometry(0, 40, 400, 260)
        self.textedit.setStyleSheet(f"background-color: {self.colour[1]};font-size: 24px;border: none;")

        # 尝试加载设置,如果失败则跳过
        try:
            self.load_setting()
            self.reset_colour()
        except:
            pass

    # 监听鼠标按下事件
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.offset = event.pos()
    
    # 监听鼠标移动事件
    def mouseMoveEvent(self, event):
        if self.offset is not None:
            delta = QPoint(event.pos() - self.offset)
            self.move(self.pos() + delta)
            
    # 监听鼠标释放事件
    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.offset = None

    # 菜单事件,显示菜单对话框
    def menu_event(self):
        self.menu_dialog = QDialog(self)
        self.menu_dialog.setWindowTitle("PyPostits")
        self.menu_dialog.resize(400, 300)
        self.menu_dialog.setFixedSize(400, 300)

        # 菜单对话框内的标题设置
        self.mtitle_label = QLabel(self.menu_dialog)
        self.mtitle_label.setText("Title")
        self.mtitle_label.setGeometry(10, 8, 80, 40)
        self.mtitle_label.setStyleSheet("font: normal normal 24px \"Arial\"")
        self.title_lineedit = QLineEdit(self.menu_dialog)
        self.title_lineedit.setText(self.title)
        self.title_lineedit.setGeometry(90, 8, 300, 40)
        self.title_lineedit.setStyleSheet("font: normal normal 20px \"Arial\"")

        # 菜单对话框内的颜色设置
        self.colour_label = QLabel(self.menu_dialog)
        self.colour_label.setText("Colour")
        self.colour_label.setGeometry(10, 50, 80, 40)
        self.colour_label.setStyleSheet("font: normal normal 24px \"Arial\"")
        self.mcolours = ["yellow", "pink"]
        self.colour_combo = QComboBox(self.menu_dialog)
        self.colour_combo.setGeometry(90, 50, 300, 40)
        self.colour_combo.addItems(self.mcolours)
        for i in range(2):
            self.colour_combo.setItemIcon(i, QIcon(f"images/{self.mcolours[i]}.png"))

        # 应用按钮
        apply_button = QPushButton(self.menu_dialog)
        apply_button.setText("Apply")
        apply_button.setGeometry(330, 262, 60, 30)
        apply_button.clicked.connect(self.menu_apply_event)

        # 计算并设置对话框位置
        main_window_geometry = self.geometry()
        if main_window_geometry.x() >= 500:
            dialog_x = main_window_geometry.left() - self.menu_dialog.width() - 10
            dialog_y = main_window_geometry.top()
        else:
            dialog_x = main_window_geometry.left() + self.menu_dialog.width() + 10
            dialog_y = main_window_geometry.top()
        self.menu_dialog.move(dialog_x, dialog_y)

        # 显示对话框
        self.menu_dialog.exec()

        # 更新标题和颜色
        self.title = self.title_lineedit.text()
        self.title_label.setText(self.title)
        self.colour_item = self.colour_combo.currentIndex()
        self.reset_colour()

    # 重置颜色
    def reset_colour(self):
        self.colour = self.colours[self.colour_item]
        self.top_frame.setStyleSheet(f"background-color: {self.colour[0]}")
        self.menu_button.setStyleSheet("""
            QPushButton {background: %s;border: none;} QPushButton:hover {background: %s;}
        """ % (self.colour[0], self.colour[2]))
        self.close_button.setStyleSheet("""
            QPushButton {background: %s;border: none;} QPushButton:hover {background: %s;}
        """ % (self.colour[0], self.colour[2]))
        self.textedit.setStyleSheet(f"background-color: {self.colour[1]};font-size: 24px;border: none;")

    # 菜单应用事件,应用设置
    def menu_apply_event(self):
        self.title = self.title_lineedit.text()
        self.title_label.setText(self.title)
        self.colour_item = self.colour_combo.currentIndex()
        self.colour = self.colours[self.colour_item]
        self.reset_colour()

    # 写入设置到文件
    def write_setting(self):
        self.file = open("notes/n1.ini", "w")
        config = configparser.ConfigParser()
        config["Basic"] = {}
        config["Basic"]["title"] = self.title
        config["Basic"]["colouritem"] = str(self.colour_item)
        config["Contents"] = {}
        config["Contents"]["text"] = self.textedit.toPlainText()
        config.write(self.file)

    # 从文件加载设置
    def load_setting(self):
        config = configparser.ConfigParser()
        config.read("notes/n1.ini")
        self.title = config["Basic"]["title"]
        self.colour_item = int(config["Basic"]["colouritem"])
        self.textedit.setText(str(config["Contents"]["text"]))

    # 关闭事件,检查任务是否完成
    def close_event(self):
        if not self.check_done.isChecked():
            check_message = QMessageBox(self)
            check_message.setWindowTitle("PyPostits")
            check_message.setText("You have not completed this task.\nDo you want to close it?")
            check_message.setIcon(4)
            check_message.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
            check_message.setDefaultButton(QMessageBox.No)
            ret = check_message.exec()
            if ret == QMessageBox.Yes:
                self.write_setting()
                sys.exit()
        else:
            self.write_setting()
            sys.exit()

# 主函数,运行应用程序
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Note()
    window.show()
    sys.exit(app.exec_())

  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值