Как получить размер холста каждый раз, когда он меняет свой размер в python?

#python #tkinter

#питон #tkinter #python

Вопрос:

Я пытаюсь написать скрипт, который изменяет размер моего изображения в соответствии с размером холста. Вот мой код:

 from tkinter import *
import tkinter as tk
from tkinter import PhotoImage

root = tk.Tk()

canvas = tk.Canvas(root, bg="white", border=0)
canvas.pack(fill="both", expand=True)

HH = canvas.winfo_reqheight()
WW = canvas.winfo_reqwidth()

print(HH,WW)

img = PhotoImage(file="competeButton.png", master=root)
img = img.zoom(2,2)
panel = Label(canvas, image=img, borderwidth=0)
panel.pack(side="bottom", fill="both", expand="yes")
root.mainloop()
  

Как вы можете видеть, он устанавливает размер кнопки в соответствии с исходным размером окна. Но как мне обновить его в режиме реального времени? Я думаю, что это может быть связано с img.zoom.

Заранее большое спасибо за любую помощь.

Ответ №1:

Вы можете привязать функцию к <Configure> событию виджета.

Вот пример, который печатает размер холста всякий раз, когда он меняется:

 import tkinter as tk

def canvas_changed(event):
    canvas.itemconfigure("dimensions", text=f"{event.width}x{event.height}")

root = tk.Tk()
canvas = tk.Canvas(root)
foo = canvas.create_text(10, 10, anchor="nw", text="foo", tags=("dimensions",))
canvas.bind("<Configure>", canvas_changed)

canvas.pack(fill="both", expand=True)

root.mainloop()
  

Комментарии:

1. Большое вам спасибо. У вас есть представление о том, как я могу сохранить измененную ширину и высоту в переменной?

2. @Haversine: Я не понимаю, что вы имеете в виду. Там нет ничего особенного. вам нужно сделать, просто сохраните его в переменной, как и все остальное. Вы можете либо сохранить то, что находится в event.width , либо результат canvas.winfo_width() .

3. Я имею в виду, что, сохраняя его в переменной, я устанавливаю значение widht во что-то вроде «WW». таким образом, WW всегда будет содержать обновленную ширину окна

4. @Haversine: вы переоцениваете это. global WW; WW=canvas.winfo_width() приведет WW к тому, что у вас всегда будет текущая ширина.