2017-04-09 1 views
0

J'ai un programme qui change l'emplacement des objets sur un canvas tkinter, en fonction de la taille de la fenêtre. Cela fonctionne, mais il est exécuté à chaque boucle et ralentit considérablement le programme lorsqu'il y a beaucoup d'objets, car il les supprime et les redessine.Existe-t-il un moyen de vérifier les modifications dans les fenêtres Python Tk?

Existe-t-il un moyen de vérifier les changements dans la taille d'une fenêtre, afin qu'elle ne doive être exécutée qu'une fois, quand elle doit l'être?

Répondre

2

Lorsque les modifications de la taille de la fenêtre (et pour d'autres raisons), tkinter se déclenche un événement <Configure>. Vous pouvez lier à cet événement pour être averti lorsque le widget change de taille.

De la documentation officielle:

Un Configurer événement est envoyé à une fenêtre chaque fois que sa taille, la position ou les changements de largeur de la bordure, et parfois, quand il a changé la position dans l'ordre d'empilement.

Remarque: ceci est vrai pour tous les widgets, pas seulement pour la fenêtre racine. Par exemple, vous pouvez lier au widget canvas ou à tout autre widget.

Exemple:

import tkinter as tk 

root = tk.Tk() 
label = tk.Label(root, width=20) 
label.pack(side="top", fill="both", expand=True, padx=20, pady=20) 

def handle_configure(event): 
    text="window geometry:\n" + root.geometry() 
    label.configure(text=text) 

root.bind("<Configure>", handle_configure) 

root.mainloop() 

Vous devez faire attention de ne pas changer la taille du widget à partir de la fonction liée ou vous pouvez vous retrouver dans une boucle infinie que l'événement sera déclenché lorsque le widget redimensionne, qui redimensionne le widget, ce qui provoque le déclenchement de l'événement, ...

0

En fait, on peut utiliser w.winfo_height() méthode w.winfo_width() pour obtenir la hauteur et la largeur actuelle de w en pixels. (w peut être aucun widget de tout type.)

par exemple

from Tkinter import * 
w=Tk() 
w.geometry('400x600') 

w.update() 

print (w.winfo_width()) 
print (w.winfo_height())