Python实现始终置顶的简易截图工具

山间有风
山间有风
发布时间:2026-10-15| 3人浏览过
原创

本文介绍如何使用Python的tkinter和pyautogui库开发一个简易截图工具。该工具支持区域选择,并强制截图预览窗口始终置顶显示,确保不被其他应用遮挡。文中提供了完整代码实现、功能说明及快捷键设置建议,适合需要快速截图且希望保持窗口可见性的用户参考。

Python实现始终置顶的简易截图工具

在工作场景中,同事提出需要一个截图后能显示结果且始终处于最前端的简易工具,即确保截图窗口不会被其他应用程序覆盖。以下是实现该功能的完整代码:

# # -*- coding: utf-8 -*-
import tkinter as tk
import pyautogui
import tkinter
from PIL import ImageTk
from PIL import Image
 
root = tk.Tk()
root.wm_attributes('-topmost', 1)
 
root.overrideredirect(True)  # 隐藏窗口的标题栏
# root.attributes("-alpha", 0.3)    # 窗口透明度70 %
root.attributes("-alpha", 0.4)  # 窗口透明度60 %
# root.geometry("300x200+10+10")      # 设置窗口大小与位置
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
root.configure(bg="blue")
 
# 当工具条
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退出,假装工具条')
 
# 再创建1个Canvas用于圈选
cv = tk.Canvas(root)
x, y = 0, 0
xstart, ystart = 0, 0
 
 
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)
 
 
# 鼠标左键按下
def button_1(event):
    global x, y, xstart, ystart
    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.place(x=event.x, y=event.y)
 
 
# 鼠标左键按下并移动
def b1_Motion(event):
    global x, y
    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)
 
 
# 鼠标左键松开
def buttonRelease_1(event):
    global x, y, xstart, ystart
    x, y = event.x, event.y
    print("event.x, event.y = ", event.x, event.y)
    Pstart = [0, 0]
    cv.place_forget()
    img = pyautogui.screenshot(region=[xstart, ystart, x - xstart, y - ystart])  # x,y,w,h
    img.save('screenshot.png')
 
 
# 退出
def sys_out(even):
    root.destroy()
    func()
 
# 绑定事件
canvas.bind("<B1-Motion>", move)
# 绑定事件到Esc键,当按下Esc键就会调用sys_out函数,弹出对话框
root.bind('<Escape>', sys_out)
root.bind("<Button-1>", button_1)
root.bind("<B1-Motion>", b1_Motion)
root.bind("<ButtonRelease-1>", buttonRelease_1)
img_png = None
def func():
    root1 = tk.Tk()
    root1.wm_attributes('-topmost', 1)
    img_open = Image.open("screenshot.png")
    global img_png
    img_png = ImageTk.PhotoImage(img_open)
    label_img = tk.Label(root1, image = img_png)
    label_img.pack()
 
root.mainloop()

具体操作流程如下:首先运行程序,接着在屏幕上选定需要截图的区域(支持多次重新选择,系统以最后一次选定区域为准),最后按下Esc键完成截图操作,此时会弹出一个始终置顶的窗口显示截图结果。

我将该程序打包成可执行文件发送给同事,反馈显示工具非常实用,但同事希望能增加一个全局快捷键以方便调用。

实际上,添加快捷键的功能并不复杂。只需将程序打包为exe文件后,在文件的右键属性菜单中设置相应的快捷键即可实现。

至此,关于利用Python实现一个简易截图工具的教程已结束。如需了解更多Python截图工具相关内容,欢迎查阅本站过往文章或继续浏览后续内容,感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。