Как выбрать координату рамки tkinter? - PullRequest
1 голос
/ 30 октября 2019

Я экспериментирую с Tkinter, так как пытался разместить рамки деревьев. Две рамки должны быть расположены рядом: красная и синяя. (см. изображение кадра ). Я помещаю эти два фрейма с этими istructions:

redFrame = tk.Frame(master=masterFrame, bg='red')
redFrame.pack_propagate(0)
redFrame.pack(fill='both', side='left', expand='True')

blueFrame = tk.Frame(master=masterFrame, bg='blue')
destFrame.pack_propagate(0)
destFrame.pack(fill='both', side='right', expand='True')

Теперь я хочу поместить еще один (зеленый) фрейм внутри красного, расположенного на левой стороне основного интерфейса:

greenFrame = tk.Frame(master=masterFrame, width=100, height=100, bg='green')
greenFrame.pack_propagate(0)
greenFrame.pack(side='bottom', padx=0, pady=0)

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

Если я изменю параметр padx, ничего не изменится.

Если я изменю параметр pady, рамка изменит свою позицию Y. Почему это не связано с позицией X?

1 Ответ

1 голос
/ 30 октября 2019

Виджеты будут по умолчанию центрированы в выделенном им пространстве внутри контейнера.

Ваш код на данный момент не работает, поэтому я изменил его на это (я думаю, что он имитирует то, что выговоря, что у вас в данный момент есть):

import tkinter as tk

root = tk.Tk()
root.geometry("600x400")

redFrame = tk.Frame(root, bg='red')
redFrame.pack_propagate(0)
redFrame.pack(fill='both', side='left', expand='True')

blueFrame = tk.Frame(root, bg='blue')
blueFrame.pack_propagate(0)
blueFrame.pack(fill='both', side='right', expand='True')

greenFrame = tk.Frame(redFrame, width=100, height=100, bg='green')
greenFrame.pack_propagate(0)
greenFrame.pack(side='top', padx=0, pady=0)

root.mainloop()

Если вы запустите этот код, greenFrame появится, как показано на вашем изображении, вверху и по центру внутри redFrame.

Если выЕсли greenFrame появится в верхнем левом углу redFrame, вы можете изменить опорную точку кадра:

greenFrame = tk.Frame(redFrame, width=100, height=100, bg='green')
greenFrame.pack_propagate(0)
greenFrame.pack(side='top', padx=0, pady=0, anchor='w')

Это потому, что когда вы делаете side="top", используя пакет, виджет выделяетсяцелая полоса горизонтального пространства. По умолчанию он центрируется в этом пространстве:

Image showing side=top

Если вы сделаете side="left", тогда виджет будет выделен целой полосой вертикального пространства, ипо умолчанию он центрируется в этом пространстве.

Image showing side=left

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

Это код, который достигает того, что (я думаю) вы хотите:

import tkinter as tk

root = tk.Tk()
root.geometry("600x400")

redFrame = tk.Frame(root, bg='red')
redFrame.pack_propagate(0)
redFrame.pack(fill='both', side='left', expand='True')

blueFrame = tk.Frame(root, bg='blue')
blueFrame.pack_propagate(0)
blueFrame.pack(fill='both', side='right', expand='True')

greenFrame = tk.Frame(redFrame, width=100, height=100, bg='green')
greenFrame.pack_propagate(0)
greenFrame.pack(side='top', padx=0, pady=0, anchor='w')

root.mainloop()
...