Как установить окно tkinter с постоянным размером

Я программирую небольшую игру с tkinter и кратко, я застрял.

У меня есть начальное меню вида, в котором находятся две кнопки и одна метка.

Если я просто создаю фрейм, все в порядке, он имеет размер 500x500 пикселей

Я хочу, чтобы фон не менялся при создании кнопок и лабиринта, но он меняет размер независимо от того, что я делаю. Вот мой код:

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

Я искал вокруг stackoverflow и не получил ничего полезного! Я нашел только один вопрос, немного похожий на мой, но ответ не сработал. Я пробовал это:

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

Я не могу представить, в чем проблема, я действительно в отчаянии.

Ответ 1

Вы выключаете pack_propagate, устанавливая pack_propagate(0)

Отключение pack_propagate здесь в основном говорит, не позволяйте виджетам внутри фрейма контролировать размер. Таким образом, вы установили его ширину и высоту в 500. Отключение распространения неподвижных изображений позволяет использовать этот размер без виджета, изменяющего размер кадра, чтобы заполнить их соответствующую ширину/высоту, что обычно будет

Чтобы отключить изменение размера корневого окна, вы можете установить root.resizable(0, 0), где изменение размера разрешено в направлениях x и y соответственно.

Чтобы установить maxsize в окно, как указано в другом ответе, вы можете установить атрибут maxsize или minsize, хотя вы можете просто установить геометрию корневого окна и затем отключить изменение размера. Немного более гибкое imo.

Всякий раз, когда вы устанавливаете grid или pack на виджет, он возвращает None. Итак, если вы хотите иметь возможность ссылаться на объект виджета, вы не должны устанавливать переменную для виджета, на котором вы вызываете grid или pack. Вместо этого вы должны установить переменную как виджет Widget(master, ....), а затем вместо этого вызвать pack или grid в виджетах.

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

Ответ 2

Если вы хотите, чтобы окно в целом имело определенный размер, вы можете просто указать его размер с помощью команды geometry. Это действительно все, что вам нужно сделать.

Например:

mw.geometry("500x500")

Тем не менее, вы также захотите убедиться, что виджеты внутри окна изменяются правильно, поэтому измените способ добавления к нему фрейма:

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

Ответ 3

Есть 2 варианта решения вашей проблемы:

  1. Либо вы устанавливаете фиксированный размер окна Tkinter; mw.geometry('500x500')

ИЛИ

  1. Сделайте так, чтобы рамка автоматически подстраивалась под размер окна; back.place(x = 0, y = 0, relwidth = 1, relheight = 1)

* Второй вариант следует использовать вместо back.pack()

Ответ 4

Попробуйте parent_window.maxsize(x,x); установить максимальный размер. Он не должен увеличиваться даже при установке фона и т.д.

Изменить: используйте parent_window.minsize(x,x), чтобы установить его в постоянный размер!