You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter截图工具问题:无法创建全透窗口与半透明选框

解决Tkinter实现全透明截图选框的方案

要实现初始全透明、选框区域半透明黑色的效果,核心是利用Tkinter的透明色属性替代全局透明度,这样只有画布背景色会被透明化,选框区域可以独立设置半透明效果。以下是修改后的代码及关键说明:

关键调整点

  • 使用-transparentcolor指定透明色,而非全局-alpha,避免整个窗口都有透明度
  • 画布背景设为透明色,实现初始全透明
  • 选框填充色用带alpha通道的黑色(#00000080对应50%不透明)
  • 修复选框删除的错误方法(delete替代destroy)

修改后的完整代码

import tkinter as tk
from PIL import ImageGrab
import pytesseract

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'


class Overlay:
    def __init__(self, master: tk.Tk):
        self.master = master
        self.master.attributes("-topmost", True)
        # 指定透明色为gray1(极少使用的颜色,避免冲突)
        self.master.wm_attributes("-transparentcolor", "gray1")
        self.master.attributes("-fullscreen", True)
        self.master.overrideredirect(True)  # 去掉窗口边框和标题栏

        # 画布背景设为透明色,实现初始全透明
        self.canvas = tk.Canvas(
            master=self.master,
            cursor="cross",
            height=self.master.winfo_screenheight(),
            width=self.master.winfo_screenwidth(),
            bg="gray1"
        )
        self.canvas.pack()
        self.x = None
        self.y = None
        self.selection = None
        self.screenshot = None

        self.canvas.bind("<ButtonPress-1>", self.onPress)
        self.canvas.bind("<B1-Motion>", self.onDrag)
        self.canvas.bind("<ButtonRelease-1>", self.onRelease)
        self.canvas.bind("<Escape>", self.removeOverlay)  # 恢复ESC关闭功能

    def onPress(self, event):
        self.x = self.master.winfo_pointerx()
        self.y = self.master.winfo_pointery()
        if self.selection:
            self.canvas.delete(self.selection)  # 正确删除已有选框
        self.selection = None

    def onDrag(self, event):
        curr_x = self.master.winfo_pointerx()
        curr_y = self.master.winfo_pointery()
        if self.selection:
            self.canvas.coords(self.selection, self.x, self.y, curr_x, curr_y)
        else:
            # 创建半透明黑色选框,#00000080表示黑色+50%不透明度
            self.selection = self.canvas.create_rectangle(
                self.x, self.y, curr_x, curr_y,
                outline="white",  # 白色边框增强辨识度
                fill="#00000080"
            )

    def onRelease(self, event):
        if not self.selection:
            return  # 未框选则直接退出
        x1, y1, x2, y2 = self.canvas.coords(self.selection)
        self.master.destroy()
        # 计算正确的选框坐标(确保左上到右下)
        selected_box = (min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2))
        self.screenshot = ImageGrab.grab(bbox=selected_box)
        print(pytesseract.image_to_string(self.screenshot))

    def removeOverlay(self, event):
        self.master.destroy()


if __name__ == "__main__":
    root = tk.Tk()
    app = Overlay(root)
    root.mainloop()

注意事项

  • 透明色选择:尽量用系统不常用的颜色(如gray1),避免和界面元素颜色冲突导致意外透明
  • 平台兼容性:-transparentcolor在Windows上表现稳定,macOS和Linux可能需要调整为-transparent属性(但逻辑类似)
  • 选框边框:添加白色边框可以让用户更清晰看到选框范围,提升操作体验

内容的提问来源于stack exchange,提问作者Sam Ps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:57:35