-1

The code is correct (and very interesting indeed - From stackoverlflow, because facilitate working comboboxes in classes!). The code is a little long, but just to create the structure to make combobox work in this parent, controler, container model. On the other hand,comoboboxes are "burning my brains out". The hard part: I can reset the lower combobox clicking the button. But I need to reset it to 'I´m your friend' just choosing any option in upper combobox (without use of button). I've tried insert "self.combobox_HPFilter.set('I´m your friend')" in a function and insert this in the functions called "make_guess", unfortunately unsuccessfuly. I really appreciate any help.

# from Bryan Oakley and others from the "amazing" Stackoverflow 
# https://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter/7557028#7557028

import tkinter as tk                # python 3
from tkinter import font as tkfont  # python 3
from tkinter import ttk

class SampleApp(tk.Tk):
    '''
    All the code is working.The sole issue is: to reset second combobox text direct from options in upper combobox 
    '''
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):
    def make_guess01(self):
        print("I've got a cute friend")

    def make_guess02(self):
        print('Ned is correct')
        
    def make_guess03(self):
        print('Patrick')

    def make_guess04(self):
        print('Best Hommer friend')
        
    def labels_reset(self):
        self.combobox_HPFilter.set('I´m your friend')
        
    #-------------------------first combobox start       
    def change_Montage_combobox(self, event):  # this method goes inside def montage_Combo(self):
    
        myvar = (self.comboboxMontages.get()) 
        # lines 1 2 3 4 say that values(function_name) in montageDict are functions in StartPage
        function_name = self.montagesDict[myvar]  #1 returns the function(method) in montageDic(value of key:value pair)
        # just for reference:   print(function_name)--> montage_Original (dictionary montagesDict value)
        an_object = StartPage(self, tk.Frame)  # 2--> the page (class) where function is
        class_method = getattr(StartPage, function_name)  # 3  returns method and says the page of the method
        result = class_method(an_object)  # 4  result is the method right for use

    def montage_Combo(self):
        self.montage_selector = tk.StringVar()
        self.comboboxMontages = ttk.Combobox(self, values=sorted(list(self.montagesDict.keys())),
                                                justify="center", textvariable=self.montage_selector, state="readonly",
                                                )
        self.comboboxMontages.bind('<<ComboboxSelected>>', lambda event: self.change_Montage_combobox(event))
        self.comboboxMontages.pack()
        self.comboboxMontages.set('Who is my friend')
        
    #-------------------------first combobox end
    #-------------------------second combobox start
    def highPassFilter_Change_combobox(self, event):  # this method goes inside def montage_Combo(self):

        myvar = (self.combobox_HPFilter.get())
        function_name = self.highPassFilterDict[myvar]  # 1
        an_object = StartPage(self, tk.Frame)  # 2
        class_method = getattr(StartPage, function_name)  # 3
        highPassFilter_result = class_method(an_object)  # 4

    def highPassFilter_Combo(self):
        self.highPassFilter_selector = tk.StringVar()
        self.combobox_HPFilter = ttk.Combobox(self, values=sorted(list(self.highPassFilterDict.keys())),
                                                justify="center", textvariable=self.highPassFilter_selector,
                                                state="readonly")
        self.combobox_HPFilter.bind('<<ComboboxSelected>>', lambda event: self.highPassFilter_Change_combobox(event))
        self.combobox_HPFilter.pack()
        self.combobox_HPFilter.set('I´m your friend')
    #-------------------------second combobox end

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        
        self.montagesDict = {'SpongeBob': 'make_guess01', 
                                'Hommer': 'make_guess02'
                                }   

        self.highPassFilterDict = {'Patrick': 'make_guess03',
                                    'Ned Flanders': 'make_guess04',
                                    }

        label = tk.Label(self, text="This is the start page", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        button1 = tk.Button(self, text="how reset lower combobox clicking upper combobox?",
                            command=self.labels_reset)
        button1.pack()
        self.montage_Combo()
        self.highPassFilter_Combo()

#class PageOne just to make code play        
class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is page 1", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                            command=lambda: controller.show_frame("StartPage"))
        button.pack()

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()
Sylvester Kruin
  • 3,294
  • 5
  • 16
  • 39
pkanda
  • 151
  • 3
  • 10

2 Answers2

0

Python is both challenging and exciting, it seems a zen Koan. After "lots of try an error" and frustration...comes the light.

import tkinter as tk                # python 3
from tkinter import font as tkfont  # python 3
from tkinter import ttk

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):
    def make_guess01(self):
        print("I've got a cute friend")

    def make_guess02(self):
        print('Ned is correct')
        
    def make_guess03(self):
        print('Patrick')

    def make_guess04(self):
        print('Best Hommer friend')
        
    def labels_reset(self):
        self.combobox_HPFilter.set('I´m your friend')
        
