首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MacOS上捕获tkinter窗口的图像(屏幕截图)

如何在MacOS上捕获tkinter窗口的图像(屏幕截图)
EN

Stack Overflow用户
提问于 2022-01-14 19:42:50
回答 2查看 337关注 0票数 4

我在Python中创建了一个GUI应用程序,用于分析实验室中的数据。有许多按钮、图形和画布小部件。只使用一个适当保存文件名的按钮就可以截取整个窗口的屏幕快照(“root”),这将很有帮助。例如使用Mac内置的“屏幕截图”应用程序这里

相关问题这里这里这里,但都没有成功。最后环节几乎是成功的,但是保存的图像是我计算机的桌面背景。我的电脑是Mac,MacOS蒙特利12.0.1。

“‘root”是tkinter窗口,因为

代码语言:javascript
运行
复制
root = tk.Tk()

出现在脚本的开头,类似于示例这里中的“窗口”。我在下面的代码示例中使用PIL.ImageGrab

这是当前的代码,它对我的桌面背景有一个没有帮助的屏幕截图,

代码语言:javascript
运行
复制
def screenshot():
    # retrieve the time string to use as a filename
    file_name = root.time_string[-6:]
    full_file_name = file_name + '_summary' + '.png'
    x = root.winfo_rootx() + root.winfo_x()
    y = root.winfo_rooty() + root.winfo_y()
    x1 = x + root.winfo_width()
    y1 = y + root.winfo_height()
    ImageGrab.grab().crop((x, y, x1, y1)).save(full_file_name)

我创建的按钮如下:

代码语言:javascript
运行
复制
screenshot_btn = tk.Button(root, text='Screenshot', command=lambda: screenshot(), font=('Verdana', 24), state=DISABLED)

我把按钮放在“根”中,如下所示:

代码语言:javascript
运行
复制
screenshot_btn.grid(row=11, column=3)

这是我在堆栈溢出的第一篇文章。如果我在第一次尝试时没有完全遵循所有的指导方针,我会提前道歉。谢谢你的耐心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-14 22:30:05

首先,我没有问题抓取显示我的桌面,但它显示了一个不适当的裁剪图像。

我找到了一个麻烦的解决办法。问题似乎与决议有关。所以尺寸需要一些缩放。

我所做的就是从ImageGrab.grab().save(full_file_name) (不剪切)获得输出,并测量所需图像区域的大小(以像素为单位)。这些维度将被称为x_pixelsy_pixels

然后,我在屏幕单位的实际窗口上测量了同样的面积。我通过使用mac屏幕截图工具来实现这一点,它显示了一个区域的尺寸。然后,我将这些维度称为x_screeny_screen。然后,我修改了您的屏幕截图功能如下。

代码语言:javascript
运行
复制
def screenshot():
    # retrieve the time string to use as a filename
    file_name = root.time_string[-6:]
    full_file_name = file_name + '_summary' + '.png'
    x = root.winfo_rootx()
    y = root.winfo_rooty()
    x1 = x + root.winfo_width()
    y1 = y + root.winfo_height()
    x_pixels = 337
    y_pixels = 79
    x_screen = 171
    y_screen = 41
    x = x*(x_pixels/x_screen)
    y = y*(y_pixels/y_screen)
    x1 = x1*(x_pixels/x_screen)
    y1 = y1*(y_pixels/y_screen)
    ImageGrab.grab().crop((x, y, x1, y1)).save(full_file_name)

注意,我还删除了+root.winfo_x()+root.winfo_y()

结果如下所示。这并不完美,但我相信,如果我更仔细地测量屏幕截图和窗口边界上的像素,缩放效果会得到改善。

票数 1
EN

Stack Overflow用户

发布于 2022-03-17 18:10:51

你有"Retina“显示器吗?ImageGrab没有考虑到它从Mac的screencapture命令收集到的144个DPI图像。您可以通过将所有的x、y、x1、y1值乘以2来弥补这一点(但如果需要考虑Mac标题栏,您可能仍然会错过一点)。

或者,使用pyscreenshot包(或者窃取它的代码.)。它使用screencapture的“screencapture”选项来获得图像的适当边界。工作在扩展监视器上,如我的,其中x-命令<0(因为它在主监视器的左边)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70715792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档