Две строки с виджетами. Первая строка упаковывается сразу. Вторая - в зависимости от выбора в комбобокс.
row1: combobox(1 колонка), entry(2 колонки), combobox(1 колонка). упаковано grid сразу
row2: 4 combobox(1 колонка). упаковываются по мере необходимости
Проблема:
1.При старте программы первый ряд пакуется с учетом трех колонок:
2. При упаковке второго ряда возникает проблема с геометрией:
3. И только при упаковке всех виджетов, вид окна становится как нужно:
Вопрос:
Как реализовать упаковку первого ряда с учетом 4 колонок?
Код:
import Tkinter as tk import ttk ############################## MAIN APP GUI SETTINGS m_min_width = 900 m_min_height = 500 m_x, b_y = 100, 100 #if m_center_win is True xpos, ypos are ignored m_center_win = True m_resizable = True combobox_width = 35 ############################## MAIN APPLICATION CLASS class MainApplication(): def __init__(self, root): self.master = root self.master.minsize(m_min_width, m_min_height) self.xpos = (self.master.winfo_screenwidth() - m_min_width) / 2 self.ypos = (self.master.winfo_screenheight() - m_min_height) / 2 self.master.geometry('+%s+%s' % (self.xpos, self.ypos)) if m_resizable: self.master.resizable(1,1) else: self.master.resizable(0,0) self.createWidgets() def ShowHideWidget(self, current_combobox, next_combobox): def HideAndNull(master, *args): for i in args: try: i.grid_remove() except: i.set('') def SetAndGrid(master, current_combobox, next_combobox, sub_row, sub_col): next_combobox['values'] = sub_cat next_combobox.grid(row=sub_row, column=sub_col, sticky='WE', padx=5, pady=5, ipady=2) if current_combobox == self.category_combobox: HideAndNull(self, self.sub1_category_combobox, self.sub2_category_combobox, self.sub3_category_combobox, self.sub4_category_combobox, self.sub1_category_var, self.sub2_category_var, self.sub3_category_var, self.sub4_category_var) if len(current_combobox.get()) > 0: SetAndGrid(self, current_combobox, next_combobox, 1, 0) else: HideAndNull(self, self.sub1_category_combobox, self.sub2_category_combobox, self.sub3_category_combobox, self.sub4_category_combobox, self.sub1_category_var, self.sub2_category_var, self.sub3_category_var, self.sub4_category_var) elif current_combobox == self.sub1_category_combobox: HideAndNull(self, self.sub2_category_combobox, self.sub3_category_combobox, self.sub4_category_combobox, self.sub2_category_var, self.sub3_category_var, self.sub4_category_var) if len(current_combobox.get()) > 0: SetAndGrid(self, current_combobox, next_combobox, 1, 1) else: HideAndNull(self, self.sub2_category_combobox, self.sub3_category_combobox, self.sub4_category_combobox, self.sub2_category_var, self.sub3_category_var, self.sub4_category_var) elif current_combobox == self.sub2_category_combobox: HideAndNull(self, self.sub3_category_combobox, self.sub4_category_combobox, self.sub3_category_var, self.sub4_category_var) if len(current_combobox.get()) > 0: SetAndGrid(self, current_combobox, next_combobox, 1, 2) else: HideAndNull(self, self.sub3_category_combobox, self.sub4_category_combobox, self.sub3_category_var, self.sub4_category_var) elif current_combobox == self.sub3_category_combobox: HideAndNull(self, self.sub4_category_combobox, self.sub4_category_var) if len(current_combobox.get()) > 0: SetAndGrid(self, current_combobox, next_combobox, 1, 3) else: HideAndNull(self, self.sub4_category_combobox, self.sub4_category_var) def createWidgets(self): self.master.grid_columnconfigure(0, weight=1) self.master.grid_rowconfigure(0, weight=1) self.up_frame = tk.LabelFrame(self.master, text=' Test ') self.up_frame.grid(row=0, column=0, sticky='SNEW', padx=5, pady=5, ipady=2, ipadx=2) self.up_frame.grid_columnconfigure(0, weight=1) self.up_frame.grid_columnconfigure(1, weight=1) self.up_frame.grid_columnconfigure(2, weight=1) self.up_frame.grid_columnconfigure(3, weight=1) self.category_var = tk.StringVar() self.category_combobox = ttk.Combobox(self.up_frame, values=cat, state='readonly') self.category_combobox.bind("<<ComboboxSelected>>", lambda x:self.ShowHideWidget(self.category_combobox, self.sub1_category_combobox)) self.category_combobox.grid(row=0, column=0, sticky='WE', padx=5, pady=1, ipady=2) self.what2search = tk.Entry(self.up_frame) self.what2search.grid(row=0, column=1, columnspan=2, sticky='WE', padx=5, pady=1, ipady=2) self.region_var = tk.StringVar() self.region_combobox = ttk.Combobox(self.up_frame, state='readonly') self.region_combobox.grid(row=0, column=3, sticky='WE', padx=5, pady=1, ipady=2) self.sub1_category_var = tk.StringVar() self.sub1_category_combobox = ttk.Combobox(self.up_frame, textvariable=self.sub1_category_var, state='readonly') self.sub1_category_combobox.bind("<<ComboboxSelected>>", lambda x:self.ShowHideWidget(self.sub1_category_combobox, self.sub2_category_combobox)) self.sub2_category_var = tk.StringVar() self.sub2_category_combobox = ttk.Combobox(self.up_frame, textvariable=self.sub2_category_var, state='readonly') self.sub2_category_combobox.bind("<<ComboboxSelected>>", lambda x:self.ShowHideWidget(self.sub2_category_combobox, self.sub3_category_combobox)) self.sub3_category_var = tk.StringVar() self.sub3_category_combobox = ttk.Combobox(self.up_frame, textvariable=self.sub3_category_var, state='readonly') self.sub3_category_combobox.bind("<<ComboboxSelected>>", lambda x:self.ShowHideWidget(self.sub3_category_combobox, self.sub4_category_combobox)) self.sub4_category_var = tk.StringVar() self.sub4_category_combobox = ttk.Combobox(self.up_frame, textvariable=self.sub4_category_var, state='readonly') self.sub4_category_combobox.bind("<<ComboboxSelected>>", lambda x:self.ShowHideWidget(self.sub4_category_combobox, self.sub4_category_combobox)) cat = ['', 1] sub_cat = ['', 2] root = tk.Tk() app = MainApplication(root) root.mainloop()