python程序截图,qq截图生成器
大家好,本文主要是关于Python实现一个简单的QQ截图。有兴趣的同学过来看看。如果对你有帮助,请记得收集相关资料。
00-1010前言一、需求分析二、截图三、矩形选择四、按钮设置总结
目录
Bi设置了一部分使用类似QQ截图的功能,这里记录制作过程。因为后面会加入人工智能的功能,所以用python写桌面应用。
前言
该过程可以简单地分为以下三个步骤:
点击按钮或点击快捷键进入截图模式;在截图模式下,通过按下/释放鼠标左键来选择矩形区域;将矩形区域的截图保存到指定目录或剪贴板。
现在我从第三步开始一步一步的搜索,写作,验证。
一、需求分析
通过“python”和“截图”的搜索,不难发现python有很多符合我们需求的功能。这里选择了PIL图书馆的grab()函数。时间功能用于测试截图速度。
从PIL进口图片抓取
导入时间
#捕捉图像
def catch_area(左、上、右、下):
return ImageGrab.grab((左、上、右、下))
#测试功能
定义测试():
first=time.time()
catch_area(101,101,200,300)。保存( D:/1.jpg )
print(time.time() - first)
测试()
二、截图
截图函数需要四个参数,即矩形区域的上、下、左、右坐标。为了得到这四个参数,我们需要监控鼠标的点击事件。本来想搜索一个全局监听器的api。这里用的是pyhook。但是测试发现不支持python2.7,python3.7的安装过程极其复杂,所以放弃了这种方法。
后来想到可以用GUI生成一个全屏按钮,然后监控这个按钮的点击事件。这里的GUI是wxPython,3.7版直接用pip安装。
导入wx
从PIL进口图片抓取
班级截图(wx。框架):
左、右、上、下=0,0,0,0
img=无
def __init__(self,parent):
wx.Frame.__init__(自身,父级,
Style=wx。最大化#全屏显示
)
#设置背景颜色
自我。SetBackgroundColour((255,255,255))
#设置透明度
自我。SetTransparent(30)
#注册事件
自我。绑定(wx。EVT左下方,赛尔夫。OnDown,self)
自我。绑定(wx。EVT左上方,赛尔夫。OnUp,self)
#显示按钮
自我。显示(真)
def OnDown(自身,事件):
pos=事件。GetPosition()
self.top=pos.y
self.left=pos.x
def OnUp(自身,事件):
pos=事件。GetPosition()
self.bottom=pos.y
self.right=pos.x
打印(自左、自上、自右、自下)
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 wximport 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截图的文章就介绍到这了,更多相关pythonQQ截图内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。