def __init__(self, parent_frame, width, height):
        Frame.__init__(self, master=parent_frame, width=width, height=height)

        top_label = Label(self, text="top")
        test_label = Label(self, text="test")

        # bound variables
        self.top_string = StringVar()
        self.test_string = StringVar()
        self.run_mode = IntVar()
        self.run_until_tick_str = StringVar()
        self.run_until_event_str = StringVar()
        self.is_resolve_zero = IntVar()

        val_num_cmd = (self.register(self.validate_number), '%S')
        val_str_cmd = (self.register(self.validate_string), '%S')

        # gui interactive elements:
        self.search_path_wg = AddRemoveListWidget(self, [], 800, 300, 4, lambda: askdirectory(title="choose directory"),
                                                  "1. Choose search path:")
        self.module_wg = AddRemoveListWidget(self, [], 500, 800, 4,
                                             lambda: ConfigWidget.get_module_name(askopenfilename(title="choose file")),
                                             "2. Choose modules:")
        run_forever_button = Radiobutton(self, text="run forever", value=0, variable=self.run_mode)
        run_until_tick_button = Radiobutton(self, text="run until tick", value=1, variable=self.run_mode)
        run_until_event_button = Radiobutton(self, text="run until event number", value=2, variable=self.run_mode)
        resolve_zero_button = Checkbutton(self, text="enable resolve zero time", variable=self.is_resolve_zero)

        run_until_tick_entry = Entry(self, textvariable=self.run_until_tick_str, validate="key",
                                     validatecommand=val_num_cmd)
        run_until_event_entry = Entry(self, textvariable=self.run_until_event_str, validate="key",
                                      validatecommand=val_num_cmd)
        top_entry = Entry(self, textvariable=self.top_string, validate="key", validatecommand=val_str_cmd)
        test_entry = Entry(self, textvariable=self.test_string, validate="key", validatecommand=val_str_cmd)

        # set the layout
        self.search_path_wg.grid(row=0, column=0, columnspan=3, sticky=NSEW)
        self.module_wg.grid(row=2, column=0, columnspan=3, sticky=NSEW)

        top_label.grid(row=3, column=0, sticky=W)
        top_entry.grid(row=3, column=1, columnspan=2, sticky=EW)

        test_label.grid(row=4, column=0, sticky=W)
        test_entry.grid(row=4, column=1, columnspan=2, sticky=EW)

        run_forever_button.grid(row=7, column=0, sticky=W)

        run_until_tick_button.grid(row=8, column=0, sticky=W)
        run_until_tick_entry.grid(row=8, column=1, columnspan=2, sticky=EW)

        run_until_event_button.grid(row=9, column=0, sticky=W)
        run_until_event_entry.grid(row=9, column=1, columnspan=2, sticky=EW)

        resolve_zero_button.grid(row=10, column=0, sticky=W)

        self.rowconfigure(0, weight=1)
        self.rowconfigure(2, weight=1)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        return
class ConfigWidget(Frame):

    def __init__(self, parent_frame, width, height):
        Frame.__init__(self, master=parent_frame, width=width, height=height)

        top_label = Label(self, text="top")
        test_label = Label(self, text="test")

        # bound variables
        self.top_string = StringVar()
        self.test_string = StringVar()
        self.run_mode = IntVar()
        self.run_until_tick_str = StringVar()
        self.run_until_event_str = StringVar()
        self.is_resolve_zero = IntVar()

        val_num_cmd = (self.register(self.validate_number), '%S')
        val_str_cmd = (self.register(self.validate_string), '%S')

        # gui interactive elements:
        self.search_path_wg = AddRemoveListWidget(self, [], 800, 300, 4, lambda: askdirectory(title="choose directory"),
                                                  "1. Choose search path:")
        self.module_wg = AddRemoveListWidget(self, [], 500, 800, 4,
                                             lambda: ConfigWidget.get_module_name(askopenfilename(title="choose file")),
                                             "2. Choose modules:")
        run_forever_button = Radiobutton(self, text="run forever", value=0, variable=self.run_mode)
        run_until_tick_button = Radiobutton(self, text="run until tick", value=1, variable=self.run_mode)
        run_until_event_button = Radiobutton(self, text="run until event number", value=2, variable=self.run_mode)
        resolve_zero_button = Checkbutton(self, text="enable resolve zero time", variable=self.is_resolve_zero)

        run_until_tick_entry = Entry(self, textvariable=self.run_until_tick_str, validate="key",
                                     validatecommand=val_num_cmd)
        run_until_event_entry = Entry(self, textvariable=self.run_until_event_str, validate="key",
                                      validatecommand=val_num_cmd)
        top_entry = Entry(self, textvariable=self.top_string, validate="key", validatecommand=val_str_cmd)
        test_entry = Entry(self, textvariable=self.test_string, validate="key", validatecommand=val_str_cmd)

        # set the layout
        self.search_path_wg.grid(row=0, column=0, columnspan=3, sticky=NSEW)
        self.module_wg.grid(row=2, column=0, columnspan=3, sticky=NSEW)

        top_label.grid(row=3, column=0, sticky=W)
        top_entry.grid(row=3, column=1, columnspan=2, sticky=EW)

        test_label.grid(row=4, column=0, sticky=W)
        test_entry.grid(row=4, column=1, columnspan=2, sticky=EW)

        run_forever_button.grid(row=7, column=0, sticky=W)

        run_until_tick_button.grid(row=8, column=0, sticky=W)
        run_until_tick_entry.grid(row=8, column=1, columnspan=2, sticky=EW)

        run_until_event_button.grid(row=9, column=0, sticky=W)
        run_until_event_entry.grid(row=9, column=1, columnspan=2, sticky=EW)

        resolve_zero_button.grid(row=10, column=0, sticky=W)

        self.rowconfigure(0, weight=1)
        self.rowconfigure(2, weight=1)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        return

    def validate_number(self, s):
        try:
            float(s)
            return True
        except ValueError:
            tkMessageBox.showerror("Incorrect value", "Expecting number not [%s]" % s)
            return False

    def validate_string(self, s):
        if s is not "":
            return True
        else:
            tkMessageBox.showerror("Incorrect value", "Must be non empty string")
            return False

    @staticmethod
    def get_module_name(file_name):
        if file_name is None or file_name is "":
            return None
        file_with_extension = file_name.split("/")[-1]
        return file_with_extension.join(file_with_extension.split('.')[:-1])

    def get_search_path_list(self):
        return self.search_path_wg.get_items()

    def get_modules_list(self):
        return self.module_wg.get_items()

    def get_top(self):
        return self.top_string.get()

    def get_test(self):
        return self.test_string.get()

    def get_run_mode(self):
        res = RunMode()
        until = 0
        if self.run_mode.get() == 0:
            res.set_run_mode(RUN_MODE.forever)
        elif self.run_mode.get() == 1:
            res.set_run_mode(RUN_MODE.until_tick)
            if self.run_until_tick_str.get() is not "":
                until = int(self.run_until_tick_str.get())
                self.run_until_tick_str.set(until)
            res.set_until(until)
        else:
            res.set_run_mode(RUN_MODE.until_event)
            if self.run_until_event_str.get() is not "":
                until = int(self.run_until_event_str.get())
                self.run_until_event_str.set(until)
            res.set_until(until)
        return res

    def get_resolve_zero_time(self):
        return self.is_resolve_zero.get()