Дано:
Две строки с виджетами. Первая строка упаковывается сразу. Вторая - в зависимости от выбора в комбобокс.
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()