Tkinter checkbuttons and variables

G

Gigs_

from Tkinter import *

states = []

def onpress(i):
states = not states


root = Tk()
for i in range(10):
chk = Checkbutton(root, text= str(i), command=lambda i=i:
onpress(i))
chk.pack(side=LEFT)
states.append(0)
root.mainloop()
print states

after exiting i get everything like it suppose to but when i put command
like this:
command=lambda: onpress(i)
i got only last checkbutton check.

Why i have to pass this default argument?


btw i have python 2.5
thx
 
D

Diez B. Roggisch

Gigs_ said:
from Tkinter import *

states = []

def onpress(i):
states = not states


root = Tk()
for i in range(10):
chk = Checkbutton(root, text= str(i), command=lambda i=i: onpress(i))
chk.pack(side=LEFT)
states.append(0)
root.mainloop()
print states

after exiting i get everything like it suppose to but when i put command
like this:
command=lambda: onpress(i)
i got only last checkbutton check.

Why i have to pass this default argument?


Because python creates a closure around the lambda that allows
expressions inside the lambda to access surrounding variables. However,
these variables are looked up at _runtime_, when the command is actually
executed. Naturally, the value of i then is 9, because that's what it
has been assigned in the last loop iteration.

Diez
 
E

Eric Brunel

from Tkinter import *

states = []

def onpress(i):
states = not states


root = Tk()
for i in range(10):
chk = Checkbutton(root, text= str(i), command=lambda i=i:
onpress(i))
chk.pack(side=LEFT)
states.append(0)
root.mainloop()
print states

after exiting i get everything like it suppose to but when i put command
like this:
command=lambda: onpress(i)
i got only last checkbutton check.

Why i have to pass this default argument?


I'm basically not answering your question here, but the usual way to get a
checkbuttons's state is as follows:

states = []
root = Tk()
for i in range(10):
stateVar = BooleanVar()
chk = Checkbutton(root, text=str(i), variable=stateVar)
chk.pack(side=LEFT)
states.append(stateVar)
root.mainloop()
print [v.get() for v in states]

If you want to get the value of one of your states, use the get() method
on BooleanVar. If you want to change such a state, use the set(value)
method.

HTH
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,905
Latest member
Kristy_Poole

Latest Threads

Top