Python: изменение конфигурации дочерних виджетов дублирует виджет в tkinter

Здравствуйте, я думаю, что у меня проблема с дизайном Python tkinter. Я просмотрел это, чтобы лучше структурировать свой код. Я не хочу менять конфигурацию всех своих виджетов по отдельности и хотел бы использовать команду parent_widget.winfo_children(), которую я нашел в этот вопрос.

Мне интересно, есть ли лучший способ не настраивать виджеты по отдельности и при этом обновлять их шрифт и стиль.

Вот мой код и текущее поведение:

class TabOne(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.tab1_note = ttk.Notebook(self,width=parent.winfo_screenwidth(), height=parent.winfo_screenheight())

        tab1_open_observations = ttk.Frame(self.tab1_note)
        tab1_closed_observations = ttk.Frame(self.tab1_note)

        self.tab1_note.add(tab1_open_observations, text= "Open Projects")
        self.tab1_note.add(tab1_closed_observations, text= "Closed/Deferred Projects")
        self.tab1_note.pack()

        self.tab_two_load(tab1_open_observations)
        self.tab_three_load(tab1_closed_observations)
        widget_list = []
        widget_list.extend(tab1_open_observations.winfo_children())
        widget_list.extend(tab1_closed_observations.winfo_children())

        for wid in widget_list:
            try:
                wid.configure(font = 'helvetica 12')
            except:
                pass

     def tab_one_load(self,tab1_refresh_db):
     def tab_two_load(self,tab1_open_observations)

class TabTwo(Frame):
class TabThree(Frame):

class MainWindow(Frame):
    def __init__(self, window, **kwargs):
        Frame.__init__(self, window, **kwargs)
        self.load_ui()

    def load_ui(self):
        self.note = ttk.Notebook(self,width=self.window.winfo_screenwidth()-(2*self.pad), height=self.window.winfo_screenheight()-(2*self.pad))

        self.tab1 = TabOne(self.note)
        self.tab2 = TabTwo(self.note)
        self.tab3 = TabThree(self.note)

        self.note.pack()

def main():
    window = Tk()
    window.title('Productivity Tool')
    app = MainWindow(window)
    app.pack(side="top", fill="both", expand=True)
    window.mainloop()

if __name__ == '__main__':
    main()

Текущее поведение для зависимых выпадающих списков (код ниже):

введите здесь описание изображения

Второй список не перекрывается, если я добавляю project_module_dropdown.configure(font='helvetica 12') под каждым зависимым OptionsMenu. Вот еще код для функции tab_two_load()

def tab_two_load(self,tab1_open_observations):

    def update_modules(a,b,c):

        proj_mo_names = [module[0] for module in project_modules]
        proj_mod_select.set(proj_mo_names[0])
        project_module_dropdown = OptionMenu(tab1_open_observations,proj_mod_select,*proj_mo_names)
        project_module_dropdown.configure(font='helvetica 12')
        project_module_dropdown.grid(row=2, column=1,padx=10, pady=10)

    proj_select = StringVar(tab1_open_observations,value='Default Text')
    proj_select.trace('w',update_modules)

    proj_mod_select = StringVar(tab1_open_observations,value='Default Text')
    proj_mod_select.trace('w',update_teams)
    proj_mod_select.trace('w',update_artifacts)

    proj_names = [project[1] for project in projects]
    proj_select.set(proj_names[0])
    project_dropdown = OptionMenu(tab1_open_observations,proj_select,*proj_names)
    project_dropdown.grid(row=1,column=1,padx=10,pady=10)

Я думаю, что проблема в том, как я структурировал свой код, но я считаю, что хорошо разделил код, но я открыт для предложений. это не совсем проблема проверки кода. Моя проблема заключается в перекрывающихся раскрывающихся списках, но я чувствую, что в моем коде есть дублирование, которого я хотел бы избежать. Любая помощь прекрасна. Спасибо.

Я бы хотел, чтобы это было моим желаемым поведением без добавления project_module_dropdown.configure(font='helvetica 12'):

введите здесь описание изображения


person technazi    schedule 12.10.2018    source источник
comment
Попробуйте сократить код до минимально воспроизводимого примера. Например, можете ли вы проиллюстрировать ту же проблему, не создавая собственный стиль? Если это так, то это устранило бы почти две дюжины строк. Обязательно ли использование блокнота с тремя вкладками или можно проиллюстрировать проблему обычной рамкой?   -  person Bryan Oakley    schedule 12.10.2018
comment
Согласовано! Я внес изменения и сделал их минимальными. Причина, по которой я сохраняю вкладки, состоит в том, чтобы дать представление о том, сколько мест мне нужно добавить в строку конфигурации.   -  person technazi    schedule 12.10.2018