Остановить изменение размера кадра Tkinter в соответствии с размерами виджета - PullRequest
8 голосов
/ 07 октября 2011
root = Tk()

descriptionFrame = Frame(root)

definitionFrame = LabelFrame(descriptionFrame, text="Definition")
definitionScroll = Scrollbar(definitionFrame)
definitionCanvas = Canvas(definitionFrame, width=30, height=4, yscrollcommand=definitionScroll.set)
definitionScroll.config(command=definitionCanvas.yview)
definitionLabel = Label(definitionCanvas, text="n/a")

descriptionFrame.pack()
definitionFrame.pack()
definitionScroll.pack(side=RIGHT, fill=Y)
definitionCanvas.pack(side=LEFT, fill=BOTH, expand=True)
definitionLabel.pack(fill=BOTH, expand=True)

root.mainloop()

У меня есть этот код. Канва имеет ширину 30 и высоту 4, но когда я запускаю ее, она игнорирует ширину и высоту холста, а полученное окно вместо этого имеет размер вокруг метки. Я пытался использовать pack_propagate(False) для каждого кадра в коде, но это ничего не влияет на definitionFrame, но когда я использую его на descriptionFrame, это приводит к пустому окну. Как бы я создал графический интерфейс, где все фреймы и окно имеют размер Canvas, ширина 30 и высота 4?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 07 октября 2011

Чтобы ответить на ваш конкретный вопрос о том, как остановить изменение размера фрейма (или любого контейнерного виджета) в соответствии с его содержимым, вы вызываете либо pack_propagate(False), либо grid_propagate(False) в зависимости от того, какой менеджер геометрии вы используете. Если вы попробовали это, и это не сработало, вы сделали это неправильно. Поскольку вы не опубликовали этот код, мы не можем диагностировать, что пошло не так.

Когда вы звоните pack_propagate(False), вы должны убедиться, что виджет имеет соответствующий размер. Ярлыки и кнопки будут иметь размер по умолчанию, чтобы соответствовать их тексту, но у фрейма будет размер по умолчанию 1x1, что делает содержимое практически невидимым. Если вы используете это в кадре, убедитесь, что вы указали явную ширину и высоту.

2 голосов
/ 07 октября 2011

только списки, текст, холст и запись прокручиваются по умолчанию;Canvas может работать, но это немного излишне для IMO, так что вот что похоже на то, что вы хотите, используя Text

#!/usr/bin/python
from Tkinter import *
root = Tk()

descriptionFrame = Frame(root)

definitionFrame = LabelFrame(descriptionFrame, text="Definition")
definitionScroll = Scrollbar(definitionFrame)
definitionText = Text(definitionFrame, width=30, height=4, yscrollcommand=definitionScroll.set)
definitionScroll.config(command=definitionText.yview)

definitionText.delete("1.0", END)   # an example of how to delete all current text
definitionText.insert("1.0", "n/a") # an example of how to add new text to the text area

descriptionFrame.pack(fill=BOTH, expand=True)
definitionFrame.pack(fill=BOTH, expand=True)
definitionScroll.pack(side=RIGHT, fill=Y)
definitionText.pack(side=LEFT, fill=BOTH, expand=True)

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