欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的QQ截圖

 更新時(shí)間:2022年02月10日 16:22:11   作者:Also_easy  
大家好,本篇文章主要講的是Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的QQ截圖,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下的相關(guān)資料

前言

  畢設(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)文章

最新評(píng)論