Как изменить ширину виджета фрейма в python - PullRequest
2 голосов
/ 07 февраля 2020

Я пытаюсь изменить размер фрейма в tkinter, но ширина не меняется, и функция winfo_width () возвращает 1. Как я могу это исправить?

from tkinter import *

root = Tk()
root.geometry('400x300')
Frame = LabelFrame(root, text="Test", width = 200)
Frame.grid(row = 0, column = 0)
label = Label(Frame, text = '').grid(row = 0, column=0)


print(Frame.winfo_width()) #output is 1 instead of 200

root.mainloop()

Ответы [ 3 ]

3 голосов
/ 07 февраля 2020

Ширина возвращается 1, потому что окно еще не было нарисовано. Фактическая ширина зависит от нарисованного окна, так как фактическая ширина зависит от многих факторов, которые не могут быть известны до того, как окно действительно нарисовано.

Если вы вызываете root.update() перед вызовом Frame.winfo_width(), чтобы вызвать чтобы нарисовать окно, вы увидите, что оно отображает фактическое значение.

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

Ширина также может зависеть от того, как она добавлена ​​на дисплей - используете ли вы pack или grid или place и как вы их настроили. Итак, еще один способ сделать кадр шире - это использовать параметры не по умолчанию, которые приводят к увеличению или уменьшению кадра в соответствии с заданным для него пространством.

Если вы хотите указать явный размер и игнорировать автоматические функции tkinter c изменяя размеры, вы можете сделать это, отключив распространение геометрии и затем установив параметры width и height для кадра. В зависимости от того, используете ли вы grid или pack, вы можете вызвать grid_propagate или pack_propagate с аргументом False, чтобы отключить распространение (place не поддерживает распространение геометрии).

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

2 голосов
/ 07 февраля 2020

Как и другие указали, как установить рамку размера * stati c, используя grid_propagate(), я покажу вам, как настроить размер рамки автоматически.

Вам нужно указать строку и столбец, чтобы развернуть этот кадр. Это делается с columnconfigure() и rowconfigure(). Затем вам нужно указать рамке придерживаться со всех сторон sticky='nsew'. Добавление виджетов в рамку ничем не отличается от любого другого контейнера. Просто скажите виджету, что он находится в кадре.

Одна потенциальная проблема, которую я вижу, это то, что вы перезаписываете Frame() в этой строке: Frame = LabelFrame(root, text="Test", width = 200). Это хороший пример, почему вы не должны использовать импорт *. Вместо этого выполните import tkinter as tk и используйте префикс tk. для всего, что ему нужно.

Пример:

import tkinter as tk

root = tk.Tk()
root.geometry('400x300')
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
frame = tk.LabelFrame(root, text='Test', width=200)
frame.grid(row=0, column=0, sticky='nsew')
label = tk.Label(frame, text='label').grid(row=0, column=0)
root.mainloop()

Результаты:

enter image description here

Обновление:

Если вы хотите что-то сказать c, убедитесь, что вы определили как высоту, так и ширину. Если вы определите только один или другой, вы не увидите рамку в окне.

Для тестируемого примера для кадра c размер рамки:

import tkinter as tk

root = tk.Tk()
root.geometry('400x300')
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
frame = tk.LabelFrame(root, text='Test', height=200, width=200)
frame.grid(row=0, column=0)
frame.grid_propagate(False)
label = tk.Label(frame, text='label').grid(row=0, column=0)

root.mainloop()

Результаты:

enter image description here

1 голос
/ 07 февраля 2020

Ваш фрейм может распространяться по сетке на основе виджетов на нем и не иметь фиксированных размеров.

Вывод 1 обусловлен тем, что на фрейме нет ничего, кроме пустой метки. (По-прежнему будет отображаться 1, если не будет метки)

Чтобы получить вывод как 200, установите флаг grid_propagate в False ( только после установки высоты и параметры), как показано ниже:

frame = Frame(..., width=200)
frame.grid(row=0, column=0)
frame.grid_propagate(False)
...