Python 实现全截屏或自定义截屏
文章目录
由
Deepseek提供支持
广告
导入模块
首先,导入必要的模块:
import tkinter
import tkinter.filedialog
import os
from PIL import ImageGrab
from time import sleep
tkinter:用于构建图形用户界面。tkinter.filedialog:用于创建文件对话框,以便用户选择保存截图的位置。os:提供与操作系统交互的功能,此处可能用于文件操作。PIL中的ImageGrab:用于进行屏幕截图。time中的sleep:用于在程序执行中暂停一段时间,这里可能用于控制截图时机。
MyCapture类
然后定义一个名为 MyCapture 的类,用于创建截图工具的界面和功能
class MyCapture:
def __init__(self, png):
self.X = tkinter.IntVar(value=0)
self.Y = tkinter.IntVar(value=0)
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_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.image = tkinter.PhotoImage(file=png)
self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)
MyCapture类用于创建截图工具的界面和功能。__init__方法初始化截图工具窗口,包括画布、图片和窗口大小等设置。
鼠标处理
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='blue')
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)
- 这三个函数分别处理了鼠标左键按下、移动和释放事件。
onLeftButtonDown:记录鼠标按下时的坐标。onLeftButtonMove:在鼠标移动时绘制选中区域的矩形框。onLeftButtonUp:在鼠标释放时完成截图操作。
按钮点击事件处理函数
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)
root.state('normal')
os.remove(filename)
def fullScreenCapture():
root.state('icon')
sleep(0.2)
filename = 'full_screen_temp.png'
im = ImageGrab.grab()
im.save(filename)
im.close()
pic = ImageGrab.grab()
fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('JPG files', '*.jpg')])
if fileName:
pic.save(fileName+'.jpg')
root.state('normal')
os.remove(filename)
buttonCaptureClick函数处理区域截图按钮点击事件,它先将窗口最小化,然后保存当前屏幕截图到临时文件,接着创建MyCapture实例,进行截图操作,最后恢复窗口状态并删除临时文件。fullScreenCapture函数处理全屏截图按钮点击事件,它也是先最小化窗口,保存全屏截图到临时文件,然后通过文件对话框询问用户保存位置并保存截图,最后恢复窗口状态并删除临时文件。
主程序
root = tkinter.Tk()
root.geometry('300x100+300+200')
root.resizable(False, False)
buttonCapture = tkinter.Button(root, text='区域截图', command=buttonCaptureClick, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#4CAF50', fg='white')
buttonCapture.place(x=30, y=30, width=100, height=30)
buttonFullCapture = tkinter.Button(root, text='全屏截图', command=fullScreenCapture, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#008CBA', fg='white')
buttonFullCapture.place(x=170, y=30, width=100, height=30)
root.mainloop()
- 创建了一个 Tkinter 窗口。
- 设置窗口的大小和位置,并禁止用户调整窗口大小。
- 创建了两个按钮,分别用于触发区域截图和全屏截图。
- 启动主事件循环,使窗口能够响应用户的操作。
完整代码
import tkinter
import tkinter.filedialog
import os
from PIL import ImageGrab
from time import sleep
class MyCapture:
def __init__(self, png):
self.X = tkinter.IntVar(value=0)
self.Y = tkinter.IntVar(value=0)
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_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.image = tkinter.PhotoImage(file=png)
self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)
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='blue')
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)
left, right = sorted([self.X.get(), event.x])
top, bottom = sorted([self.Y.get(), event.y])
pic = ImageGrab.grab((left+1, top+1, right, bottom))
fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('JPG files', '*.jpg')])
if fileName:
pic.save(fileName+'.jpg')
self.top.destroy()
self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
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)
root.state('normal')
os.remove(filename)
def fullScreenCapture():
root.state('icon')
sleep(0.2)
filename = 'full_screen_temp.png'
im = ImageGrab.grab()
im.save(filename)
im.close()
pic = ImageGrab.grab()
fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('JPG files', '*.jpg')])
if fileName:
pic.save(fileName+'.jpg')
root.state('normal')
os.remove(filename)
root = tkinter.Tk()
root.geometry('300x100+300+200')
root.resizable(False, False)
buttonCapture = tkinter.Button(root, text='区域截图', command=buttonCaptureClick, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#4CAF50', fg='white')
buttonCapture.place(x=30, y=30, width=100, height=30)
buttonFullCapture = tkinter.Button(root, text='全屏截图', command=fullScreenCapture, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#008CBA', fg='white')
buttonFullCapture.place(x=170, y=30, width=100, height=30)
root.mainloop()
温馨提示 : 非特殊注明,否则均为©李联华的博客网原创文章,本站文章未经授权禁止任何形式转载;来自:俄亥俄州·哥伦布 ,欢迎您的访问!
文章链接:https://www.lilianhua.com/python-implementation-of-full-or-custom-screenshots.html
文章链接:https://www.lilianhua.com/python-implementation-of-full-or-custom-screenshots.html
English (US)
Español (ES)
Português (PT)
Français (CA)
Español (MX)
Español (VE)
Español (CO)
Español (AR)
Português (BR)
Quechua (PE)
Guaraní (PY)
简体中文 (ZH)
繁體中文 (HK)
日本語 (JP)
한국어 (KR)
हिन्दी (HI)
Pilipino (PH)
ไทย (TH)
Tiếng Việt (VN)
Bahasa Melayu (MY)
Bahasa Indonesia (ID)
বাংলা (BD)
اردو (PK)
සිංහල (LK)
ភាសាខ្មែរ (KH)
English (UK)
Français (FR)
Deutsch (DE)
Italiano (IT)
Русский (RU)
Nederlands (NL)
Türkçe (TR)
Polski (PL)
Svenska (SE)
Norsk (NO)
Dansk (DK)
Suomi (FI)
Ελληνικά (GR)
Čeština (CZ)
Magyar (HU)
Română (RO)
Български (BG)
Српски (RS)
Українська (UA)

