Я вижу много вопросов к tkinter, которые довольно часто задают не об ошибках в их коде, а спрашивают, как мне организовать свой графический интерфейс. Итак, я хотел бы получить ответ, который сосредоточит внимание на этом и поможет новичкам немного сориентироваться.
Переведено автоматически
Ответ 1
Базовые знания об управлении геометрией tkinters
Управление геометрией в tkinter характеризуется этой цитатой здесь:
По умолчанию на экране отображается окно верхнего уровня в его естественном размере, который определяется внутренне его виджетами и менеджерами геометрии.
Команда pack используется для взаимодействия с упаковщиком, менеджером геометрии, который упорядочивает дочерние элементы родительского элемента, упаковывая их по порядку по краям родительского элемента.
-> Я использую pack, чтобы быстро расположить несколько виджетов рядом друг с другом в master.
The placer - это менеджер геометрии для Tk. Он обеспечивает простое фиксированное размещение окон, при котором вы указываете точный размер и расположение одного окна, называемого подчиненным, внутри другого окна, называемого ведущим. Placer также предоставляет размещение на резиновом листе, где вы указываете размер и расположение подчиненного устройства в терминах размеров ведущего устройства, так что подчиненное устройство изменяет размер и расположение в ответ на изменения размера ведущего устройства. Наконец, placer позволяет вам смешивать эти стили размещения так, чтобы, например, подчиненный элемент имел фиксированную ширину и высоту, но был центрирован внутри главного элемента.
-> Иногда я использую place для приложений на одном листе или для установки фонового изображения.
Команда grid используется для взаимодействия с grid geometry manager, который упорядочивает виджеты по строкам и столбцам внутри другого окна, называемого geometry master (или главное окно).
-> Grid - лучший выбор для более сложных приложений, содержащих множество виджетов.
Итак, вопрос, на который вам нужно ответить здесь, прежде чем выбрать один из этих менеджеров, заключается в том, как мне наилучшим образом организовать свое приложение?
Предупреждение: Никогда не смешивайте grid и pack в одном главном окне. Tkinter с радостью проведет остаток вашей жизни, пытаясь согласовать решение, которое устраивало бы обоих менеджеров. Вместо ожидания завершите работу приложения и еще раз взгляните на свой код. Распространенной ошибкой является использование неправильного родительского элемента для некоторых виджетов.
-> You can create a nested layout, in each master(window/frame) you've freedom of choice
Most important features
Most important features of each manger can help to answer your question. Because you will need to know if the manager can do what you wanna do.
For pack I think it is:
fillstretch the slave horizontally, vertically or both
expandThe slaves should be expanded to consume extra space in their master.
sideSpecifies which side of the master the slave(s) will be packed against.
anchorit specifies where to position each slave in its parcel.
For place it should be:
relheight-relheight=1.0, -height=-2 makes the slave 2 pixels shorter than the master.
relwidth-relwidth=1.0, -width=5 makes the slave 5 pixels wider than the master.
relx-relx=0.5, -x=-2 positions the left edge of the slave 2 pixels to the left out of the center.
rely-rely=0.5, -x=3 positions the top edge of the slave 3 pixels below the center of its master.
And for grid it should be:
columnspanInsert the slave so that it occupies n columns in the grid.
rowspanInsert the slave so that it occupies n rows in the grid.
stickythis option may be used to position (or stretch) the slave within its cell.
grid_removethe configuration options for that window are remembered
##display_green display.grid(column = 0, row = 0, columnspan=3) display.pack_propagate(0) #when using pack inside of the display #display.grid_propagate(0) #when using grid inside of the display
#left b =tk.Button(display, width =10,text='b') b1 =tk.Button(display, width =10,text='b1')
b.pack(side='left') b1.pack(side='left') #right b2 =tk.Button(display, width =20,text='b2') b2.pack(side='right') #center l = tk.Label(display, text ='My_Layout',bg='grey') l.pack(fill='both',expand=1)
#the order by using pack can be important. #you will notice if you swip right with center.