Cómo configurar una ventana tkinter a un tamaño constante

Estoy progtwigndo un pequeño juego con tkinter y brevemente, estoy atascado.

Tengo un tipo de menú de inicio, en el que hay dos botones y una etiqueta.

Si solo creo el marco, todo está bien, tiene el tamaño de 500×500 píxeles.

Quiero que el fondo no cambie cuando creo los botones y el labe, pero adapta el tamaño a cualquier cosa que haga. Aquí está mi código:

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() 

He buscado alrededor en stackoverflow y no conseguí nada útil! He encontrado solo una pregunta un poco similar a la mía, pero la respuesta no funcionó. Intenté esto:

(1) mw.resizable (ancho = Falso, altura = Falso)

No puedo imaginar cuál es el problema, estoy realmente desesperado.

Desactivas pack_propagate configurando pack_propagate(0)

Desactivar pack_propagate aquí básicamente dice que no permita que los widgets dentro del marco controlen su tamaño. Así que ha establecido que el ancho y el alto sean 500. Desactivar las imágenes fijas de propagación permite que tenga este tamaño sin que los widgets cambien el tamaño del marco para llenar sus respectivos anchos / alturas, que es lo que sucedería normalmente

Para desactivar el cambio de tamaño de la ventana raíz, puede establecer root.resizable(0, 0) , donde se permite el cambio de tamaño en las direcciones x e y respectivamente.

Para establecer un tamaño máximo en la ventana, como se indica en la otra respuesta, puede configurar el atributo de minsize o el minsize aunque puede configurar la geometría de la ventana raíz y luego desactivar el tamaño. Un poco más flexible imo.

Siempre que establezca la grid o el pack en un widget, devolverá None . Por lo tanto, si desea poder mantener una referencia al objeto del widget, no debe configurar un variabe para un widget en el que está llamando a la grid o al pack . En su lugar, debe configurar la variable para que sea el widget Widget(master, ....) y luego, en su lugar, el pack llamadas o la grid en el 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 desea que una ventana en su conjunto tenga un tamaño específico, puede darle el tamaño que desee con el comando de geometry . Eso es realmente todo lo que necesitas hacer.

Por ejemplo:

 mw.geometry("500x500") 

Sin embargo, también querrá asegurarse de que los widgets dentro de la ventana cambian de tamaño correctamente, así que cambie la forma en que agrega el marco a esto:

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

Hay 2 soluciones para su problema:

  1. O bien se establece un tamaño fijo de la ventana Tkinter; mw.geometry('500x500')

      OR 
  2. Haga que el Marco se ajuste automáticamente al tamaño de la ventana; back.place(x = 0, y = 0, relwidth = 1, relheight = 1)

* La segunda opción debe usarse en lugar de back.pack()

Pruebe parent_window.maxsize(x,x); para establecer el tamaño máximo. No debería boost de tamaño incluso si establece el fondo, etc.

Edición: use parent_window.minsize(x,x) también para configurarlo en un tamaño constante!