Как центрировать виджет tkinter в липкой рамке



Я пишу игру в python3, используя tkinter, и у меня есть небольшая проблема с тем, чтобы заставить сетку делать то, что я хочу. Я просмотрел по крайней мере пять страниц результатов google, включая ответы переполнения стека для каждого варианта того, как задать этот вопрос, который я могу придумать. В конце концов я просто сдался и создал этот аккаунт, чтобы спросить об этом.



Что у меня есть: кнопка (newGameButton) и метка (messageBox), центрированная в кадре (верхняя панель) который сам по себе центрирован, но не охватывает все окно (contentFrame) по горизонтали.



Лучшее, что мне удалось получить (поместив sticky=W+E на верхнюю панель): рамка теперь охватывает все окно, кнопка и ярлык остаются того же размера (липкий на ярлыке ничего не сделал, а липкий на кнопке только сделал его таким же широким, как ярлык) и теперь прилипают к левой стороне верхней панели.



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



Причина, по которой верхняя панель является columnspan=23, заключается в том, что остальная часть содержимого фрейма имеет ширину 23 столбца (включая столбец 0).
Причина, по которой у меня есть кнопка и метка в рамке, заключается в том, что я хотел бы, чтобы вся коробка, окружающая их, имела эффект границы.



Код:



self.contentFrame = Frame(self.root)
self.contentFrame.grid(row=0, column=0)
self.topBar = Frame(self.contentFrame, border=2, relief=RAISED)
self.topBar.grid(row=0, column=0, columnspan=23)
self.newGameButton = Button(self.topBar, text="New Game")
self.newGameButton.grid(row=0, column=0)
self.messageBox = Label(self.topBar, textvariable=self.message, height=2)
self.messageBox.grid(row=1, column=0, sticky=W+E)


У кого-нибудь есть какие-нибудь идеи? Сейчас я в полном отчаянии.
699   2  

2 ответов:

Проблема в том, что ни одна из ваших колонок не имеет веса. Именно атрибут веса определяет, какие столбцы (и строки) получают дополнительное пространство. Поскольку ни одна из ваших колонн не имеет ненулевого веса, им не выделяется дополнительное пространство, поэтому они остаются настолько маленькими, насколько это возможно.

Как правило, вы должныВсегда давать по крайней мере одной строке и одному столбцу в кадре ненулевой вес. В вашем случае придание строке 0 и столбцу 0 веса 1 для всех фреймов, по-видимому, приводит к работа:

self.root.grid_columnconfigure(0, weight=1)
self.root.grid_rowconfigure(0, weight=1)
self.contentFrame.grid_columnconfigure(0, weight=1)
self.contentFrame.grid_rowconfigure(0, weight=1)
self.topBar.grid_columnconfigure(0, weight=1)
self.topBar.grid_rowconfigure(0, weight=1)

С помощью "как сделать Tkinter grid expand" в google я столкнулся с этой проблемой.

Цитата из Брайана Оукли

Строки и столбцы имеют "вес", который описывает, как они растут или сжимаются, чтобы заполнить дополнительное пространство в Мастере. По умолчанию строка или столбец имеют нулевой вес, что означает, что вы сказали метке >заполнить столбец, но не сказали столбцу заполнить главный кадр.

Чтобы исправить это, дайте столбцу вес.

class Test():
    def __init__(self,root):
        self.root = root
        self.root.columnconfigure(0, weight=1)
        self.root.config(bg='green')
        self.message = 'test message'

        self.contentFrame = Frame(self.root)
        self.contentFrame.config(background='black',borderwidth=5,relief ='sunken')
        self.contentFrame.grid(row=0, column=0, sticky='news')
        self.contentFrame.columnconfigure(0, weight=1)

        self.topBar = Frame(self.contentFrame, border=2, relief=RAISED)
        self.topBar.grid(row=0, column=0, columnspan=23,sticky=W+E)
        self.topBar.config(background='blue')
        self.topBar.columnconfigure(0, weight=1)

        self.newGameButton = Button(self.topBar, text="New Game")
        self.newGameButton.grid(row=0, column=0)
        self.newGameButton.config(background='red')

        self.messageBox = Label(self.topBar, text=self.message, height=2)
        self.messageBox.grid(row=1, column=0, columnspan=1,sticky=W+E)
        self.messageBox.config(background='yellow')

Test(root)

Comments

    Ничего не найдено.