मैं एक Tkinter Frame या Canvas बनाने की उम्मीद कर रहा हूं जो बाद में एक छवि फ़ाइल (पोस्टस्क्रिप्ट के अलावा कुछ और) के रूप में सहेजा जाता है। Frame मुख्य रूप से Labels होगा। एसओ पर मैंने जो कुछ भी पाया है, उसमें स्क्रीनशॉट लेना शामिल है (ImageGrab या इसी तरह का उपयोग करके), लेकिन यह विधि (नीचे एमआरई देखें) वास्तव में कैनवास की छवि नहीं ले रही है। यह कैनवास के अधूरे हिस्से और उपयोगकर्ता की स्क्रीन के अन्य हिस्सों के हिस्सों को पकड़ रहा है। जाहिर है कि यह मेरे निर्देशांक के साथ किसी प्रकार की समस्या है, लेकिन आखिरकार, मैं पूरी चीज को एक छवि के रूप में सहेजना चाहता हूं, इसे स्क्रीन पर बिल्कुल भी दिखाना आवश्यक नहीं है। तो अगर पूरी तरह से स्क्रेंग्रैब से बचने का कोई तरीका है, तो यह आदर्श होगा।

मेरा वांछित परिणाम ऑन-स्क्रीन टिंकर कैनवास का एक .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()
0
Tom 2 नवम्बर 2020, 16:58

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप टेक्स्ट की तालिका को बिना प्रदर्शित किए एक छवि के रूप में सहेजना चाहते हैं, तो उसे 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')
0
Tom 3 नवम्बर 2020, 15:22