2016-04-12 3 views
2

Я программирую небольшую игру с 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 (ширина = False, высота = False)

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

+1

BTW, не цепь '.pack' на виджет конструкторы, как это! '.pack' возвращает' None', поэтому вы назначаете 'None'' go', 'close' и' info'. Определите виджеты, затем установите их, как вы делали с 'back'. См. Http://stackoverflow.com/questions/21592630/why-do-my-tkinter-widgets-get-stored-as-none –

ответ

7

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

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

To выключите изменение размера корневого окна, вы можете установить 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'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() 
+0

Где? Я довольно noobish! –

+0

Это дает мне эту ошибку: 'AttributeError: объект 'Frame' не имеет атрибута 'pack_propogate'' –

+0

Он сделал это Я просто набрал его неправильно (копирую + вставлял его) –

0

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

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

+0

Я не хочу, чтобы это было немного меньше, чем что-либо, кроме постоянного размера. –

+0

Отмечено. Я редактировал свой пост. –

3

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

Например:

mw.geometry("500x500") 

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

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

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

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

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

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

Смежные вопросы