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é.
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()
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)
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!