2

This is a pretty general question about the optionmenu widget in tkinter.

When defining an OptionMenu widget, and assigning a function as its command, why does it require an argument?

My code:

from tkinter import *

def update():
    x = optionvar.get()
    x = str(x)
    mylabel.config(text=x)

root = Tk()

l = []
for n in range(10):
    l.append(n)

t = tuple(l)

optionvar = IntVar()

optionvar.set('hello stackoverflow')

mymenu  = OptionMenu(root, optionvar, *t, command=update)
mylabel = Label(root)

mymenu.pack()
mylabel.pack()

My errors:

TypeError: update() takes 0 positional arguments but 1 was given

Simply defining update with

def update(foo):

seems to work. But why?

1 Answer 1

5

The callback usually wants to know which item was selected, so the value of the IntVar is passed as an argument. If you want to ignore that argument, you can simply use a lambda (_ is a valid name that is commonly used to indicate that it is a throwaway variable):

mymenu = OptionMenu(root, optionvar, *t, command=lambda _: update())
Sign up to request clarification or add additional context in comments.

6 Comments

Thank you! Was going to have a hard time explaining to my teacher why I passed an unused variable...
Say if I wanted to use this functionality for a button instead, how could I pass the button itself as an argument (a calculator for example)?
Here is an answer that tells you how to do just that.
What you say about how it works is incorrect: It doesn't pass the OptionMenu instance to the function as an argument, it passes the value associated with the menu item that was selected (an int in this case).
@martineau: I can't believe I went so far as to post an answer without testing. I stand corrected.
|

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.