Example #1
0
class Function(object):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    func_dict = {}

    @debug(lvl=logging.NOTSET, prefix='')
    def __init__(self, model, name, req=False, sort=100):
        self.model = model
        self.name = name
        self.req = req
        self.sort = sort
        self.__field_desc = None
        self.upload_col = None
        Function.func_dict[self.name] = self

    @property
    @debug(lvl=logging.NOTSET, prefix='')
    def field_desc(self):
        return self.__field_desc

    @field_desc.setter
    @debug(lvl=logging.DEBUG, prefix='')
    def field_desc(self, value):
        self.__field_desc = value
        self.upload_col = self.model.table.c[self.__field_desc]
class IniDBSection(IniSection):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    section_dict = {}
    creds = []

    @debug(lvl=logging.DEBUG, prefix="")
    def __init__(self, section, gui_obj):
        super().__init__(section, gui_obj)
        self.submit_btn = None
        self.creds = self.__class__.creds

    @debug(lvl=logging.DEBUG, prefix="")
    def add_pane(self):
        super().add_pane()
        self.submit_btn = ttk.Button(self.frame,
                                     text="Test Credentials",
                                     command=self.test_creds)
        self.submit_btn.grid(row=self.row_counter, column=0, pady=5)
        self.row_counter += 1

    @debug(lvl=logging.DEBUG, prefix="")
    def test_creds(self):
        raise NotImplementedError

    @debug(lvl=logging.DEBUG, prefix="")
    def toggle_creds(self, good_creds):
        for credential in self.creds:
            self.key_dict.get(credential).bad = not good_creds
Example #3
0
class CustAliasColumn(ColumnObject):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = None
    header = None
    abbrev = None
    metric = False
    cell_format = "InteriorTextCell"

    @staticmethod
    def apply_join(query):
        import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping
        import cep_price_console.db_management.ddi_data_warehouse as ddi_data_warehouse
        return query.outerjoin(
            ARW_PRF_Mapping.cust_alias_01_current.__table__, and_(
                ARW_PRF_Mapping.cust_alias_01_current.__table__.c.Cust_Num ==
                ddi_data_warehouse.invoice_header.c.CUSTOMERCODE,
                ARW_PRF_Mapping.cust_alias_01_current.__table__.c.Prod_Num ==
                ddi_data_warehouse.invoice_detail.c.PRODUCTCODE
            )
        )

    @staticmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def table():
        import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping
        return ARW_PRF_Mapping.cust_alias_01_current
class DateFrame(ttk.Frame):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, parent, *args, **kwargs):
        self.parent = parent
        # noinspection PyArgumentList
        super().__init__(self.parent, *args, **kwargs)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)

        self.date_start = DateSelection(self,
                                        style="even.dflt.TLabel",
                                        row=1,
                                        column=0,
                                        label_text="Start Date: ")

        self.date_end = DateSelection(self,
                                      style="even.dflt.TLabel",
                                      row=2,
                                      column=0,
                                      label_text="End Date: ")

    # @debug(lvl=logging.DEBUG, prefix='')
    # def regrid(self):
    #     for date_selection in DateSelection.date_selection_dict.values():
    #         date_selection.regrid()
    #
    @debug(lvl=logging.DEBUG, prefix='')
    def ungrid(self):
        self.date_start.value = None
        self.date_start.entry.set_date(None)
        self.date_end.value = None
        self.date_end.entry.set_date(None)
        self.grid_remove()
Example #5
0
class ProdUOMColumn(ColumnObject):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = None
    header = None
    abbrev = None
    metric = False
    cell_format = "InteriorTextCell"

    @staticmethod
    def apply_join(query):
        import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping
        return query.outerjoin(
            ARW_PRF_Mapping.prod_uom_v2_01_current.__table__, and_(
                ARW_PRF_Mapping.prod_uom_v2_01_current.__table__.c.Prod_Num ==
                ARW_PRF_Mapping.prod_main_01_current.__table__.c.Prod_Num,
                ARW_PRF_Mapping.prod_uom_v2_01_current.__table__.c.UOM ==
                ARW_PRF_Mapping.prod_main_01_current.__table__.c.Display_UOM,
            )
        )

    @staticmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def table():
        import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping
        return ARW_PRF_Mapping.prod_uom_v2_01_current
