web-dev-qa-db-fra.com

Comment définir une fenêtre tkinter à une taille constante

Je programme un petit jeu avec tkinter et brièvement, je suis coincé.

J'ai un genre od de menu de démarrage, dans lequel se trouvent deux boutons et une étiquette.

Si je crée juste le cadre, tout va bien, il a la taille 500x500 pixels

Je veux que l'arrière-plan ne change pas lorsque je crée les boutons et le labe, mais cela adapte la taille quoi que je fasse. Voici mon code:

import tkinter as tk

def startgame():
    pass

mw = tk.Tk()              #Here I tried (1)
mw.title('The game')

back = tk.Frame(master=mw, width=500, height=500, bg='black')
back.pack()

go = tk.Button(master=back, text='Start Game', bg='black', fg='red',
                     command=lambda:startgame()).pack()
close = tk.Button(master=back, text='Quit', bg='black', fg='red',
                     command=lambda:quit()).pack()
info = tk.Label(master=back, text='Made by me!', bg='red',
                         fg='black').pack()

mw.mainloop()

J'ai fait des recherches sur stackoverflow et je n'ai rien trouvé d'utile!… J'ai trouvé une question semblable à la mienne mais la réponse n'a pas fonctionné. J'ai essayé ceci:

(1) mw.resizable (largeur = Faux, hauteur = Faux)

Je ne peux pas imaginer quel est le problème, je suis vraiment désespéré.

13
Mr. Squiddy

Vous désactivez pack_propagate en définissant pack_propagate(0)

En désactivant pack_propagate ici, vous ne devez pas laisser les widgets à l'intérieur du cadre contrôler sa taille. Vous avez donc réglé la largeur et la hauteur sur 500. Désactiver la propagation d'images fixes lui permet d'être de cette taille sans que les widgets ne modifient la taille du cadre pour remplir leur largeur/hauteur respective, ce qui se produirait normalement

Pour désactiver le redimensionnement de la fenêtre racine, vous pouvez définir root.resizable(0, 0), où le redimensionnement est autorisé dans les directions x et y, respectivement.

Comme indiqué dans l'autre réponse, vous pouvez définir l'attribut maxsize ou minsize, mais vous pouvez simplement définir la géométrie de la fenêtre racine, puis désactiver le redimensionnement. Un peu plus souple imo.

Chaque fois que vous définissez grid ou pack sur un widget, il retournera None. Par conséquent, si vous souhaitez pouvoir conserver une référence à l'objet widget, vous ne devez pas définir de variable pour un widget sur lequel vous appelez grid ou pack. Vous devez plutôt définir la variable comme étant le widget Widget(master, ....), puis appeler pack ou grid sur le widget.

import tkinter as tk

def startgame():

    pass

mw = tk.Tk()

#If you have a large number of widgets, like it looks like you will for your
#game you can specify the attributes for all widgets simply like this.
mw.option_add("*Button.Background", "black")
mw.option_add("*Button.Foreground", "red")

mw.title('The game')
#You can set the geometry attribute to change the root windows size
mw.geometry("500x500") #You want the size of the app to be 500x500
mw.resizable(0, 0) #Don't allow resizing in the x or y direction

back = tk.Frame(master=mw,bg='black')
back.pack_propagate(0) #Don't allow the widgets inside to determine the frame's width / height
back.pack(fill=tk.BOTH, expand=1) #Expand the frame to fill the root window

#Changed variables so you don't have these set to None from .pack()
go = tk.Button(master=back, text='Start Game', command=startgame)
go.pack()
close = tk.Button(master=back, text='Quit', command=mw.destroy)
close.pack()
info = tk.Label(master=back, text='Made by me!', bg='red', fg='black')
info.pack()

mw.mainloop()
20
Pythonista

Si vous voulez qu'une fenêtre dans son ensemble ait une taille spécifique, vous pouvez simplement lui donner la taille souhaitée avec la commande geometry. C'est tout ce que vous devez faire.

Par exemple:

mw.geometry("500x500")

Cependant, vous voudrez également vous assurer que les widgets à l'intérieur de la fenêtre sont correctement redimensionnés. Changez donc la façon dont vous ajoutez le cadre à ceci:

back.pack(fill="both", expand=True)
5
Bryan Oakley

Essayez parent_window.maxsize(x,x); pour définir la taille maximale. Il ne devrait pas s'agrandir même si vous définissez l'arrière-plan, etc.

Edit: utilisez également parent_window.minsize(x,x) pour le régler à une taille constante!

0
Sid Sahay