Сохранить окно ярлыков Tkinter в файл изображения

#python #tkinter

#python #tkinter

Вопрос:

Я надеюсь создать Tkinter Frame или Canvas , который впоследствии будет сохранен как файл изображения (что-то отличное от postscript). Это Frame будет в первую очередь Labels . Все остальное, что я нашел в другом месте на SO, включает в себя создание скриншота (с использованием ImageGrab или аналогичного), но этот метод (см. MRE ниже) на самом деле не создает изображение холста. Он захватывает неполные части холста и части других частей экрана пользователя. Очевидно, что это какая-то проблема с моими координатами, но, в конечном счете, я бы хотел просто сохранить все это в виде изображения без необходимости показывать его на экране вообще. Так что, если есть способ полностью избежать screengrab, это было бы идеально.

Мой желаемый результат — это .png (или gif или bmp) всплывающего на экране Tkinter canvas. Спасибо!

 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()
  

Комментарии:

1. Ваш код отлично работает для меня.

Ответ №1:

Если вы хотите сохранить текстовую таблицу в виде изображения, не отображая ее, переместите ее в a matplotlib table , а затем скройте ось графика. Если бы я хотел стать более популярным, я бы использовал некоторые другие 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')