class Loading(tk.Toplevel):
    from cep_price_console.utils.log_utils import CustomAdapter, debug
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, master, *args, **kwargs):
        self.master = master
        self.root = self.master.root
        super().__init__(self.root, *args, **kwargs)
class HorizontalHandle(Handle):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def _on_dragging(self, event):
        x = event.x_root - self.master.winfo_rootx() - self._dx
        self.master.sash_place(self._sash_index, x, 1)
        # noinspection PyProtectedMember
        self.master._update_position_all_handles()
Example #8
0
class ActionIndicator(Step):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, view, *args, **kwargs):
        super().__init__(namely=str(ActionIndicator.__name__),
                         order=5,
                         view=view,
                         *args,
                         **kwargs)
class Row(object):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.NOTSET, prefix='')
    def __init__(self,
                 wb,
                 row_num_one_indexed):
        self.wb = wb
        self.row_num_one_indexed = row_num_one_indexed
        self.row_cells = []
Example #10
0
class UnitOfMeasure(Step):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, view, *args, **kwargs):
        super().__init__(namely=str(ColumnMapping.__name__),
                         order=5,
                         view=view,
                         *args,
                         **kwargs)
Example #11
0
def mssql_init_engine():
    global mssql_engine
    global mssql_base
    global mssql_session_maker

    mssql_base.metadata.bind = mssql_engine
    mssql_session_maker = sessionmaker(bind=mssql_engine)
    CustomAdapter(logging.getLogger('sqlalchemy.engine'))

    from cep_price_console.db_management.mssql_database import MSSQL_Database
    MSSQL_Database.prepare(mssql_engine)
