您好,登錄后才能下訂單哦!
今天我看了一下自己的文件夾,發(fā)現(xiàn)了自己寫了許多似乎很無聊的代碼。于是乎,一個想法油然而生:“生活已經(jīng)很無聊了,不如再無聊一點叭”。
說干就干,那就開一個專題,我們稱之為kimol君的無聊小發(fā)明。
妙…啊~~~
今天要做的東西,就是用python寫一個截屏工具。想必大家平時截屏的時候很多都是用的微信的ALT+A或者是WINDOWS自帶的截屏軟件。作為技術(shù)宅的我,怎么總是用別人的東西呢?
看我的,上圖:
效果還闊以,好歹這個小貓咪截出來也是有模有樣的~
1. 相關(guān)庫
在python中可以實現(xiàn)截圖的庫有很多,這里我用的是pyautogui,它可以對指定區(qū)域進行截屏:
import pyautogui
而界面部分(截屏的框選等)采用了tkinter庫:
2. 定義窗口
定義一個透明的窗口,讓它的大小與屏幕一樣:
root = tk.Tk() root.overrideredirect(True) # 隱藏窗口的標題欄 root.attributes("-alpha", 0.1) # 窗口透明度10% root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight())) root.configure(bg="black") 注:alhpa參數(shù)用于設(shè)定透明度;geometry函數(shù)用于設(shè)定窗口大小; 創(chuàng)建一個子窗口,用于顯示框選區(qū)域: # 再創(chuàng)建1個Canvas用于圈選 cv = tk.Canvas(root) x, y = 0, 0 xstart,ystart = 0 ,0 xend,yend = 0, 0 rec = ''
注:alhpa參數(shù)用于設(shè)定透明度;geometry函數(shù)用于設(shè)定窗口大??;
創(chuàng)建一個子窗口,用于顯示框選區(qū)域:
# 再創(chuàng)建1個Canvas用于圈選 cv = tk.Canvas(root) x, y = 0, 0 xstart,ystart = 0 ,0 xend,yend = 0, 0 rec = ''
3. 繪制工具條
繪制一個工具條,方便后續(xù)增加功能。講道理目前來說這個就是個雞肋(可以省去),但是如果后續(xù)還想晚上功能的話,會很有幫助。
canvas = tk.Canvas(root) canvas.configure(width=300) canvas.configure(height=100) canvas.configure(bg="yellow") canvas.configure(highlightthickness=0) # 高亮厚度 canvas.place(x=(root.winfo_screenwidth()-500),y=(root.winfo_screenheight()-300)) canvas.create_text(150, 50,font='Arial -20 bold',text='ESC退出,假裝工具條') 1234567
4. 定義事件函數(shù)
監(jiān)聽鼠標和鍵盤事件,實時監(jiān)控框選區(qū)域和截屏,具體的事件有:
# 綁定事件 canvas.bind("<B1-Motion>", move) # 鼠標左鍵移動->顯示當前光標位置 root.bind('<Escape>',sys_out) # 鍵盤Esc鍵->退出 root.bind("<Button-1>", button_1) # 鼠標左鍵點擊->顯示子窗口 root.bind("<B1-Motion>", b1_Motion)# 鼠標左鍵移動->改變子窗口大小 root.bind("<ButtonRelease-1>", buttonRelease_1) # 鼠標左鍵釋放->記錄最后光標的位置 root.bind("<Button-3>",button_3) #鼠標右鍵點擊->截屏并保存圖片 root.mainloop()
監(jiān)聽鼠標光標位置:
def move(event): global x, y ,xstart,ystart new_x = (event.x-x)+canvas.winfo_x() new_y = (event.y-y)+canvas.winfo_y() s = "300x200+" + str(new_x)+"+" + str(new_y) canvas.place(x = new_x - xstart,y = new_y -ystart) print("s = ", s) print(root.winfo_x(), root.winfo_y()) print(event.x, event.y)
創(chuàng)建子窗口:
def button_1(event): global x, y ,xstart,ystart global rec x, y = event.x, event.y xstart,ystart = event.x, event.y print("event.x, event.y = ", event.x, event.y) xstart,ystart = event.x, event.y cv.configure(height=1) cv.configure(width=1) cv.config(highlightthickness=0) # 無邊框 cv.place(x=event.x, y=event.y) rec = cv.create_rectangle(0,0,0,0,outline='red',width=8,dash=(4, 4))
改變子窗口大?。?/p>
def b1_Motion(event): global x, y,xstart,ystart x, y = event.x, event.y print("event.x, event.y = ", event.x, event.y) cv.configure(height = event.y - ystart) cv.configure(width = event.x - xstart) cv.coords(rec,0,0,event.x-xstart,event.y-ystart)
松開鼠標,記錄最后的光標位置:
def buttonRelease_1(event): global xend,yend xend, yend = event.x, event.y
截屏并保存圖片:
def button_3(event): global xstart,ystart,xend,yend cv.delete(rec) cv.place_forget() img = pyautogui.screenshot(region=[xstart,ystart,xend-xstart,yend-ystart]) # x,y,w,h img.save('screenshot.png') sys_out(None)
退出程序:
def sys_out(even): root.destroy()
這個還有很多可以改進的地方。
寫在最后
最后,感謝各位大大的耐心閱讀~
到此這篇關(guān)于如何使用python寫截屏小工具的文章就介紹到這了,更多相關(guān)python截屏小工具內(nèi)容請搜索億速云以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持億速云!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。