Запретить сетке Tkinter динамически изменять размер ячеек

У меня есть класс Tkinter с сеткой в ​​нем, каждая из строк сетки должна иметь такой же вес, как указано в конфигурации строки, и содержимое сетки не должно влиять на размеры сетки, поскольку я отключил распространение.

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

class MainMenuPage(tkinter.Frame):
def __init__(self,parent,controller):
    tkinter.Frame.__init__(self,parent)
    self.controller=controller

    self.columnconfigure(0,weight=1)
    self.rowconfigure(0,weight=1)
    self.rowconfigure(1,weight=1)
    self.rowconfigure(2,weight=1)
    self.rowconfigure(3,weight=1)
    self.grid_propagate(0);

    self.color0=tkinter.Frame(self,bg="#bd1e2b")
    self.color0.grid(column=0,row=0,sticky="nesw")

    self.color1=tkinter.Frame(self,bg="#1e1ebd")
    self.color1.grid(column=0,row=1,sticky="nesw")

    self.color2=tkinter.Frame(self,bg="#1ebd48")
    self.color2.grid(column=0,row=2,sticky="nesw")

    self.color3=tkinter.Frame(self,bg="#bdb81e")
    self.color3.grid(column=0,row=3,sticky="nesw")

    image=Image.open("/path/settingsIcon.png")
    image=image.resize((54,54),Image.ANTIALIAS)
    self.settingsIcon=ImageTk.PhotoImage(image)
    self.settingsButton=tkinter.Button(self,compound=tkinter.TOP,width=54,height=54,image=self.settingsIcon,command=lambda:self.controller.showPage("valveMain"))
    self.settingsButton.grid(column=0,row=0,sticky="ne")

введите описание изображения здесь

Как предотвратить изменение размера сетки при добавлении кнопки?


person Mercury    schedule 21.09.2019    source источник
comment
Вы хотите установить строгие ограничения или хотите иметь решение, которое изменяет размер всех строк, если одна строка меняет высоту? Другими словами, цель - не позволять изменять размер строк или все строки должны быть одинакового размера? Я не понимаю, почему вы хотите, чтобы высота строки была меньше, чем в этой строке.   -  person Bryan Oakley    schedule 21.09.2019
comment
В том-то и дело, что кнопка не больше ряда. Но я в основном хочу установить строгие размеры, но я не хочу устанавливать их в абсолютных размерах, а в соотношениях (весе).   -  person Mercury    schedule 21.09.2019
comment
И я хочу, чтобы размер сетки изменялся относительно их родителя, а не его содержимого.   -  person Mercury    schedule 21.09.2019
comment
weight не для определения относительных размеров. Он предназначен для определения того, как выделить дополнительное пространство.   -  person Bryan Oakley    schedule 21.09.2019
comment
Итак, как мне получить таблицу, в которой каждой строке назначена одинаковая высота, и на нее не влияет содержимое   -  person Mercury    schedule 21.09.2019


Ответы (1)


Я не совсем понимаю, чего вы пытаетесь достичь. Если цель состоит в том, чтобы убедиться, что все строки и / или столбцы имеют одинаковый размер, вы можете настроить строки и столбцы, чтобы они были частью единой группы. weight сам по себе этого не сделает, потому что он только настраивает, как выделяется дополнительное пространство, но не контролирует абсолютный размер строки или столбца.

Чтобы создать однородную группу, используйте параметр uniform для row_configure и column_configure. Все строки или столбцы в одной однородной группе будут иметь одинаковый размер пропорционально их весу. Если их вес будет одинаковым, их размер будет таким же.

Из канонической документации tcl / tk:

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

В вашем случае вы можете попробовать что-то вроде этого:

self.rowconfigure(0,weight=1, uniform='row')
self.rowconfigure(1,weight=1, uniform='row')
self.rowconfigure(2,weight=1, uniform='row')
self.rowconfigure(3,weight=1, uniform='row')

Для получения дополнительной информации см. Алгоритм сетки в tcl / tk. документация. Он точно описывает, как работает алгоритм сетки.

person Bryan Oakley    schedule 21.09.2019