Python 将标签的Tkinter窗口保存到图像文件

Python 将标签的Tkinter窗口保存到图像文件,python,tkinter,Python,Tkinter,我希望创建一个Tkinter框架或画布,然后将其保存为图像文件(postscript以外的文件)。框架主要是标签。我在其他地方找到的所有其他方法都涉及到截图(使用ImageGrab或类似方法),但这种方法(见下面的MRE)实际上并没有拍摄画布的图像。它正在抓取画布的不完整部分和用户屏幕的其他部分。很明显,我的坐标有点问题,但最终,我想把整个东西保存为一个图像,而不必在屏幕上显示。因此,如果有办法完全避免截图,那将是理想的 我想要的结果是屏幕上弹出的Tkinter画布的.png(或gif或bmp)

我希望创建一个
Tkinter
框架
画布
,然后将其保存为图像文件(postscript以外的文件)。
框架
主要是
标签
。我在其他地方找到的所有其他方法都涉及到截图(使用
ImageGrab
或类似方法),但这种方法(见下面的MRE)实际上并没有拍摄画布的图像。它正在抓取画布的不完整部分和用户屏幕的其他部分。很明显,我的坐标有点问题,但最终,我想把整个东西保存为一个图像,而不必在屏幕上显示。因此,如果有办法完全避免截图,那将是理想的

我想要的结果是屏幕上弹出的Tkinter画布的.png(或gif或bmp)。谢谢

from tkinter import *
from PIL import Image, ImageGrab

class TestClass(Frame):
    def __init__(self, parent=None):
        self.parent = parent
        Frame.__init__(self)
        self.main = self.master
        self.f = Frame(self.parent)
        self.f.pack()
        self.can=Canvas(self.f)
        self.can.pack(side='left', fill='both', expand=True)
        
        (Label(self.can, text='Hi there', width=15)
            .grid(column=0, row=0, padx=10, pady=10))
        (Label(self.can, text='Do not panic', width=15)
            .grid(column=0, row=2, padx=10, pady=10))
        (Label(self.can, text='Count the heads!', width=15)
            .grid(column=0, row=3, padx=10, pady=10))
        
        self.can.update()
        x=self.can.winfo_rootx()+self.can.winfo_x()
        y=self.can.winfo_rooty()+self.can.winfo_y()
        x1=x+self.can.winfo_width()
        y1=y+self.can.winfo_height()
        box=(x,y,x1,y1)
        
        print(box)
        grabcanvas = ImageGrab.grab(bbox=box)
        grabcanvas.show()
        grabcanvas.save('test.png')
        

if __name__ == '__main__':
    root=Tk()
    ui = TestClass(root)
    ui.pack()
    root.mainloop()

如果要将文本表格另存为图像而不显示,则需要将其放入
matplotlib
表格
,然后隐藏绘图ax。如果我想变得更有趣,我会使用一些其他的
matplotlib
文本功能,但下面的示例就是为了达到这个目的

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

txt = ['Hi there', 'Do not panic', 'Count the heads!', 
        'Milliways', 'Mosty Harmless']

df_data = {'Text': txt,
            'Numbers':np.random.randint(1, 10, 5)}

df = pd.DataFrame(data=df_data)
fig, ax = plt.subplots()

table = ax.table(cellText=df.values, 
                colLabels=df.columns, 
                loc='upper center')

ax.axis('off')
fig.savefig('test.png')

你的代码对我来说很好。