Python實現(xiàn)一個簡單的QQ截圖
前言
畢設(shè)有一部分要用到類似QQ截圖的功能,這里記錄制作過程。因為后期要添加人工智能的功能,所以用python來寫桌面應(yīng)用。
一、需求分析
可以簡單的將過程分為以下三步:
點擊按鈕或敲擊快捷鍵進入截圖模式;在截圖模式通過鼠標左鍵按壓/松開選取矩形區(qū)域;將矩形區(qū)域截圖保存到指定目錄或者剪貼板。
現(xiàn)在我將從第三步開始一步步向上搜索、編寫、驗證。
二、截圖
通過對“python”和“截圖”兩個關(guān)鍵字搜索不難發(fā)現(xiàn)python有多種滿足我們需求的函數(shù),這里選用PIL庫的grab()函數(shù)。time函數(shù)是用來測試截圖速度的。
from PIL import ImageGrab
import time
# 截取圖像
def catch_area(left, top, right, bottom):
return ImageGrab.grab((left, top, right, bottom))
# 測試函數(shù)
def test():
first = time.time()
catch_area(101,101,200,300).save('D:/1.jpg')
print(time.time() - first)
test()
三、矩形選擇
截圖函數(shù)需要四個參數(shù),即矩形區(qū)域的上下左右的坐標。為了獲取這四個參數(shù)我們需要監(jiān)聽鼠標的點擊事件。我本來想搜尋一個全局監(jiān)聽器的api的,這里選用的是pyhook。但是測試發(fā)現(xiàn)不支持python2.7,而python3.7的安裝過程極其復(fù)雜,故放棄此方法。
后來我想到可以利用GUI生成一個全屏的button,然后監(jiān)聽對這個button的點擊事件。這里的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 # 全屏顯示
)
# 設(shè)置背景色
self.SetBackgroundColour((255,255,255))
# 設(shè)置透明度
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)
# 截圖完畢后關(guān)閉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變量中,至于后續(xù)操作請各位自行實現(xiàn)。
四、按鈕設(shè)置
最后需要構(gòu)造一個按鈕并為其設(shè)置快捷鍵/熱鍵。GUI同樣使用之前的wxPython。頁面就隨便寫寫;設(shè)置快捷鍵即為某個控件綁定鍵盤事件,需要將焦點聚集到某個控件上;而熱鍵是可以全局使用,熱鍵設(shè)置可將事件綁定到菜單選項上,也可以直接注冊。這里直接注冊熱鍵。
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) # 視窗位置,下面設(shè)置居中了
)
# 創(chuàng)建位于窗口的底部的狀態(tài)欄
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)
# 新建只讀文本框(預(yù)留)
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) # 適應(yīng)內(nèi)部大小
# 事件注冊
self.Bind(wx.EVT_BUTTON, self.OnStart, self.menubuttons[0])
self.Bind(wx.EVT_BUTTON, self.OnExit, self.menubuttons[1])
# 熱鍵注冊
self.hotkey = wx.NewIdRef() # 創(chuàng)建id
self.RegisterHotKey(self.hotkey, wx.MOD_CONTROL, ord('Q')) # 注冊熱鍵(按ctrl+Q鍵響應(yīng))
self.Bind(wx.EVT_HOTKEY, self.OnKeyBoard, id=self.hotkey) # 綁定熱鍵事件
# 窗口居中
self.Center()
# 顯示視窗
self.Show(True)
# 開始截圖
def OnStart(self, event):
SS.ScreenShot(self)
# 關(guān)閉整個應(yīng)用
def OnExit(self, event):
self.Destroy()
# 熱鍵事件
def OnKeyBoard(self, event):
SS.ScreenShot(self)
app = wx.App(False)
frame = MainWindow(None)
app.MainLoop()
總結(jié)
最后兩個代碼塊就是完整應(yīng)用。這只是一個十分粗略的應(yīng)用,很多細節(jié)都沒有優(yōu)化,比如最小化到托盤、選取區(qū)域時自動標出區(qū)域。若各位有能力可自行實現(xiàn)。到此這篇關(guān)于Python實現(xiàn)一個簡單的QQ截圖的文章就介紹到這了,更多相關(guān)python QQ截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python網(wǎng)絡(luò)編程學習筆記(四):域名系統(tǒng)
當我們在上網(wǎng)的時候,通常輸入的是網(wǎng)址,其實這就是一個域名,而我們計算機網(wǎng)絡(luò)上的計算機彼此之間只能用IP地址才能相互識別2014-06-06
TensorFlow基于MNIST數(shù)據(jù)集實現(xiàn)車牌識別(初步演示版)
這篇文章主要介紹了TensorFlow基于MNIST數(shù)據(jù)集實現(xiàn)車牌識別(初步演示版),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
哪種Python框架適合你?簡單介紹幾種主流Python框架
這篇文章主要介紹了幾種主流的Python框架,幫助大家更好的理解和學習Python,感興趣的朋友可以了解下2020-08-08
Python3.7將普通圖片(png)轉(zhuǎn)換為SVG圖片格式(網(wǎng)站logo圖標)動起來
這篇文章主要介紹了Python3.7將普通圖片(png)轉(zhuǎn)換為SVG圖片格式并且讓你的網(wǎng)站Logo(圖標)從此”動”起來,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Python中l(wèi)ist列表的賦值方法及遇到問題處理
這篇文章主要介紹了Python中l(wèi)ist列表的賦值方法及遇到問題處理,記錄在列表list的賦值過程中遇到的問題,并對列表的拷貝相關(guān)知識進行匯總,需要的朋友可以參考一下2022-03-03

