Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set a tkinter window to a constant size

I'm programming a little game with tkinter and briefly, I'm stuck.

I have a kind od starting menu, in which are two buttons and one label.

If I just create the frame everything is fine, it has the size 500x500 pixels

I want the background not to change when I create the buttons and the labe, but it adapts the size whatever I do. Here is my 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() 

I've searched around on stackoverflow and didn't get anything useful! I've found just one question a bit similar to mine but the answer didn't work. I tried this:

(1) mw.resizable(width=False, height=False)

I can't imagine what is the problem, I'm really desperate.

like image 328
Mr. Squiddy Avatar asked Apr 12 '16 14:04

Mr. Squiddy


People also ask

Which is the correct way to set the size of a tkinter window?

Syntax: Here, height and width are in pixels. In Tkinter, minsize() method is used to set the minimum size of the Tkinter window. Using this method a user can set window's initialized size to its minimum size, and still be able to maximize and scale the window larger.

How do I stop tkinter from resizing?

Tkinter windows can be resized automatically by hovering and pulling over the window. We can disable the resizable property using the resizable(boolean value) method. We will pass false value to this method which will disable the window to be resized.

How do you change the window size in Python GUI?

Build A Paint Program With TKinter and Python Tkinter components adjust the window size and width according to user-defined geometry. In order to get the screen size, we can use winfo_screenwidth() which returns the screen width and winfo_screenheight() for the height of the screen in pixels.

How do I change frame size in tkinter?

The frame widget in Tkinter works like a container where we can place widgets and all the other GUI components. To change the frame width dynamically, we can use the configure() method and define the width property in it.


1 Answers

You turn off pack_propagate by setting pack_propagate(0)

Turning off pack_propagate here basically says don't let the widgets inside the frame control it's size. So you've set it's width and height to be 500. Turning off propagate stills allows it to be this size without the widgets changing the size of the frame to fill their respective width / heights which is what would happen normally

To turn off resizing the root window, you can set root.resizable(0, 0), where resizing is allowed in the x and y directions respectively.

To set a maxsize to window, as noted in the other answer you can set the maxsize attribute or minsize although you could just set the geometry of the root window and then turn off resizing. A bit more flexible imo.

Whenever you set grid or pack on a widget it will return None. So, if you want to be able to keep a reference to the widget object you shouldn't be setting a variabe to a widget where you're calling grid or pack on it. You should instead set the variable to be the widget Widget(master, ....) and then call pack or grid on the widget instead.

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() 
like image 187
Pythonista Avatar answered Sep 23 '22 17:09

Pythonista