用python實現選擇截圖區域


一直想用python實現一個類似QQ截圖的功能,但不直接截圖,而是返回截圖的區域,以下是代碼

# -*- coding:utf-8 -*-  
import tkinter
import tkinter.filedialog
import os
from PIL import ImageGrab
from time import sleep
from tkinter import StringVar, IntVar
#創建tkinter主窗口
root = tkinter.Tk()
#指定主窗口位置與大小
root.geometry('200x80+400+300')
#不允許改變窗口大小
root.resizable(False, False)
class MyCapture:
    def __init__(self, png):
        #變量X和Y用來記錄鼠標左鍵按下的位置
        self.X = tkinter.IntVar(value=0)
        self.Y = tkinter.IntVar(value=0)
        
        self.selectPosition=None
        #屏幕尺寸
        screenWidth = root.winfo_screenwidth()
        #print(screenWidth)
        screenHeight = root.winfo_screenheight()
        #print(screenHeight)
        #創建頂級組件容器
        self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)
        #不顯示最大化、最小化按鈕
        self.top.overrideredirect(True)
        self.canvas = tkinter.Canvas(self.top,bg='white', width=screenWidth, height=screenHeight)
        #顯示全屏截圖,在全屏截圖上進行區域截圖
        self.p_w_picpath = tkinter.PhotoImage(file=png)
        self.canvas.create_p_w_picpath(screenWidth//2, screenHeight//2, p_w_picpath=self.p_w_picpath)
        #鼠標左鍵按下的位置
        def onLeftButtonDown(event):
            self.X.set(event.x)
            self.Y.set(event.y)
            #開始截圖
            self.sel = True
        self.canvas.bind('<Button-1>', onLeftButtonDown)
        #鼠標左鍵移動,顯示選取的區域
        def onLeftButtonMove(event):
            if not self.sel:
                return
            global lastDraw
            try:
                #刪除剛畫完的圖形,要不然鼠標移動的時候是黑乎乎的一片矩形
                self.canvas.delete(lastDraw)
            except Exception as e:
                pass
            lastDraw = self.canvas.create_rectangle(self.X.get(), self.Y.get(), event.x, event.y, outline='black')
        self.canvas.bind('<B1-Motion>', onLeftButtonMove)
        #獲取鼠標左鍵擡起的位置,保存區域截圖
        def onLeftButtonUp(event):
            self.sel = False
            try:
                self.canvas.delete(lastDraw)
            except Exception as e:
                pass
            sleep(0.1)
            #考慮鼠標左鍵從右下方按下而從左上方擡起的截圖
            myleft, myright = sorted([self.X.get(), event.x])
            mytop, mybottom = sorted([self.Y.get(), event.y])
            self.selectPosition=(myleft,myright,mytop,mybottom)
#             pic = ImageGrab.grab((left+1, top+1, right, bottom))
#   
#             #彈出保存截圖對話框
#  
#             fileName = tkinter.filedialog.asksaveasfilename(title='保存截圖', filetypes=[('JPG files', '*.jpg')])
#  
#             if fileName:
#  
#                 pic.save(fileName+'.jpg')
            #關閉當前窗口
            #print(left, '  ', top,'  ',right,'  ',bottom)
            
            self.top.destroy()
            
        self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
        self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
    #開始截圖
text = StringVar()
text.set('old')
def buttonCaptureClick():
    #最小化主窗口
    #root.state('icon')
    #sleep(0.2)
    
    filename = 'temp.png'
    im = ImageGrab.grab()
    im.save(filename)
    im.close()
    #顯示全屏幕截圖
    w = MyCapture(filename)
    buttonCapture.wait_window(w.top)
    text.set(str(w.selectPosition))
    
    #print(w.myleft,w.mybottom)
    #截圖結束,恢復主窗口,並刪除臨時的全屏幕截圖文件
    #label.config(text='Hello')
    root.state('normal')
    os.remove(filename)
label=tkinter.Label(root,textvariable=text)
label.place(x=10, y=30, width=160, height=20)
label.config(text='New test')
buttonCapture = tkinter.Button(root, text='截圖', command=buttonCaptureClick)
buttonCapture.place(x=10, y=10, width=160, height=20)
#啓動消息主循環
#root.update()
root.mainloop()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章