【PyQt6]全屏截图实现的带密码锁屏功能

文章目录

1. 简介

书接上回,PyQt6 使用 QScreen 实现了截图,如果用个控件全屏显示截图,嘿嘿,那就是简单的一个锁屏界面了,类似于一个假死界面,也挺有意思。
友情提醒 输入 quit 可以退出程序

2. Demo

使用一个加密的功能,让 quit 不是以铭文出现
dbd73c2b545209688ed794c0d5413d5a 是 quit的md5码
md5 据说可以被破解,那就还可以改成 使用 bcrpypt ,不停变更 bcrpypt 密钥,会更有意思

友情提醒,退出 是输入 quit 退出 是输入 quit 退出 是输入quit

在这里插入图片描述

from PyQt6.QtCore import Qt
from PyQt6.QtGui import QKeyEvent, QPainter, QPaintEvent, QColor
from PyQt6.QtWidgets import QApplication, QWidget
import hashlib
# from cout import cout


class FullScreen(QWidget):
    def __init__(self):
        """构造函数
        无框 顶部显示, 任务栏不显示
        输入:quit

        Attrition:
            self.pixmap : 主屏幕的截图
            self.bufs   : 字符串缓存
        """
        super(FullScreen, self).__init__()

        # ------------- 窗口标志设置  -------------
        self.setWindowFlags(Qt.WindowType.WindowStaysOnTopHint
                            | Qt.WindowType.FramelessWindowHint
                            | Qt.WindowType.Tool)       # 可以不出现在任务栏

        screen = QApplication.primaryScreen()
        self.pixmap = screen.grabWindow()

        self.bufs = []  # 用来保存 输入的字符

    def paintEvent(self, a0: QPaintEvent | None) -> None:
        painter = QPainter(self)
        painter.drawPixmap(a0.rect(), self.pixmap)
        painter.fillRect(a0.rect(), QColor(0, 0, 255, 127))
        font = painter.font()
        font.setFamily("楷体")
        font.setPixelSize(20)
        painter.setFont(font)
        painter.setPen(QColor(255, 0, 0))

        msg = '输入 quit 退出'
        painter.drawText(20, 30, msg)
        rect_ad = a0.rect().adjusted(10, 10, -10, -10)
        painter.drawRect(rect_ad)

        painter.drawText(rect_ad,
                         Qt.AlignmentFlag.AlignCenter | Qt.TextFlag.TextWrapAnywhere,
                         ''.join(self.bufs))

        return super().paintEvent(a0)

    # ===============  按键事件 ===============
    def keyPressEvent(self, a0: QKeyEvent | None) -> None:

        keycode = a0.key()
        if keycode <= 0x10ffff:
            # char = chr(keycode)
            # cout((keycode, char))
            self.bufs.append(a0.text())

        match a0.key():
            case Qt.Key.Key_Escape:
                self.bufs = self.bufs[:-1]  # 去掉最后一个 esc 字符
                self.bufs.append('请输入密码 🚶')
            case Qt.Key.Key_Enter | Qt.Key.Key_Return:
                bufs_str = ''.join(self.bufs).strip().encode(encoding='utf-8')
                md5 = hashlib.md5(bufs_str).hexdigest()
                if md5.casefold() == 'dbd73c2b545209688ed794c0d5413d5a'.casefold():
                    # if bufs_str.strip().casefold() == 'quit'.casefold():
                    app.quit()

                self.bufs.clear()
        self.update()


if __name__ == '__main__':

    app = QApplication([])
    screen = FullScreen()
    screen.showFullScreen()
    # cout(screen.rect())
    app.exec()

最近更新

  1. TCP协议是安全的吗?

    2024-02-17 11:42:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-17 11:42:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-17 11:42:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-17 11:42:01       20 阅读

热门阅读

  1. C# 异步方法的使用场景

    2024-02-17 11:42:01       30 阅读
  2. ROS小车跟随

    2024-02-17 11:42:01       29 阅读
  3. 【蓝桥杯 2021】图像模糊

    2024-02-17 11:42:01       26 阅读
  4. vue.js前端框架应用案例

    2024-02-17 11:42:01       24 阅读
  5. 职场通用技能 之 ---开口夸赞,闭口批评

    2024-02-17 11:42:01       27 阅读
  6. 中医师承关键步骤

    2024-02-17 11:42:01       26 阅读
  7. Python在生物信息学中的应用:列表推导式

    2024-02-17 11:42:01       26 阅读
  8. mysql sql符号的作用

    2024-02-17 11:42:01       23 阅读
  9. Docker安装和使用Redis

    2024-02-17 11:42:01       25 阅读
  10. 数据库系统概论整理与总结

    2024-02-17 11:42:01       29 阅读
  11. 基于Web技术的家居室内温湿度监测系统

    2024-02-17 11:42:01       32 阅读