我在Python中创建了一个GUI应用程序,用于分析实验室中的数据。有许多按钮、图形和画布小部件。只使用一个适当保存文件名的按钮就可以截取整个窗口的屏幕快照(“root”),这将很有帮助。例如使用Mac内置的“屏幕截图”应用程序这里。
相关问题这里、这里和这里,但都没有成功。最后环节几乎是成功的,但是保存的图像是我计算机的桌面背景。我的电脑是Mac,MacOS蒙特利12.0.1。
“‘root”是tkinter窗口,因为
root = tk.Tk()
出现在脚本的开头,类似于示例这里中的“窗口”。我在下面的代码示例中使用PIL.ImageGrab
。
这是当前的代码,它对我的桌面背景有一个没有帮助的屏幕截图,
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)
我创建的按钮如下:
screenshot_btn = tk.Button(root, text='Screenshot', command=lambda: screenshot(), font=('Verdana', 24), state=DISABLED)
我把按钮放在“根”中,如下所示:
screenshot_btn.grid(row=11, column=3)
这是我在堆栈溢出的第一篇文章。如果我在第一次尝试时没有完全遵循所有的指导方针,我会提前道歉。谢谢你的耐心。
发布于 2022-01-14 22:30:05
首先,我没有问题抓取显示我的桌面,但它显示了一个不适当的裁剪图像。
我找到了一个麻烦的解决办法。问题似乎与决议有关。所以尺寸需要一些缩放。
我所做的就是从ImageGrab.grab().save(full_file_name)
(不剪切)获得输出,并测量所需图像区域的大小(以像素为单位)。这些维度将被称为x_pixels
和y_pixels
。
然后,我在屏幕单位的实际窗口上测量了同样的面积。我通过使用mac屏幕截图工具来实现这一点,它显示了一个区域的尺寸。然后,我将这些维度称为x_screen
和y_screen
。然后,我修改了您的屏幕截图功能如下。
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()
结果如下所示。这并不完美,但我相信,如果我更仔细地测量屏幕截图和窗口边界上的像素,缩放效果会得到改善。
发布于 2022-03-17 18:10:51
你有"Retina“显示器吗?ImageGrab没有考虑到它从Mac的screencapture
命令收集到的144个DPI图像。您可以通过将所有的x、y、x1、y1值乘以2来弥补这一点(但如果需要考虑Mac标题栏,您可能仍然会错过一点)。
或者,使用pyscreenshot
包(或者窃取它的代码.)。它使用screencapture
的“screencapture
”选项来获得图像的适当边界。工作在扩展监视器上,如我的,其中x-命令<0(因为它在主监视器的左边)。
https://stackoverflow.com/questions/70715792
复制相似问题