web-dev-qa-db-fra.com

Comment définir une taille de fenêtre minimale dans tkinter?

D'après ce que je comprends, après avoir initialisé tous les cadres et widgets dans le __init__, la fenêtre tkinter est redimensionnée pour s'adapter à tous ces composants.

Je voudrais définir la taille initialisée de la fenêtre comme étant sa taille minimale. Je veux pouvoir agrandir et agrandir la fenêtre, mais je ne veux jamais que la fenêtre soit suffisamment petite pour commencer à cacher les widgets.

Comment est-ce que j'accomplis ceci?

24
Jace Browning

Vous pouvez également forcer une mise à jour immédiatement sans entrer dans votre boucle principale, en utilisant quelque chose comme ceci:

root = Tk()
# set up widgets here, do your grid/pack/place
# root.geometry() will return '1x1+0+0' here
root.update()
# now root.geometry() returns valid size/placement
root.minsize(root.winfo_width(), root.winfo_height())

Description de pdate () sur effbot tkinterbook:

Traite tous les événements en attente, appelle les rappels d'événements, termine la gestion de la géométrie en attente, redessine les widgets si nécessaire et appelle toutes les tâches inactives en attente. Cette méthode doit être utilisée avec précaution, car elle peut conduire à des conditions de course vraiment désagréables si elle est appelée au mauvais endroit (à partir d'un rappel d'événement, par exemple, ou à partir d'une fonction qui peut de toute façon être appelée à partir d'un rappel d'événement, etc. .). En cas de doute, utilisez plutôt update_idletasks.

Je l'ai beaucoup utilisé tout en essayant de comprendre comment faire des choses comme obtenir la taille/position des widgets avant de sauter dans la boucle principale.

41
John Gaines Jr.

Je sais que cette question est ancienne, mais voici une autre façon:

root = Tk()
root.minsize(foo, bar)

root.minsize () définit la taille minimale des fenêtres sur foo et bar , où foo et bar sont les largeur et hauteur de la fenêtre, respectivement.

Vous devez cependant mettre ce code à exécution avant que votre boucle principale ait fini de fonctionner. Il ne prendra effet qu'après l'appel de la commande.

17
Aedon

Je l'ai compris:

def __init__(self, master):
    ...
    self.master.update_idletasks()
    self.master.after_idle(lambda: self.master.minsize(self.master.winfo_width(), self.master.winfo_height()))
2
Jace Browning