Source code for GUIBRUSHR.GUI.WIDGET.MyImage
from tkinter import Frame, Label, Canvas, NW
from typing import Any, Dict, Optional
from PIL import Image, ImageTk
[docs]
class MyImage(Frame):
"""
A custom image widget that displays images in a Frame.
This class creates an image display widget that can show images either using a Label
or a Canvas widget, depending on the configuration. The image is automatically resized
to fit the specified dimensions.
Attributes:
width (int): Width of the image display area
height (int): Height of the image display area
image (PhotoImage): The tkinter PhotoImage object
canvas (Optional[Canvas]): The Canvas widget if label=False
"""
[docs]
def __init__(
self,
parent: Any,
row: int,
column: int,
width: int,
height: int,
path_image: str,
columnspan: int = 2,
rowspan: int = 1,
label: bool = False,
**kwargs
) -> None:
"""
Initialize the MyImage widget.
Args:
parent: The parent widget
row: Row position in the parent's grid
column: Column position in the parent's grid
width: Width of the image display area
height: Height of the image display area
path_image: Path to the image file to display
columnspan: Number of columns the widget should span
rowspan: Number of rows the widget should span
label: If True, use Label widget; if False, use Canvas widget
**kwargs: Additional keyword arguments passed to the Frame widget
"""
super().__init__(
parent,
bg="#FFFFFF",
width=width,
height=height,
highlightbackground="black",
highlightthickness=1,
padx=5,
pady=2,
**kwargs,
)
self.width = width
self.height = height
# Open, resize, and create the PhotoImage object
self.image = ImageTk.PhotoImage(
Image.open(path_image).resize((int(self.width), int(self.height)))
)
if label:
# Use a Label widget to display the image
label = Label(self, image=self.image)
label.image = self.image # keep a reference
label.pack()
else:
# Use a Canvas widget to display the image
self.canvas = Canvas(self, width=self.width, height=self.height)
self.canvas.create_image(0, 0, anchor=NW, image=self.image)
self.canvas.pack()
# Grid the frame into the parent
self.grid(row=row, column=column, columnspan=columnspan, rowspan=rowspan)