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