How to tell which OptionMenu was changed using python and tkinter

37 views Asked by At

I am building a spreadsheet of sorts. One of the columns has an OptionMenu in each cell. Each OptionMenu has its own class member StringVar (in an array) associated with it. All OptionMenus use a single callback. How do I know which OptionMenu (and its associated StringVar) was selected?

    self.event_option_string_var = []
 .
 .
 .

        for col in range(HeaderCol.MAX_COL):
            if col == TransactionsGrid.DATE_COL.col:
                widget = DateEntry(self.frame_main, selectmode='day')
                widget.grid(row=1, column=1, padx=0)
                Entry(widget).configure(highlightthickness=0)
            elif col == TransactionsGrid.EVENT_COL.col:
                string_var = StringVar(self.root)
                string_var.set('Select an Event')
                self.event_option_string_var.append(string_var)
                widget = OptionMenu(self.frame_main, string_var,
                                    string_var,
                                    *TenantEvent.TENANT_EVENTS,
                                    command=self.option_changed)

            else:
                widget = Entry(self.frame_main)
                widget.configure(highlightthickness=0)
            button_row.append(widget)
            widget.grid(column=col, row=row + 2, sticky="")

 .
 .
 .


def option_changed(self, *args):
    self.event_option_string_var['text'] = f'You selected: {self.event_option_string_var.get()}'
1

There are 1 answers

1
jordanthompson On

@karl knechtel solved this for me (I completely forgot about partial!)

Here is how I handled it:

from functools import partial
.
.
.
                string_var = StringVar(self.root)
                string_var.set('Select an Event')
                widget = OptionMenu(self.frame_main, string_var,
                                    'Change me',
                                    *TenantEvent.TENANT_EVENTS,
                                    command=partial(self.option_changed, row))

and in the callback:

def option_changed(self, *args):
    print(f'row is: {args[0]}, values is:{args[1]}')