-1

I'm using tkinter as a way to layout information in a weather app. As the information changes so does the layout. Each time the script runs I need to save an image of the window as a png, if possible have the image cropped down to remove the title bar.

Here is my watered down code:

from tkinter import *
import tkinter as tk

#Values hardcoded for testing
Temperature = "87°F"
Alert = "Weather Alert"
Sky = "Sunny"
Humidity = "45%"

#Build Window
root = Tk()
root.title("Weather App")
root.geometry("500x200+200+200")
root.resizable(False,False)

#Label Text
weather = Label(root, text = "Today's Weather")
weather.config(font =("Helvetica", 14))

Weather_Sky = Label(root, text=Sky, font=("Helvetica", 15, 'bold'))
Weather_Sky.place(x=300, y=50)

Weather_Temp = Label(root, text=Temperature, font=("Helvetica", 15, 'bold'))
Weather_Temp.place(x=300, y=75)

Weather_Humidity = Label(root, text=Humidity + " Humidity", font=("Helvetica", 15, 'bold'))
Weather_Humidity.place(x=300, y=100)

Weather_Alert = Label(root, text=Alert, font=("Helvetica", 15, 'bold'), fg='#f00')
Weather_Alert.place(x=300, y=125)

weather.pack()
root.mainloop()

Most of what I find online deals with a tkinter canvas, I don't if I need to add that to my code or if a solution exists without dealing with a canvas.

I'm expecting a single .png file of my tkinter window saved in the same directory as my .py file.

Richard B
  • 27
  • 5
  • Does this help? [How to save a tkinter canvas as an image](https://stackoverflow.com/questions/72459847/how-to-save-a-tkinter-canvas-as-an-image) – Ryan Jun 22 '23 at 19:06
  • If you don't want a Canvas, you could use some screenshot PIL thing most likely. I found this link: [Saving screen-shot of tkinter window as image](https://www.physicsforums.com/threads/saving-screen-shot-of-tkinter-window-as-image.999983/) – Ryan Jun 22 '23 at 19:10

1 Answers1

1

The PIL library has a module named ImageGrab, and allows the user to take a picture of the screen. So you could make a function that gets that gets the image like so:

import tkinter as tk
# import PIL
from PIL import ImageGrab

window = tk.Tk()
window.title("Hello world")
window.geometry("300x300")

# function to save window as image
def capture_window():
    x = window.winfo_rootx()
    y = window.winfo_rooty()
    width = window.winfo_width()
    height = window.winfo_height()    #get details about window
    takescreenshot = ImageGrab.grab(bbox=(x, y, width, height))
    takescreenshot.save("screenshot.png")

hello = tk.Label(text="Hello world!")
hello.pack()
button = tk.Button(text="Click me!")
button.pack()
screenshot = tk.Button(window, text="Screenshot", command=capture_window)
screenshot.pack()                  # button to take screenshot
tk.mainloop()

If you need it to call it without a button, you could wait 1 second so that the window probably fully loaded:

...
window.after(1000, capture_window)
...

Or even better, wait till the window has signaled it's done loading:

...
window.wait_visibility()
window.update()
capture_window()
...