Example #12
0
class UOMFactorDesc(ProdUOMColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "UOM_Factor_Desc"
    header = "UOM Qty"
    abbrev = "UOM Qty"
    metric = False
    cell_format = "InteriorTextCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().__table__.c.UOM_Factor_Desc
Example #13
0
class PrimVendPartNum(ProdMainColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "Primary_Vend_Part_Num"
    header = "Prim. Vend. Part Num."
    abbrev = "Prim. Vend. Part Num."
    metric = False
    cell_format = "InteriorTextCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().__table__.c.Primary_Vend_Part_Num
Example #14
0
class QuantityShipped(InvoiceDetailColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "Quantity_Shipped"
    header = "Quantity Shipped"
    abbrev = "Qty. Shipped"
    metric = True
    cell_format = "InteriorIntCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().c.QUANTITYSHIPPED
Example #15
0
class CustPartNum(CustAliasColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "Cust_Part_Num"
    header = "Cust Part Number"
    abbrev = "Cust. Part Num."
    metric = False
    cell_format = "InteriorTextCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().__table__.c.Cust_Part_Num
Example #16
0
class L1Price(ProdMainColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "L1_Price"
    header = "L1 Price"
    abbrev = "L1 Price"
    metric = False
    cell_format = "InteriorTextCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().__table__.c.L1_Price
Example #17
0
class GLProfit(InvoiceDetailColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "GL_Profit"
    header = "GL Profit"
    abbrev = "GL Profit"
    metric = True
    cell_format = "InteriorCurrencyCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().c.EXTENDEDGLPROFIT
Example #18
0
class Commission(InvoiceDetailColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "Commission"
    header = "Commission"
    abbrev = "Commission"
    metric = True
    cell_format = "InteriorCurrencyCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().c.COMMISSION
Example #19
0
class OriginalQuantity(InvoiceDetailColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "Original_Quantity"
    header = "Original Quantity"
    abbrev = "Orig. Qty."
    metric = True
    cell_format = "InteriorIntCell"

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().c.ORIGINALQUANTITY
class Handle(ttk.Frame):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    def __init__(self,
                 panedwindow,
                 sash_index,
                 disallow_dragging=False,
                 on_click=None,
                 *args,
                 **kwargs):
        image = kwargs.pop("image", None)
        # noinspection PyArgumentList
        super().__init__(panedwindow, *args, **kwargs)

        self._sash_index = sash_index

        if image:
            self._event_area = ttk.Label(self, image=image)
            self._event_area.pack()
        else:
            self._event_area = self

        self._center = int(self._event_area.winfo_reqwidth() / 2), int(
            self._event_area.winfo_reqheight() / 2)

        if disallow_dragging:
            if on_click:
                self._event_area.bind('<Button-1>', lambda event: on_click())
        else:
            # noinspection PyProtectedMember
            self._event_area.bind('<Button-1>', self._initiate_motion)
            # noinspection PyProtectedMember
            self._event_area.bind('<B1-Motion>', self._on_dragging)
            # noinspection PyProtectedMember
            self._event_area.bind('<ButtonRelease-1>', self.master._on_release)

    @debug(lvl=logging.DEBUG, prefix='')
    def _initiate_motion(self, event):
        self.master._active_sash = self._sash_index

        self._dx = event.x
        self._dy = event.y

    @property
    @debug(lvl=logging.DEBUG, prefix='')
    def sash_index(self):
        return self._sash_index

    @debug(lvl=logging.DEBUG, prefix='')
    def _on_dragging(self, event):
        raise NotImplementedError
Example #21
0
class PanedEntryFrame(ttk.Frame):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, master, toplevel, *args, **kwargs):
        self.toplevel = toplevel
        # noinspection PyArgumentList
        super().__init__(master, *args, **kwargs)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)

        # TODO: give it a clear name
        # TODO: use this name in a panedwindow-specific dictionary
        # TODO: use this name to remove it
        print("widgetName: {}".format(self.master.widgetName))
        print("winfo_name: {}".format(self.master.winfo_name()))

        entry_validation = (self.register(self.validate_selection),
                            '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry_var = tk.StringVar()
        self.entry = ttk.Entry(self,
                               textvariable=self.entry_var,
                               validate='focusout',
                               validatecommand=entry_validation)
        self.entry.grid(row=0, column=0, sticky=tk.NSEW)

        self.close_btn = ttk.Button(self,
                                    text="x",
                                    command=self.remove,
                                    width=1)
        self.close_btn.grid(row=0, column=1, sticky=tk.NE)

    @debug(lvl=logging.DEBUG, prefix='')
    def remove(self):
        something = self.master.nametowidget(".pricelist.paned_outer.{}".format(self.winfo_name()))
        self.master.remove(something)

    # noinspection PyUnusedLocal
    @debug(lvl=logging.DEBUG, prefix='')
    def validate_selection(self,
                           action,
                           index,
                           value_if_allowed,
                           prior_value,
                           text,
                           validation_type,
                           trigger_type,
                           widget_name):
        # if value_if_allowed != "":
        return True
Example #22
0
class Step(ttk.Frame):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    step_dict = {}

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, view, namely, order, *args, **kwargs):
        self.order = order
        self.namely = namely
        self.view = view
        # noinspection PyArgumentList
        super().__init__(self.view, *args, **kwargs)
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        self.grid(row=0, column=0, sticky=tk.NSEW)

        self.frame_cmd = ttk.Frame(self)
        self.frame_cmd.grid(row=1, column=0, sticky=tk.SE)

        self.frame_main = ttk.Frame(self)
        self.frame_main.grid(row=0, column=0, sticky=tk.NSEW)

        self.btn_next = ttk.Button(self.frame_cmd)
        self.btn_next.config(text="Proceed")
        self.btn_next.state(['disabled'])
        self.btn_next.grid(row=0, column=3)
        self.btn_next.bind("<ButtonRelease-1>", self.next)
        self.btn_prev = ttk.Button(self.frame_cmd)
        self.btn_prev.config(text="Previous")
        self.btn_prev.grid(row=0, column=2)
        self.btn_prev.bind("<ButtonRelease-1>", self.prev)
        self.complete = False

        Step.step_dict[self.namely] = self
        center_window(win_obj=self.view)

    @debug(lvl=logging.DEBUG, prefix='')
    def open(self):
        self.grid()

    @debug(lvl=logging.DEBUG, prefix='')
    def close(self):
        self.grid_remove()

    @debug(lvl=logging.DEBUG, prefix='')
    def next(self, *args):
        pass

    @debug(lvl=logging.DEBUG, prefix='')
    def prev(self, *args):
        pass
Example #23
0
def mysql_init_engine():
    global mysql_engine
    global mysql_base
    global mysql_session_maker

    mysql_base.metadata.bind = mysql_engine
    mysql_session_maker = sessionmaker(bind=mysql_engine)
    CustomAdapter(logging.getLogger('sqlalchemy.engine'))

    import cep_price_console.db_management.ARW_PRF_Mapping as ARW_PRF_Mapping
    if hasattr(ARW_PRF_Mapping, "InformReflection"):
        ARW_PRF_Mapping.InformReflection.prepare(mysql_engine)

    from cep_price_console.db_management.ddi_data_warehouse import DDIDataWarehouse
    DDIDataWarehouse.prepare(mysql_engine)
class PanedWindowHorizontal(PanedWindowBase):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(
            self,
            master,
            # name,
            size=60,
            sashpad=2,
            disallow_dragging=False,
            on_click=None,
            cursor=None,
            opaqueresize=True,
            *args,
            **kwargs):

        # noinspection SpellCheckingInspection
        image = tk.PhotoImage(
            data=
            "R0lGODlhGAADAPIFAEBAQGBgYICAgLu7u8zMzAAAAAAAAAAAACH5BAEAAAUALAAAAAAY"
            "AAMAAAMaWBJQym61N2UZJTisb96fpxGD4JBmgZ4lKyQAOw==")

        super().__init__(
            master,
            # name,
            orient=tk.HORIZONTAL,
            size=size,
            sashpad=sashpad,
            disallow_dragging=disallow_dragging,
            on_click=on_click,
            image=image,
            cursor=cursor,
            opaqueresize=opaqueresize,
            handle_class=HorizontalHandle,
            *args,
            **kwargs)

    @debug(lvl=logging.DEBUG, prefix='')
    def _update_position_all_handles(self):
        for sash_index, handle in enumerate(self._handle_list):
            x, y = super().sash_coord(sash_index)
            handle.place(x=x)

    @debug(lvl=logging.DEBUG, prefix='')
    def _on_configure_pane(self, sash_index):
        x, y = super().sash_coord(sash_index)
        self._handle_list[sash_index].place(x=x)
class IniSection(object):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    section_dict = {}

    @debug(lvl=logging.DEBUG, prefix="")
    def __init__(self, section, gui_obj, *args, **kw):
        self.frame = None
        self.lbl = None
        self.section = section
        self.gui_obj = gui_obj
        self.gui_obj.section_dict[str(self)] = self
        self.missing = True
        self.row_counter = 1
        self.key_dict = {}
        self.style_prefix = None
        IniSection.section_dict[str(self)] = self

    @debug(lvl=logging.DEBUG, prefix="")
    def add_pane(self):
        self.frame = ttk.Frame(self.gui_obj.paned_sections)
        self.frame.columnconfigure(1, weight=1)
        self.frame.config(padding=5)

        self.lbl = ttk.Label(self.frame, text=str(self))
        self.lbl.grid(row=0, column=0, columnspan=2)

        if len(self.gui_obj.paned_sections.panes()) % 2 == 0:
            self.style_prefix = "even"
        else:
            self.style_prefix = "odd"
        self.frame.configure(style="{}.group.TFrame".format(self.style_prefix))
        self.lbl.configure(
            style="{}.heading3.TLabel".format(self.style_prefix))
        self.populate()

    @debug(lvl=logging.DEBUG, prefix="")
    def populate(self):
        for key in self.key_dict.values():
            key.grid(self.row_counter)
            self.row_counter += 1

    @classmethod
    @debug(lvl=logging.DEBUG, prefix="")
    def reset_dict(cls):
        cls.section_dict = {}

    def __str__(self):
        return self.section
class AcctFrame(ttk.Frame):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, parent, *args, **kwargs):
        self.parent = parent
        # noinspection PyArgumentList
        super().__init__(self.parent, *args, **kwargs)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)

        self.parent_scroll_frame = ttk.Frame(self,
                                             style="odd.group.TFrame",
                                             padding=5)
        self.parent_scroll_frame.rowconfigure(0, weight=1)
        self.parent_scroll_frame.columnconfigure(0, weight=1)
        self.parent_scroll_frame.grid(row=0, column=0, sticky=tk.NSEW)

        self.scroll_frame = VerticalScrolledFrame(self.parent_scroll_frame)

        self.paned_window = tk.PanedWindow(self.scroll_frame,
                                           orient=tk.VERTICAL,
                                           name="acct_period")
        self.paned_window.rowconfigure(0, weight=1)
        self.paned_window.columnconfigure(0, weight=1)
        self.paned_window.grid(row=0, column=0, sticky=tk.NSEW)

        self.add_option_btn = ttk.Button(self,
                                         text="Add Period",
                                         command=self.add_option)
        self.add_option_btn.grid(row=1, column=0)
        self.acct_period_selection = []

    @debug(lvl=logging.DEBUG, prefix='')
    def add_option(self):
        something = AcctPeriod(acct_frame=self,
                               acct_paned_window=self.paned_window)
        self.acct_period_selection.append(something)
        self.paned_window.add(something, sticky=tk.NSEW, stretch="never")
        self.scroll_frame.event_generate("<Configure>")

    # noinspection PyUnusedLocal
    @debug(lvl=logging.DEBUG, prefix='')
    def validate_selection(self, action, index, value_if_allowed, prior_value,
                           text, validation_type, trigger_type, widget_name):
        # if value_if_allowed != "":
        return True
Example #27
0
class UploadMapping(object):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.NOTSET, prefix='')
    def __init__(self,
                 mapping_id,
                 datatype,
                 label,
                 col_obj,
                 ws_col_obj=None,
                 static_value=None):
        self.mapping_id = mapping_id
        self.datatype = datatype
        self.label = label
        self.col_obj = col_obj
        self.ws_col_obj = ws_col_obj
        self.static_value = static_value
Example #28
0
class ProdNumInv(InvoiceDetailColumn):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = "Prod_Num"
    header = "Product Num"
    abbrev = "Prod. Num"
    metric = False
    cell_format = "InteriorTextCell"

    @debug(lvl=logging.NOTSET, prefix="")
    def grid_init(self, key, list_frame, parent, **kwargs):
        super().grid_init(key, list_frame, parent, **kwargs)
        # self.sel_check_btn.state(['selected', 'disabled'])
        self.delete_item.grid_forget()

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        return cls.table().c.PRODUCTCODE
Example #29
0
class ColumnObject(OrderableListItemEntryCheckbutton):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)
    label = None
    header = None
    abbrev = None
    metric = False
    cell_format = "InteriorTextCell"

    @debug(lvl=logging.NOTSET, prefix='')
    def __init__(self, show_check=False, checkbox_label=""):
        self.label = self.__class__.label
        self.header = self.__class__.header
        self.abbrev = self.__class__.abbrev
        self.metric = self.__class__.metric
        super().__init__(title=self.header,
                         dflt_entry=self.abbrev,
                         show_check=show_check,
                         checkbox_label=checkbox_label)

    @debug(lvl=logging.NOTSET, prefix='')
    def labeled_col(self):
        return self.column().label(self.entry_var.get())

    @staticmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def table(self):
        raise NotImplementedError

    @classmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def column(cls):
        raise NotImplementedError

    @staticmethod
    @debug(lvl=logging.NOTSET, prefix="")
    def apply_join(query):
        raise NotImplementedError

    @debug(lvl=logging.NOTSET, prefix='')
    def __str__(self):
        return self.abbrev
Example #30
0
class PriceList(tk.Toplevel):
    logger = CustomAdapter(logging.getLogger(str(__name__)), None)

    @debug(lvl=logging.DEBUG, prefix='')
    def __init__(self, master, *args, **kwargs):
        # ttk.Frame.place
        self.master = master
        self.name = str(PriceList.__name__).lower()
        super().__init__(name=self.name, *args, **kwargs)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.title("Filtering Criteria")
        self.iconbitmap(config.ICON_FILE)
        self.protocol("WM_DELETE_WINDOW", self.close)

        self.paned_outer = PanedWindowVertical(self,
                                               name="paned_outer",
                                               sashrelief=tk.RAISED,
                                               sashwidth=7)

        self.paned_outer.grid(row=0, column=0, sticky=tk.NSEW)

        print(dir(self.paned_outer))
        for thing in range(1, 5):
            something = PanedEntryFrame(master=self.paned_outer,
                                        name=str(thing),
                                        toplevel=self)
            self.paned_outer.add(something,
                                 width=something.winfo_reqwidth(),
                                 pady=5,
                                 padx=5,
                                 stretch="always")

        center_window(win_obj=self)

    @debug(lvl=logging.DEBUG, prefix='')
    def close(self):
        msgbox = messagebox.askokcancel("Quit", "Do you want to quit?", parent=self)
        if msgbox:
            self.destroy()