Почему winfo_width () возвращает больший размер виджета кнопки, чем тот, на который он точно похож? - PullRequest
3 голосов
/ 21 мая 2019

Я хочу, чтобы кнопки / метки в одном столбце имели одинаковую ширину с определенной / первой кнопкой / меткой.Проблема в том, что winfo_width (), похоже, не возвращает то, что я хочу.Возвращаемое значение winfo_width () - это многократное нажатие кнопки.

Я не хочу, чтобы ширина фиксировалась числом, которое я выбрал.Таким образом, я не нашел решения своей проблемы.

Вот часть моего кода:

button_1.update_idletasks()
print(button_1.winfo_width())
new_label = Label(frame_1, bg=  "#8432C7", width = 30, height = 5)
new_label.grid(row = 2, column = 0)

Поскольку у меня нет 10 репутации для публикации изображений, вот ссылкадля сгенерированного интерфейса:

enter image description here

Если вы могли видеть изображение выше, вы должны найти, что нижняя метка (ширина = 30) больше верхнейкнопка (ширина = 157?).

Но, согласно моим попыткам, 157 кажется не шириной кнопки_1.Я не понимаю, что именно возвращает winfo_width ().Таким образом, я хочу знать, что возвращает winfo_width () (почему winfo_width () возвращает 157, которое должно быть меньше 30) и как получить точную ширину кнопки.

Я застрял здесь на час с тех пор, как недавно начал изучать Ткинтер.Заранее спасибо всем, кто может дать мне предложения.

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Забавный факт: вам вообще не нужно об этом беспокоиться.

Просто передайте sticky, когда вы grid свои виджеты:

import tkinter as tk

root = tk.Tk()

button_1 = tk.Button(root,text="button_1")
button_1.grid(row = 1, column = 0, sticky="ew")
new_label = tk.Label(root, bg=  "#8432C7", height = 5)
new_label.grid(row = 2, column = 0, sticky="ew")

root.mainloop()

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

1 голос
/ 21 мая 2019

Это связано с тем, что ширина, используемая в аргументах для создания кнопки, отличается от единицы, используемой tkinter.

Из документации Button в tkinter,Ширина: The width of the button. If the button displays text, the size is given in text units. If the button displays an image, the size is given in pixels (or screen units). If the size is omitted, or zero, it is calculated based on the button contents. (width/Width)

Вы обнаружите, что если вы используете tkinters .place() для установки размера, то размер, который возвращает .winfo_width(), будет таким же.

Например,:

button_1.update_idletasks()
print(button_1.winfo_width())
new_label = Label(frame_1, bg=  "#8432C7")
new_label.place(x=40, y=0, width=157, height=20)

Вы обнаружите, что ширина new_label теперь будет такой же, как у кнопки

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