#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')