0

I am currently facing an issue where I am not able to get a different distinct output from each drop-down menu in Tkinter.

The aim of my code is to get a similar output in the following image attached: "Output of ideal, expected result". enter image description here

However, this is the current result that I am getting, which is attached in:"Current Result". enter image description here

Below is my attached code.

I would greatly appreciate any form of advice or help on this.


import tkinter as tk
from tkinter import ttk

class TestFrame(tk.Frame):
    def __init__(self):
        super().__init__()
        self.dimension =('106','108','110','112','114','126','128','130','132','134','136','138','140','146','148','150','152','154','360','380','400','420','440','500', '520', '540',
                        '560', '580', '600','780','800','820')
        self.option_var = tk.IntVar(self)
        #self.create_widgets()
        #self.create_widgets_1()
        
        paddings = {'padx': 5, 'pady': 5}
        label = ttk.Label(self,  text='Select the dimension for ODD_X1:').grid(column=0, row=0, sticky=tk.W, **paddings)
        #ODD_X1
        option_menu = ttk.OptionMenu(
            self,
            self.option_var,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed)
        option_menu.grid(column=1, row=0, sticky=tk.W, **paddings)
        self.output_label = ttk.Label(self, foreground='red')
        self.output_label.grid(column=0, row=1, sticky=tk.W, **paddings)
        
        paddings = {'padx': 5, 'pady': 5}
        ttk.Label(self,  text='Select the dimension for ODD_Y1:').grid(column=3, row=0, sticky=tk.W, **paddings)
        option_menu = ttk.OptionMenu(
            self,
            self.option_var,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed)
        option_menu.grid(column=4, row=0, sticky=tk.W, **paddings)
        self.output_label = ttk.Label(self, foreground='red')
        self.output_label.grid(column=4, row=1, sticky=tk.W, **paddings)
        
        paddings = {'padx': 5, 'pady': 5}
        ttk.Label(self,  text='Select the dimension for ODD_X2:').grid(column=0, row=3, sticky=tk.W, **paddings)
        option_menu = ttk.OptionMenu(
            self,
            self.option_var,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed)
        option_menu.grid(column=1, row=3, sticky=tk.W, **paddings)
        self.output_label = ttk.Label(self, foreground='red')
        self.output_label.grid(column=0, row=4, sticky=tk.W, **paddings)
        
        paddings = {'padx': 5, 'pady': 5}
        ttk.Label(self,  text='Select the dimension for ODD_Y2:').grid(column=3, row=3, sticky=tk.W, **paddings)
        option_menu = ttk.OptionMenu(
            self,
            self.option_var,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed)
        option_menu.grid(column=4, row=3, sticky=tk.W, **paddings)
        self.output_label = ttk.Label(self, foreground='red')
        self.output_label.grid(column=4, row=5, sticky=tk.W, **paddings)
   
 def option_changed(self, *args):
        self.output_label['text'] = f'You selected: {self.option_var.get()}'

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("800x400")
        self.title('ABC')
        for r in range(5):
            self.rowconfigure(r, weight=1)
        for c in range(8):
            self.columnconfigure(c, weight=1)
        
        self.testFrame1 = TestFrame()
        self.testFrame1.grid(row=0, column=0, rowspan=3, columnspan=3, sticky='nsew')
App().mainloop()
1
  • 1
    You have assigned the same variable to all 4 option menus. I t is being constantly updated as you select an option. Commented Jun 9, 2021 at 3:06

1 Answer 1

1

The Issue: All of your option menus have the same variable self.option_menu. When you select any option, it updates the variable. Hence, the best option is to change the variable.

import tkinter as tk
from tkinter import ttk

class TestFrame(tk.Frame):
    def __init__(self):
        super().__init__()
        self.dimension =('106','108','110','112','114','126','128','130','132','134','136','138','140','146','148','150','152','154','360','380','400','420','440','500', '520', '540',
                        '560', '580', '600','780','800','820')
        self.option_var = tk.IntVar(self)
        self.option_var1 = tk.IntVar(self)
        self.option_var2 = tk.IntVar(self)
        self.option_var3 = tk.IntVar(self)
        #self.create_widgets()
        #self.create_widgets_1()
        
        paddings = {'padx': 5, 'pady': 5}
        label = ttk.Label(self,  text='Select the dimension for ODD_X1:').grid(column=0, row=0, sticky=tk.W, **paddings)
        #ODD_X1
        option_menu = ttk.OptionMenu(
            self,
            self.option_var,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed)
        option_menu.grid(column=1, row=0, sticky=tk.W, **paddings)
        self.output_label = ttk.Label(self, foreground='red')
        self.output_label.grid(column=0, row=1, sticky=tk.W, **paddings)
        
        paddings = {'padx': 5, 'pady': 5}
        ttk.Label(self,  text='Select the dimension for ODD_Y1:').grid(column=3, row=0, sticky=tk.W, **paddings)
        option_menu = ttk.OptionMenu(
            self,
            self.option_var1,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed1)
        option_menu.grid(column=4, row=0, sticky=tk.W, **paddings)
        self.output_label1 = ttk.Label(self, foreground='red')
        self.output_label1.grid(column=4, row=1, sticky=tk.W, **paddings)
        
        paddings = {'padx': 5, 'pady': 5}
        ttk.Label(self,  text='Select the dimension for ODD_X2:').grid(column=0, row=3, sticky=tk.W, **paddings)
        option_menu = ttk.OptionMenu(
            self,
            self.option_var2,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed2)
        option_menu.grid(column=1, row=3, sticky=tk.W, **paddings)
        self.output_label2 = ttk.Label(self, foreground='red')
        self.output_label2.grid(column=0, row=4, sticky=tk.W, **paddings)
        
        paddings = {'padx': 5, 'pady': 5}
        ttk.Label(self,  text='Select the dimension for ODD_Y2:').grid(column=3, row=3, sticky=tk.W, **paddings)
        option_menu = ttk.OptionMenu(
            self,
            self.option_var3,
            self.dimension[0],
            *self.dimension,
            command=self.option_changed3)
        option_menu.grid(column=4, row=3, sticky=tk.W, **paddings)
        self.output_label3 = ttk.Label(self, foreground='red')
        self.output_label3.grid(column=4, row=4, sticky=tk.W, **paddings)
   
    def option_changed(self, *args):
        self.output_label['text'] = f'You selected: {self.option_var.get()}'
    def option_changed1(self, *args):
        self.output_label1['text'] = f'You selected: {self.option_var1.get()}'
    def option_changed2(self, *args):
        self.output_label2['text'] = f'You selected: {self.option_var2.get()}'
    def option_changed3(self, *args):
        self.output_label3['text'] = f'You selected: {self.option_var3.get()}'

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("800x400")
        self.title('ABC')
        for r in range(5):
            self.rowconfigure(r, weight=1)
        for c in range(8):
            self.columnconfigure(c, weight=1)
        
        self.testFrame1 = TestFrame()
        self.testFrame1.grid(row=0, column=0, rowspan=3, columnspan=3, sticky='nsew')
App().mainloop()
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you so much for your help. It is able to work already!
Happy to help, Welcome @etfl2021

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.