Bottom Page

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 [Tkinter] Resizing image inside Canvas (with Canvas' resize)
#1
The situation is next:
- I'm resizing window;
- Canvas widget is resizing too;
- PhotoImage inside Canvas stays the same size as it was.
How can I make it resize with the other widgets?

My code:
import tkinter as tk
from tkinter import ttk as tktw
import time
import socket
 
 
class Window(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry("640x480")
        self.minsize(width=640, height=480)
        self.fm = FrameMain(self, background="pink")
        self.fb = FrameBottom(self, background="lightblue")
        self.fl = FrameLeft(self.fm, background="yellow")
        self.fr = FrameRight(self.fm, background="green")
        self.fa = FrameAction(self.fr, background="orange")
        self.fc = FrameChat(self.fr, background="blue")
        self.tm = TopMenu(self)
        self.config(menu=self.tm)
        # self.ab = ActionBar(self.fa, width=0, height=0)
        # self.ai = ActionInfo(self.ab, width=0, height=0)
        # self.ab.add(self.ai, text="Info", state="normal")
        self.c = CanvasArea(self.fl, width=0, height=0)
 
 
class FrameMain(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH, expand=1)
 
 
class FrameLeft(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH, expand=1, side="left")
 
 
class CanvasArea(tk.Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH, expand=1)
 
 
class FrameRight(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH, expand=1, side="right")
 
 
class FrameChat(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH, expand=1, side="bottom")
 
 
class FrameAction(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH, expand=1, side="top")
 
 
class ActionBar(tktw.Notebook):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(expand=1, fill=tk.BOTH)
 
 
class ActionInfo(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH, expand=1)
 
 
class FrameBottom(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill=tk.BOTH)
        self.cb = ComboboxCommands(self, width=10, state="readonly")
        self.cl = CommandLine(self, relief="ridge", bd=2)
        self.bs = ButtonSend(self, text="Send", relief="ridge")
 
 
class ComboboxCommands(tktw.Combobox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(side="left", fill=tk.BOTH)
 
 
class CommandLine(tk.Entry):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(side="left", fill=tk.BOTH, expand=1)
 
 
class ButtonSend(tk.Button):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(side="right")
 
 
class TopMenu(tk.Menu):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.add_cascade(label="Menu")
 
 
if __name__ == "__main__":
    w = Window()
 
    imgsrc = tk.PhotoImage(file="images/img.gif")
    img = w.c.create_image(0, 0, anchor="nw", image=imgsrc)
 
    w.mainloop()
İmage
Quote
#2
Bind an event to the canvas to get its size , use PIL to resize the image.
import tkinter as tk
from PIL import Image, ImageTk


class MainFrame(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.canvas = tk.Canvas(self)
        self.canvas.pack(fill=tk.BOTH, expand=1)
        self.canvas.bind("<Configure>", self.resize)
        self.img = ImageTk.PhotoImage(
            Image.open(r"gui\110px-Python-logo-notext.svg.png")
        )
        self.canvas_img = self.canvas.create_image(0, 0, anchor="nw", image=self.img)

    def resize(self, event):
        img = Image.open(r"gui\110px-Python-logo-notext.svg.png").resize(
            (event.width, event.height), Image.ANTIALIAS
        )
        self.img = ImageTk.PhotoImage(img)
        self.canvas.itemconfig(self.canvas_img, image=self.img)


if __name__ == "__main__":
    main_frame = MainFrame()
    main_frame.mainloop()
Quote
#3
Thank you for help!
I'm sorry for the late answer. The resize event gave me an idea of handling layout in my application, so I've managed to solve the problem with it either. I've used place() method to get the result I want, I'll post it later in the layout's thread.
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  [Tkinter] Display Selected Image from Directory and Resize it EchoLi 0 80 Oct-02-2019, 06:54 PM
Last Post: EchoLi
  [Tkinter] Scrollbar doesn't work on Canvas in Tkinter DeanAseraf1 3 936 Sep-19-2019, 03:26 PM
Last Post: joe_momma
  [Tkinter] Scrollbars on canvas Christina 2 148 Sep-14-2019, 08:45 PM
Last Post: Christina
  [Tkinter] Plotting Raster Data / TIFF files on tkinter canvas RRSCNGP 0 135 Aug-28-2019, 04:44 AM
Last Post: RRSCNGP
  [PyQt] Window resizing help FesterJester 2 566 Jun-10-2019, 01:59 PM
Last Post: Denni
  [Tkinter] Fixate graphs on scrollable canvas janema 6 475 Apr-12-2019, 03:57 PM
Last Post: Larz60+
  [Tkinter] not resize a frame Scorpio 2 371 Mar-13-2019, 11:24 PM
Last Post: Scorpio
  [Tkinter] Adding graphics to canvas vangphucthinh 0 329 Jan-24-2019, 04:58 PM
Last Post: vangphucthinh
  Canvas refreshing problem Faruk 2 453 Dec-04-2018, 08:52 AM
Last Post: Faruk
  [PyQt] Resize button with window resize FesterJester 2 1,504 Dec-03-2018, 12:02 AM
Last Post: FesterJester

Forum Jump:


Users browsing this thread: 1 Guest(s)