Python — выравнивание виджета при использовании нескольких фреймов

У меня возникают проблемы с выравниванием виджетов tkinter, когда они находятся в разных фреймах, как показано в прикрепленном изображении

У меня есть 3 кадра: main_frame - окрашены в синий цвет, содержащие 3 подкадра: buttons_frame,timers_frame,switches_frame, все из которых центрированы на main_frame, один поверх другого.

Дизайн требует: все виджеты во всех подфреймах будут центрированы внутри его фрейма. Как показано на прикрепленном рисунке и в коде - средний подкадр, timers_frame растянут до максимального размера с использованием tk.E+tk.w, НО виджеты внутри расположены в row=0, column=0 и не выравниваются по центру растянутого фрейма. Использование tk.E+tk.W не помогло.

Решение без использования подкадров работает нормально.

Соответствующая часть кода:

class CoreButton(ttk.Frame):

    def __init__(self, master, nickname='CoreBut.inc', hw_in=[], hw_out=[], ip_in='', \
                 ip_out='', sched_vector=[], num_buts=1):

        ttk.Frame.__init__(self, master)

        # Styles
        self.style = ttk.Style()
        self.style.configure("Azure.TFrame", background='azure4')
        self.style.configure("Blue.TFrame", background='blue')
        self.style.configure("Blue2.TFrame", background='light steel blue')
        self.style.configure("Red.TButton", foreground='red')

        # Frames
        # Buttons&Indicators
        py, px = 4, 4
        self.main_frame = ttk.Frame(self, style="Blue2.TFrame", relief=tk.RIDGE)
        self.main_frame.grid()

        self.buttons_frame = ttk.Frame(self.main_frame, relief=tk.RIDGE, style="Azure.TFrame")
        self.buttons_frame.grid(row=0, column=0, pady=py, padx=px)

        # Counters
        self.timers_frame = ttk.Frame(self.main_frame, relief=tk.RIDGE, border=5, style="Azure.TFrame")
        self.timers_frame.grid(row=1, column=0, pady=py, padx=px, sticky=tk.E+tk.W)
        # Extra GUI
        self.switches_frame = ttk.Frame(self.main_frame, relief=tk.RIDGE, border=5, style="Azure.TFrame")
        self.switches_frame.grid(row=2, column=0, pady=py)



        # Run Gui
        # self.build_gui()
        self.extras_gui()

    def extras_gui(self):


        ck1 = tk.Checkbutton(self.switches_frame, text='On/Off', variable=self.on_off_var, \
                             indicatoron=1, command=self.disable_but)
        ck1.grid(row=0, column=0)

        ck2 = tk.Checkbutton(self.switches_frame, text='Schedule', variable=self.enable_disable_sched_var, \
                             indicatoron=1,
                             command=lambda: self.disable_sched_task(s=self.enable_disable_sched_var.get()))
        ck2.grid(row=1, column=0)

person Guy . D    schedule 18.12.2017    source источник


Ответы (1)


Вы должны дать колонке вес ваших таймеров!

self.timers_frame.columnconfigure(0, weight=1)

В противном случае столбец имеет ширину ваших таймеров, а не ширину вашего timers_frame.

person R Tsch    schedule 18.12.2017