在日常工作中,截图是一个非常常见的需求。虽然 Windows 自带截图工具,但有时我们需要更精确的截图方式,比如选取特定区域、快速保存截图并进行预览。本篇博客将介绍一个使用 Python 结合 Tkinter 和 PyAutoGUI 开发的精确截图工具。
C:\pythoncode\new\manageimages.py
运行结果
全部代码
import tkinter as tk
from tkinter import ttk
import pyautogui
import numpy as np
from PIL import Image, ImageTk, ImageGrab
import os
from datetime import datetime
import time
class ImprovedScreenshotTool:
def __init__(self):
# Create the main window
self.root = tk.Tk()
self.root.title("精确截图工具")
self.root.geometry("400x200")
self.root.resizable(False, False)
# Center the window
self.center_window()
# Create a frame for the controls
control_frame = ttk.Frame(self.root)
control_frame.pack(pady=10, fill=tk.X)
# Create and place the screenshot button
self.screenshot_btn = ttk.Button(
control_frame,
text="开始截图",
width=20,
command=self.prepare_screenshot
)
self.screenshot_btn.pack(pady=10)
# Status label
self.status_label = ttk.Label(control_frame, text="就绪")
self.status_label.pack(pady=5)
# Preview frame
self.preview_frame = ttk.LabelFrame(self.root, text="最近截图预览")
self.preview_frame.pack(pady=10, padx=10, fill=tk.BOTH, expand=True)
self.preview_label = ttk.Label(self.preview_frame)
self.preview_label.pack(fill=tk.BOTH, expand=True)
# Variables for region selection
self.start_x = 0
self.start_y = 0
self.end_x = 0
self.end_y = 0
# Save directory
pictures_dir = os.path.join(os.path.expanduser("~"), "Pictures")
if os.path.exists(pictures_dir):
self.save_dir = pictures_dir
else:
self.save_dir = os.path.join(os.path.expanduser("~"), "Desktop")
# Make sure the directory exists
if not os.path.exists(self.save_dir):
os.makedirs(self.save_dir)
# Last saved file
self.last_saved_file = None
def center_window(self):
# Get screen width and height
screen_width = self.root.winfo_screenwidth()
screen_height = self.root.winfo_screenheight()
# Calculate position
x = (screen_width - 400) // 2
y = (screen_height - 200) // 2
# Set window position
self.root.geometry(f"400x200+{
x}+{
y}")
def prepare_screenshot(self):
# Update status
self.status_label.config(text="准备截图...")
self.root.update() # Force UI update
# Minimize window
self.root.withdraw()
# Wait a moment for UI to update
self