所用到的一些包
* PIL中的ImageGrab库可以实现屏幕的截图
* tkinter可以实现UI的设置
* time中的sleep可以实现休息时间
代码讲解
以下代码只是讲解可能无法运行
import tkinter
root = tkinter.Tk()
root.state("icon")
# 最小化主窗口,这个需要等待时间,所以只用后,最好sleep(),等待
root.state("normal")
# 恢复主窗口
from PIL import ImageGrab
im = ImageGrab()
# 不向ImageGrab传参时,可以实现全屏幕截图
im0 =ImageGrab.grab((300, 100, 1400, 600))
# 向ImageGrab传参(元素个数为4的元组)时,可以实现矩形范围截图,四个元素分别是
#(左上角顶点,左下角顶点,右上角顶点,右下角顶点)
im.save('filename')
# 保存图片文件 (扩展名:png)
im.close()
# 关闭文件
import tkinter as tk
Canvas = tk.Canvas() # 创建画布
Canvas.create_image(width,height,image) # 插入画布的宽度与高度(两个参数的位置不可以改变)
lastDraw = self.Canvas.create_rectangle(a,b,c,d,outline="black") # 在Canvas上绘制矩形,abcd四个参数分别是矩形的4个顶点
Canvas.delete(lastDraw) # 删除Canvas上的矩形
程序代码
import tkinter as tk
from PIL import ImageGrab as IG # IG牛逼!
import tkinter.messagebox
from time import sleep
root = tk.Tk()
class MyCapture:
def __init__(self,FileName):
self.Start = False # 是否开始截图?
self.X = tk.IntVar(value=0)
self.Y = tk.IntVar(value=0)
# X Y 主要存储了开始部分截图,左键按下的位置
self.screenWidth = root.winfo_screenwidth()
self.screenHeight = root.winfo_screenheight()
# 获取窗口的大小(分辨率)
self.top = tk.Toplevel(root,width=self.screenWidth,
height=self.screenHeight)
self.top.overrideredirect(True)
# 不显示标题栏
self.Canvas = tk.Canvas(self.top,
bg='white',
width=self.screenWidth,
height=self.screenHeight)
self.image = tk.PhotoImage(file=FileName)
self.Canvas.create_image(self.screenWidth//2,
self.screenHeight//2,
image=self.image)
'''
self.screenWidth//2,
self.screenHeight//2,
意思是将图片显示在画布的中央(且两个参数的位置不可以互换!!)
'''
def Down(event):
self.Start = True
self.X.set(event.x) # 记录开始X
self.Y.set(event.y) # 记录开始y
self.Canvas.bind("<Button-1>",Down)
def Move(event):
global lastDraw
if self.Start == False:
return # 如果截图开始,移动鼠标啥事没有
try:
self.Canvas.delete(lastDraw)
except Exception as e:
print(e)
lastDraw = self.Canvas.create_rectangle(self.X.get(),
self.Y.get(),
event.x,
event.y,
outline="black")
# 绘制一个矩形区域
self.Canvas.bind("<B1-Motion>",Move)
def Up(event):
self.Start = False # 退出截图模式
try:
self.Canvas.delete(lastDrew)
except:
pass
l,r = sorted([self.X.get(),event.x])
t,b = sorted([self.Y.get(),event.y])
IM = IG.grab((l+1,t+1,r,b))
import tkinter.filedialog
try:
FileName = tkinter.filedialog.asksaveasfilename(title="保存截图",filetype=[('image','*.png')])
print(FileName)
FileName += '.png'
if FileName:
IM.save(FileName)
except ValueError:
pass
self.top.destroy()
self.Canvas.bind("<ButtonRelease-1>",Up)
def quit_mode(e):
self.top.destroy()
self.Canvas.bind('<Button-3>',quit_mode)
self.Canvas.pack()
def Path_Pic():
FileName = "path.png"
root.state("icon")
sleep(0.2)
image = IG.grab()
image.save(FileName)
image.close()
sleep(0.5)
w = MyCapture(FileName)
root.wait_window(w.top) # 等待窗口的关闭
root.state("normal")
def Full_Pic():
root.state("icon")
import tkinter.filedialog
FileName = tkinter.filedialog.asksaveasfilename(title="保存截图", filetype=[('image', '*.png')])
print(FileName)
FileName += '.png'
sleep(0.2)
image = IG.grab()
image.save(FileName)
image.close()
tk.messagebox.showinfo("提示",'主人,已为你截图成功啦')
root.state("normal")
Picture_Full = tk.Button(text="全屏幕截图",command=Full_Pic)
Picture_Full.pack()
Picture_Path = tk.Button(text="部分窗口截图",command=Path_Pic)
Picture_Path.pack()
root.mainloop()