Как да центрирам рамка в рамка в Tkinter?

Имам рамка, чийто размер фиксирах с помощта на метода grid_propagate(). Бих искал да центрирам рамка в тази рамка. Как да направя това?


person rectangletangle    schedule 21.11.2010    source източник


Отговори (2)


опаковайте го, за да запълните във всички посоки. Добавете подложка, ако е необходимо.

Или използвайте място, което ви позволява да използвате относително или абсолютно позициониране. Можете да използвате относително x/y от .5/.5 и котва от "c" (център).

import Tkinter as tk

root=tk.Tk()
f1 = tk.Frame(width=200, height=200, background="red")
f2 = tk.Frame(width=100, height=100, background="blue")

f1.pack(fill="both", expand=True, padx=20, pady=20)
f2.place(in_=f1, anchor="c", relx=.5, rely=.5)

root.mainloop()
person Bryan Oakley    schedule 22.11.2010
comment
Това е леко объркващо, тъй като нито f1, нито f2 декларират родител. Как f1 знае да се опакова в root? Освен това се смесват 2 различни мениджъра на геометрията. Това се предупреждава навсякъде като лоша практика. Въпреки това работи и решава проблем, с който бях заседнал с часове. Така че +1! - person wsaleem; 29.09.2015
comment
@wsaleem: Всеки прозорец с изключение на главния прозорец трябва да има родител. Основният прозорец е по подразбиране, когато приспособлението не указва изрично родител. Що се отнася до пакета за смесване и мястото (и/или мрежата): това е съвсем наред -- дори за предпочитане -- в едно приложение като цяло. Просто не можете да ги смесвате в един и същи съдържащ прозорец. В този случай f1 се управлява от основния прозорец, а f2 се управлява от f1 (заради параметъра in_. - person Bryan Oakley; 29.09.2015
comment
place() е добре, когато вече трябва да наложите размера на външната рамка. Но обикновено избягвам place(), защото рамката не усеща размера на placed приспособления при автоматично оразмеряване. Моля, вижте отговора ми по-долу. - person Gary02127; 05.02.2020

Ако искате да центрирате джаджа (като рамка) вътре в рамка, най-лесният начин да го направите е чрез .grid(). Ако използвате .pack(), в крайна сметка ще останете по един от ръбовете, тъй като pack() има ключовата дума side.

Ако използвате .place(), тогава сте заседнали при налагането на размера на външната рамка (което обикновено не трябва да правите, но вече сте го направили, така че не е проблем), защото placed приспособленията не се откриват когато рамката се оразмерява автоматично като при packed или gridded джаджи. Не знам защо, но това е положението.

Така че, като цяло, най-добрият начин да центрирате изпълним елемент вътре в рамка е да grid изпълнимия елемент в рамката. (Опцията sticky по подразбиране е ЦЕНТЪР.) И след това, ако искате да можете да преоразмерите външната рамка и джаджата да остане центрирана, трябва да позволите на клетката на външната рамка да се разширява/растат. Бихте направили това чрез командите .grid_rowconfigure() etc. И така, пример може да бъде:

        widget = Widget(frame, ...)
        widget.grid(row=0, column=0, sticky="")
        frame.grid_rowconfigure(0, weight=1)
        frame.grid_columnconfigure(0, weight=1)
person Gary02127    schedule 05.02.2020