Метод tkinter .pack_propagate () - PullRequest
       22

Метод tkinter .pack_propagate ()

2 голосов
/ 03 апреля 2012

Я экспериментирую с Tkinter, поскольку я пытался выяснить, есть ли способ установить размер окна tkinter без использования canvas.Я натолкнулся на это, как установить размер кадра в вопросе и ответе SO .Поэтому я пошел дальше и протестировал его, написав очень маленькую программу для отображения текстовой метки.Но я обнаружил, что он «отсутствует» или исчезает при использовании frame.pack_propagate(0)

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root, width=400, height=400)
# Does not work at the moment, textBox is missing
# frame.pack_propagate(0) 
frame.pack()

textBox = tk.Label(frame, text="(x,y): ")
textBox.pack()

root.mainloop()

Итак, мой вопрос, можете ли вы объяснить, почему мой textBox (Label) не появляется, когда я использую frame.pack_propagate(0) вместо frame.pack() метода?А во-вторых, есть ли способ установить размер окна без использования холста?Я хочу знать, потому что я пишу серию небольших программ, чтобы рассказать моему другу о tkinter, прежде чем представить ему canvas.Было бы хорошо, если бы размер окна был одинаковым во всех моих образцах tkinter.И мне просто интересно (любопытно).Большое спасибо.

Я использую python 3.2.2 в MAC OS 10.5.8.

Ответы [ 2 ]

10 голосов
/ 03 апреля 2012

pack_propagate только устанавливает флаг, это не вызывает размещение рамки в виджете. Это не замена для звонка pack.

Другими словами, вы должны сделать это:

# put the frame in its parent
frame.pack()

# tell frame not to let its children control its size
frame.pack_propagate(0)

# put the textbox in the frame
textBox.pack()
2 голосов
/ 23 июля 2018

Чтобы ответить на ваш второй вопрос: Да, есть способ.

tkinters Tk имеют функцию Tk.geometry. Когда вы просто вызываете его без аргументов, вы получите текущую геометрию в форме 'widthxheight+x+y', например, (в Windows 10) '200x200+26+26', когда вы создаете свое первое окно Tk. Используя этот формат, вы можете изменить размер Tk, например, написав: root.geometry('400x500+60+60'), чтобы установить ширину 400, высоту 500 и поместить ее в координаты (60 | 60).

Это работает для Tk также как и для Toplevel. Но Toplevel также принимает аргументы высоту и ширину при инициализации или настройке. Если вы хотите, чтобы они сохраняли свой размер при упаковке чего-либо внутри, просто используйте на них root.pack_propagate(False).

Кстати, есть что-то похожее для менеджера сетки: root.grid_propagate(False)

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