tkinter: используя pack_forget, а затем снова pack (), он упаковывается в другом месте - PullRequest
0 голосов
/ 18 октября 2019

В моем понимании, используя менеджер pack (), каждый кадр помещается относительно положения других кадров в коде. Поэтому, если я сделаю:

frame1 = tk.Frame(root)
frame1.pack()

frame2 = tk.Frame(root)
frame2.pack()

frame3 = tk.Frame(root)
frame3.pack()

, тогда frame2 появится ниже / после frame1 и до frame3.

Моя проблема заключается в использовании функции frame2.pack_forget(),всякий раз, когда я снова делаю frame2.pack(), порядок не восстанавливается, но теперь у меня есть frame1, frame3, frame2, как если бы frame2 был последним pack.

Как я могу использовать pack_forget(), а затем pack() в том же месте, где он был создан?

1 Ответ

3 голосов
/ 18 октября 2019

Как я могу использовать pack_forget () и затем pack () в том же месте, где он был создан?

В широком смысле вы не можете. Сама природа pack заключается в том, что он размещает виджеты вдоль границы доступного пространства. При добавлении и удалении виджетов доступное пространство изменяется. Когда вы звоните pack_forget, tkinter забывает, где был виджет.

Как говорится, у pack есть варианты, чтобы помочь обойти это. Вы можете использовать опции before и after, чтобы вставить виджет до или после какого-либо другого виджета в порядке упаковки. Вы должны запомнить заказ. Например, вы можете сделать frame2.pack(before=frame3), чтобы вставить его до frame3.

Если вы хотите динамически скрывать и удалять виджеты, grid обычно является лучшим выбором, поскольку grid_remove заставит grid запомнить, где находился виджет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...