Python实现简易QQ截图功能:基于PIL与wxPython的开发指南

Mason
Mason
发布时间:2026-10-16| 4人浏览过
原创

本文详细记录使用Python开发简易QQ截图功能的全过程。通过PIL库的ImageGrab实现屏幕区域截取,利用wxPython构建全屏透明窗口以监听鼠标坐标确定矩形区域,并结合全局热键注册完成交互。文章涵盖需求分析、核心代码实现及快捷键配置,为桌面应用开发提供参考。

前言

毕业设计项目中需要集成类似QQ的截图功能,本文旨在记录该功能的实现过程。考虑到后续计划引入人工智能相关功能,因此选择使用Python来构建桌面应用程序。

一、需求分析

整个操作流程可简化为以下三个步骤:

首先,通过点击按钮或按下快捷键激活截图模式;其次,在截图模式下,利用鼠标左键按下和松开操作来选取矩形区域;最后,将选定的矩形区域截图并保存至指定目录或复制到剪贴板。

接下来,我将从第三步开始,逆向推导并逐步编写、验证相关代码。

二、截图

通过搜索“python”和“截图”相关关键词,可以发现Python中有多种满足需求的函数。本文选用PIL库中的grab()函数进行图像截取,同时引入time函数用于测试截图操作的速度。

from PIL import ImageGrab
import time

# 截取图像
def catch_area(left, top, right, bottom):
    return ImageGrab.grab((left, top, right, bottom))
# 测试函数
def test():
    first = time.time()
    catch_area(101,101,200,300).save('D:/1.jpg')
    print(time.time() - first)

test()

三、矩形选择

截图函数需要四个参数,即矩形区域左上角和右下角的坐标(左、上、右、下)。为了获取这四个参数,需要监听鼠标的点击事件。起初尝试寻找全局监听器的API,选用了pyhook库,但测试发现其不支持Python 2.7,而升级至Python 3.7的安装过程较为复杂,因此放弃了该方法。随后想到可以利用GUI生成一个全屏的按钮,并监听对该按钮的点击事件。这里的GUI框架选用wxPython,其3.7版本可通过pip直接安装。

import wx
from PIL import ImageGrab

class ScreenShot(wx.Frame):
    left,right,top,bottom = 0,0,0,0
    img = None

    def __init__(self, parent):
        wx.Frame.__init__(self, parent,
            style = wx.MAXIMIZE # 全屏显示
        )
        # 设置背景色
        self.SetBackgroundColour((255,255,255))
        # 设置透明度
        self.SetTransparent(30)
        # 注册事件
        self.Bind(wx.EVT_LEFT_DOWN, self.OnDown, self)
        self.Bind(wx.EVT_LEFT_UP, self.OnUp, self)
        # 显示button
        self.Show(True)

    def OnDown(self, event):
        pos = event.GetPosition()
        self.top = pos.y
        self.left = pos.x
        
    def OnUp(self, event):
        pos = event.GetPosition()
        self.bottom = pos.y
        self.right = pos.x
        
        print(self.left, self.top, self.right, self.bottom)
        self.img = self.catch_area(
            self.left, self.top, self.right, self.bottom)
        # 截图完毕后关闭button
        self.Close(False)

    def catch_area(self, left, top, right, bottom):
        return ImageGrab.grab((left, top, right, bottom))
        
# 测试用例
# app = wx.App(False)
# frame = ScreenShot(None)
# app.MainLoop()

上述代码仅将截取的图像存储于img变量中,后续的具体操作(如保存或复制)请读者自行实现。

四、按钮设置

最后需要构造一个按钮并为其设置快捷键或热键。GUI部分继续使用前述的wxPython。页面布局可简单处理;设置快捷键需将焦点聚焦到特定控件上以绑定键盘事件;而热键支持全局使用,可将事件绑定到菜单选项或直接注册。本文采用直接注册热键的方式。

import wx
import ScreenShot as SS

class MainWindow(wx.Frame):
    def __init__(self, parent):
        # 视窗属性
        wx.Frame.__init__(self, parent,
            size = (1000, 200),         # 视窗大小
            style = wx.CLIP_CHILDREN,   # 视窗样式,这个样式可以去掉原生的标题栏
            #pos = (200, 200)           # 视窗位置,下面设置居中了
        )
        # 创建位于窗口的底部的状态栏
        self.CreateStatusBar()
        # 布局
        self.root = wx.BoxSizer(wx.VERTICAL)
        self.menu = wx.BoxSizer(wx.HORIZONTAL)
        self.body = wx.BoxSizer(wx.VERTICAL)
        self.menuText = [u"开始截图", u"退出"]
        self.menubuttons = []
        for i in range(0, 2):
            # 新建按键
            self.menubuttons.append(wx.Button(self, -1, self.menuText[i]))
            self.menu.Add(self.menubuttons[i], 1, wx.SHAPED)
        # 新建只读文本框(预留)
        self.control = wx.TextCtrl(self, style = wx.TE_READONLY)
        self.body.Add(self.control, 1, wx.GROW)
        self.root.Add(self.menu, 1, wx.GROW)
        self.root.Add(self.body, 4, wx.EXPAND)
        # 激活布局
        self.SetSizer(self.root)
        self.SetAutoLayout(True)
        # self.root.Fit(self) # 适应内部大小
        # 事件注册
        self.Bind(wx.EVT_BUTTON, self.OnStart, self.menubuttons[0])
        self.Bind(wx.EVT_BUTTON, self.OnExit, self.menubuttons[1])
        # 热键注册
        self.hotkey = wx.NewIdRef()  # 创建id
        self.RegisterHotKey(self.hotkey, wx.MOD_CONTROL, ord('Q'))  # 注册热键(按ctrl+Q键响应)
        self.Bind(wx.EVT_HOTKEY, self.OnKeyBoard, id=self.hotkey)   # 绑定热键事件
        # 窗口居中
        self.Center()
        # 显示视窗
        self.Show(True)

    # 开始截图
    def OnStart(self, event):
        SS.ScreenShot(self)

    # 关闭整个应用
    def OnExit(self, event):
        self.Destroy()    

    # 热键事件
    def OnKeyBoard(self, event):
        SS.ScreenShot(self)

app = wx.App(False)
frame = MainWindow(None)
app.MainLoop()

总结

最后两个代码块构成了完整的应用程序。这只是一个较为粗糙的示例,许多细节尚未优化,例如最小化到系统托盘、选取区域时自动显示边界框等功能。若有能力,读者可自行完善。至此,关于Python实现简单QQ截图的文章介绍完毕,更多相关Python QQ截图内容请搜索本站历史文章或继续浏览后续相关文章,希望大家以后多多支持本站!

 

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。