#-------------------------first combobox start       
    def change_Montage_combobox(self, event):  # this method goes inside def montage_Combo(self):
 
        myvar = (self.comboboxMontages.get()) 
        # lines 1 2 3 4 say that values(function_name) in montageDict are functions in StartPage
        function_name = self.montagesDict[myvar]  #1 returns the function(method) in montageDic(value of key:value pair)
        # just for reference:   print(function_name)--> montage_Original (dictionary montagesDict value)
        an_object = StartPage(self, tk.Frame)  # 2--> the page (class) where function is
        class_method = getattr(StartPage, function_name)  # 3  returns method and says the page of the method
        result = class_method(an_object)  # 4  result is the method right for use
        

        #################################
        #  answer:                      #
        #################################
        if self.combobox_HPFilter != '':
            self.labels_reset()
        else:
            pass



    def montage_Combo(self):
        self.montage_selector = tk.StringVar()
        self.comboboxMontages = ttk.Combobox(self, values=sorted(list(self.montagesDict.keys())),
                                             justify="center", textvariable=self.montage_selector, state="readonly",
                                             )
        self.comboboxMontages.bind('<<ComboboxSelected>>', lambda event: self.change_Montage_combobox(event))
        self.comboboxMontages.pack()
        self.comboboxMontages.set('Who is my friend')
        
    #-------------------------first combobox end
    #-------------------------second combobox start
    def highPassFilter_Change_combobox(self, event):  # this method goes inside def montage_Combo(self):

        myvar = (self.combobox_HPFilter.get())
        function_name = self.highPassFilterDict[myvar]  # 1
        an_object = StartPage(self, tk.Frame)  # 2
        class_method = getattr(StartPage, function_name)  # 3
        highPassFilter_result = class_method(an_object)  # 4
        
        
    def highPassFilter_Combo(self):
        self.highPassFilter_selector = tk.StringVar()
        self.combobox_HPFilter = ttk.Combobox(self, values=sorted(list(self.highPassFilterDict.keys())),
                                              justify="center", textvariable=self.highPassFilter_selector,
                                              state="readonly")
        self.combobox_HPFilter.bind('<<ComboboxSelected>>', lambda event: self.highPassFilter_Change_combobox(event))
        self.combobox_HPFilter.pack()
        self.combobox_HPFilter.set('I´m your friend')
        
        
    def all_ComboBox_labels_reset(self):
        self.combobox_HPFilter.set('I´m your friend')
    #-------------------------second combobox start

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        
        self.montagesDict = {'SpongeBob': 'make_guess01', 
                             'Hommer': 'make_guess02'
                             }   

        self.highPassFilterDict = {'Patrick': 'make_guess03',
                                   'Ned Flanders': 'make_guess04',
                                  }

        label = tk.Label(self, text="This is the start page")
        label.pack(side="top", fill="x", pady=10)
        button1 = tk.Button(self, text="how reset lower combobox clicking upper combobox?",
                            command=self.labels_reset)
        button1.pack()
        self.montage_Combo()
        self.highPassFilter_Combo()

#class PageOne just to make code play        
class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is page 1")
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.pack()

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

I used method self.combobox_HPFilter != '': because in my code there are multiple comboboxes to be reseted. "If" because at beginnig of script they are empty.

pkanda
  • 151
  • 3
  • 10
0

Excuse me I dont get the (-1)in my question, it is a question. It was usefull to me a beginner and no one answered until I found the answer. Indulge me and be more proactive explaining it. Best.

pkanda
  • 151
  • 3
  • 10