Я хотел бы иметь динамический размер для основного окна tkinter, поэтому, когда вы добавляете новый виджет, вам не нужно менять размер окна. Вместо этого основное окно будет учитывать размер этого виджета и автоматически увеличивать его высоту/ширину, чтобы соответствовать этому виджету в окне.
masterWindow = Tk()
#Main Window min width
self.window_width = screen_width * .01
self.window_height = screen_height * .04
#Window startst in center of screen
self.window_start_x = (screen_width/2)
self.window_start_y = (screen_height/2)
masterWindow.geometry("%dx%d+%d+%d" % (self.window_width, self.window_height, self.window_start_x, self.window_start_y))
self.buttonsFrame.pack(side = TOP)
button_width = 13
button_height = 2
#A simple dict that stores script name strings
for script in SCRIPTS.keys():
#Remove script extension
script_name = script.split(".")[0]
button_width = 13
button_height = 2
BUTTONS[script] = Button(self.buttonsFrame, text = script, width = button_width, height = button_height, justify = LEFT, wraplength = 100, command = lambda s = script: self.runScript(s))
BUTTONS[script].grid(row = self.row, column = self.col)
self.update()
#Increment row and col and set new window size
if self.col == 2:
self.col = 0
self.row += 1
reached_max_width = True
else:
self.col += 1
if not reached_max_width:
self.window_width += button_width * 13
self.window_height = self.buttonsFrame.winfo_height() * (self.row*3)
masterWindow.geometry("%dx%d" % (self.window_width, self.window_height))
def runScript(self, script):
print(script)
Вы явно устанавливаете окно в определенный размер с помощью этой строки кода:
masterWindow.geometry("%dx%d" % (self.window_width, self.window_height))
Поскольку вы это делаете, tkinter будет поддерживать окно до такого размера, даже если вы добавляете виджеты. Если вы хотите, чтобы это было автоматически, вам нужно удалить эту строку кода.
Кроме того, если пользователь изменяет размер окна, tkinter попытается оценить этот размер. Если вы хотите, чтобы он автоматически изменял размер при добавлении новых виджетов, вам нужно будет удалить размер окна, чтобы tkinter мог его вычислить. Вы можете сделать это, вызвав masterWindow.geometry("")
.
Я нашел проблему. Проблема заключалась в том, что я устанавливал начальную ширину/высоту для mainWindow
Tkinter в блоке кода:
#Main Window min width
self.window_width = screen_width * .01
self.window_height = screen_height * .04
masterWindow.geometry("%dx%d+%d+%d" % (self.window_width, self.window_height, self.window_start_x, self.window_start_y))
Я удалил это определение размера и настройки из геометрии, чтобы код выглядел так, и он работал:
masterWindow.geometry("+%d+%d" % (self.window_start_x, self.window_start_y))
Теперь окно автоматически изменяет размер для учета всех кнопок.
self.window_start_x
&self.window_start_y
в своем ответе, потому что я действительно хотел определить, где будет появляться окно. Но это правильно. Удаление определения размера окна сделало окно динамически изменяющим размеры себя, когда виджет добавлен.