Я только изучаю, как сделать графический интерфейс с помощью tkinter. Кажется, есть много ресурсов о том, как создавать новые кадры, но я не могу найти ничего, что объясняет, как на самом деле добавлять вещи в несколько кадров, не сталкиваясь с проблемами.
У меня есть ноутбук, так как я использую несколько вкладок для просмотра двух разных кадров, которые использую. Мертвая, простая, 2 кнопки в первом фрейме, одна скрывает вторую вкладку, а другая кнопку показывает вторую вкладку. На второй вкладке находится второй кадр. Все работает нормально, но как только я помещаю что-либо во второй кадр, оба кадра уменьшаются. Код ниже:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title('Tabs')
root.geometry("500x500")
my_notebook = ttk.Notebook(root)
my_notebook.pack(pady=15)
def hide():
my_notebook.hide(1)
def show():
my_notebook.add(my_frame2, text = "Red Tab")
my_frame1= Frame(my_notebook, width=500, height=500, bg = "blue")
my_frame2= Frame(my_notebook, width=500, height=500, bg = "red")
my_frame1.pack(fill = "both", expand=1)
my_frame2.pack(fill = "both", expand=1)
my_notebook.add(my_frame1, text = "Blue Tab")
my_notebook.add(my_frame2, text = "Red Tab")
my_button = Button(my_frame1, text = "Hide Tab2", command=hide).grid(row=0, column=0)
my_button2 = Button(my_frame1, text = "Show Tab2", command=show).grid(row=1, column=1)
my_button3 = Button(my_frame2, text = "Random button").grid(row=1, column=1)
root.mainloop()
Когда my_button3 удален, все выглядит нормально. Когда это в коде, все сжимается. Кто-нибудь знает, что я делаю, что вызывает это?
В tkinter, когда у кадра нет дочерних элементов, он занимает все пространство, с которым инициализируется. Однако, когда вы добавляете к нему некоторые дочерние виджеты, требуется только необходимое пространство для размещения дочерних элементов.
В вашем коде, когда вы добавляете my_button3
к my_frame2
, он сжимается, чтобы вместить кнопку.
Раньше, когда вы не добавляли кнопку во второй кадр, блокнот имел правильный размер, хотя для my_frame1
не требовалось все пространство, потому что my_frame2
все еще было пусто. my_frame2
определился с размером блокнота.
Итак, прямым решением вашей проблемы будет:
my_frame1.grid_propagate(False)
ИЛИ
my_frame2.grid_propagate(False)
grid_propagate
?По сути, это говорит фрейму распространяться/не распространяться в зависимости от его дочерних элементов. (Истина = распространение [по умолчанию])
Подобно grid_propagate
, есть также pack_propagate
. Правильный метод зависит от диспетчера геометрии, используемого для добавления дочерних элементов в кадр. (не менеджер геометрии, используемый для добавления фрейма к его родителю)
Однако использование grid_propagate
и pack_propagate
обычно не рекомендуется, потому что вы жестко кодируете управление пространством. Tkinter хорош в изменении размера родителя в соответствии с его дочерними виджетами. В большинстве случаев благодаря этому весь графический интерфейс выглядит хорошо с правильными пропорциями.
Оно сжимается, чтобы соответствовать следующей строке/столбцу ячеек, в которых присутствует
my_button3
, попробуйте немного увеличить окно.