Найти положение другого якоря, чем уже использованный якорь - PullRequest
0 голосов
/ 07 июня 2018

Я создал код, чтобы показать мою проблему.Это выглядит так:

userNameID = tkinter.Label(root, text="Name/ID")
userNameID.place(x=640, y=320, anchor="e")

userNameID = tkinter.Label(root, text="Password")
userNameID.place(x=640, y=360, anchor="e")

entButton = tkinter.Button(root, text="Enter", command=enterPrint)
entButton.place(x=640, y=400, anchor="w")

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

1 Ответ

0 голосов
/ 08 июня 2018

grid() и pack() являются «точными», достаточными для большинства потребностей.Вам просто нужно научиться правильно использовать эти менеджеры геометрии в полной мере.На самом деле использование place() - это почти никогда не то, что вам нужно.Он имеет свой случай использования, но это не лучший выбор для общих настроек графического интерфейса.Также очень сложно управлять обновлением вашего кода.

Обновление: чтобы ответить на ваш вопрос в комментариях:

Настройка строки означает, что вы помещаете каждую строку в 1 пиксель, потому чтовеса?Я знаю, что могу нарисовать сетку для всего этого, но я не знаю, сколько строк, столбцов в моей программе.поэтому я не могу найти центр.

Веса используются, чтобы сказать, что конкретная строка или столбец должны изменить размер в определенном соотношении по отношению к другим строкам и столбцам вокруг них в пределах той же сетки /контейнер.Вес по умолчанию равен нулю.Когда мы установим вес в 1, тогда размер строки или столбца изменится с окном с равномерной скоростью.

Возьмем пример кода:

import tkinter as tk

root=tk.Tk()

center_frame = tk.Frame(root)
center_frame.grid(row=1, column=1, sticky="nsew")

tk.Label(center_frame, text="Name/ID").grid(row=0, column=0)
tk.Label(center_frame, text="Password").grid(row=1, column=0)
tk.Button(center_frame, text="Enter").grid(row=2, column=1)

root.mainloop()

Результаты:

enter image description here enter image description here

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

Если мы добавим этот вес в программу root.rowconfigure(0, weight=1):

Тогда мы получим этот эффект:

enter image description here

Далее добавьте это root.rowconfigure(2, weight=1):

enter image description here

Следующее добавьте это root.columnconfigure(0, weight=1):

enter image description here

Далее добавьте root.columnconfigure(2, weight=1):

enter image description here

Как видно из приведенных изображений, в зависимости от того, для каких строк и столбцов вы установили вес, размер строк и столбцов изменится соответствующим образом.С помощью приведенного выше кода мы добьемся изменения размера строк 0 и 2 и изменения размеров столбцов 0 и 2.row 1 column 1 не изменит размер.Таким образом, это означает, что все, что мы помещаем в позицию row 1 column 1, не будет изменять размеры, а будет сохранять свое относительное расположение к границам.Поскольку мы устанавливаем виджет фрейма в положение row 1 column 1, а затем все наши виджеты внутри фрейма, мы фактически сделали row 1 column 1 центром.

Строк и столбцов столько, сколько вы скажете, чтобы они были,Tkinter автоматически отрегулирует общее количество строк и столбцов в зависимости от того, что вы говорите.Кроме того, он также сделает строки и столбцы, в которых ничего нет, нулевого размера.Это означает, что только строки и столбцы с содержимым (виджеты) будут фактически влиять на размер сетки.

Скажем, у нас есть 3 строки и 3 столбца.В зависимости от того, как мы его заполним, он изменит размер отображаемого текста.

В этом примере, где вы видите, X показывает, что мы помещаем что-то в следующие строки и столбцы.

InВ этом примере у нас есть что-то в (0,0), (1,1) и (2,2).

                ROW
         0       1       2
     *-------*-------*-------*
     |       |       |       |
   0 |   X   |       |       |
C    |       |       |       |
O    *-------*-------*-------*
L    |       |       |       |
U  1 |       |   X   |       |
M    |       |       |       |
N    *-------*-------*-------*
     |       |       |       |
   2 |       |       |   X   |
     |       |       |       |
     *-------*-------*-------*

В этом примере у нас есть что-то в (0,0) и (2,2)).

         0       2
     *-------*-------*
     |       |       |
   0 |   X   |       |
     |       |       |
     *-------*-------*
     |       |       |
   2 |       |   X   |
     |       |       |
     *-------*-------*

В этом примере мы имеем что-то в (1,0), (2,1) и (2,2).

         0       1       2
     *-------*-------*-------*
     |       |       |       |
   1 |   X   |       |       |
     |       |       |       |
     *-------*-------*-------*
     |       |       |       |
   2 |       |   X   |   X   |
     |       |       |       |
     *-------*-------*-------*

Приведенные выше примеры иллюстрируют то, что автоматическиотображается в зависимости от того, какую строку и сетку вы заполняете виджетами.

Что касается аргументов типа sticky, то они используются для управления поведением каждого виджета.Например, если мы скажем виджету заполнить все пространство в заданной строке / столбце, мы будем использовать sticky="nsew".Если мы хотим, чтобы виджет растягивался в заданной строке / столбце по горизонтали, а не по вертикали, мы бы использовали sticky="ew" для востока / запада.Имейте в виду, что липкий аргумент для grid().Менеджер геометрии pack() имеет свои собственные аргументы.

Есть много опций, и вы можете найти их список здесь с их описаниями:

Для grid()

Для pack()

Возьмите приведенный ниже пример.Этот код будет постоянно устанавливать метки и центрирование окна в окне, даже когда вы изменяете размер окна.Это гораздо проще в управлении, чем место.

Есть много полезных аргументов, которые вы можете использовать в ваших менеджерах геометрии для достижения практически любого поведения или выравнивания, которое вы пожелаете.Просто найдите время, чтобы копаться в этом.Я знаю, что place() кажется лучшим вариантом (я тоже так думал, когда впервые начал, пока Брайан не исправил это понятие: D), но на самом деле это не так.

import tkinter as tk

root=tk.Tk()
root.rowconfigure(0, weight=1)
root.rowconfigure(2, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(2, weight=1)

center_frame = tk.Frame(root)
center_frame.grid(row=1, column=1, sticky="nsew")

tk.Label(center_frame, text="Name/ID").grid(row=0, column=0)
tk.Label(center_frame, text="Password").grid(row=1, column=0)
tk.Button(center_frame, text="Enter").grid(row=2, column=1)

root.mainloop()

Вот пример использования pack(),Я считаю, что grid() - мой путь, но pack() может быть использован и для достижения многих целей.

import tkinter as tk

root=tk.Tk()

center_frame = tk.Frame(root)
center_frame.pack(expand=True)

tk.Label(center_frame, text="Name/ID").pack(side=tk.TOP)
tk.Label(center_frame, text="Password").pack(side=tk.TOP)
tk.Button(center_frame, text="Enter").pack(side=tk.RIGHT)

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