From: rantingrick on
On Jun 9, 11:26 am, Dodo <dodo_do_not_wake...(a)yahoo.Fr> wrote:
> Hello,
>
> I trying to make this piece of code work (this is python3)
>
> from tkinter import *
> from tkinter.ttk import *
>
> class Window:
>   def __init__(self):
>    self.root = Tk()
>
>    self.menu = Menu(self.root)
>    self.root['menu'] = self.menu
>
>    self.submenu = Menu(self.menu)
>    self.ck = 0
>    self.submenu.add_checkbutton(label="My checkbutton",
> variable=self.ck, command=self.displayCK)
>    self.menu.add_cascade(label="sub", menu=self.submenu )
>
>   def displayCK(self):
>    print( self.ck )
>
> app = Window()
> app.root.mainloop()


see my recent post on your last question. The way you are writing
these classes is wrong. Always inherit from something, in this case
Tk. Fix that first and then pretty up this GUI. But to answer your
question "self.ck" needs to be an instance of tk.IntVar. Read more
about it here...

http://infohost.nmt.edu/tcc/help/pubs/tkinter/checkbutton.html
From: Terry Reedy on
On 6/9/2010 12:26 PM, Dodo wrote:
> Hello,
>
> I trying to make this piece of code work (this is python3)
>
> from tkinter import *
> from tkinter.ttk import *
>
> class Window:
> def __init__(self):
> self.root = Tk()
>
> self.menu = Menu(self.root)
> self.root['menu'] = self.menu
>
> self.submenu = Menu(self.menu)
> self.ck = 0
> self.submenu.add_checkbutton(label="My checkbutton", variable=self.ck,
> command=self.displayCK)
> self.menu.add_cascade(label="sub", menu=self.submenu )
>
> def displayCK(self):
> print( self.ck )
>
> app = Window()
> app.root.mainloop()
>
> The self.ck will always be 0... why?

You never change it ;-)
Passing the *value* 0 to the widget has no effect on the binding of
self.ck. You need to pass a container whose contents the widget can
modify == specifically an IntVar. See 24.1.6.4. Coupling Widget Variables.

Terry Jan Reedy


From: rantingrick on
On Jun 9, 11:26 am, Dodo <dodo_do_not_wake...(a)yahoo.Fr> wrote:
<snip>

Also you are now NOT using 8 space indention unlike your last post --
which i applaud you for. However you've gone to the opposite extreme
with 2 space indention and interlaced it with one space indention, oh
dear!

Please use four space indention as this is the preferred and excepted
way to write python code. If you plan to write code that other Python
programmers see you should read the Python style guide and follow it.
Heres a link

http://www.python.org/dev/peps/pep-0008/
From: Dodo on
Le 09/06/2010 18:54, rantingrick a �crit :
> On Jun 9, 11:26 am, Dodo<dodo_do_not_wake...(a)yahoo.Fr> wrote:
>> Hello,
>>
>> I trying to make this piece of code work (this is python3)
>>
>> from tkinter import *
>> from tkinter.ttk import *
>>
>> class Window:
>> def __init__(self):
>> self.root = Tk()
>>
>> self.menu = Menu(self.root)
>> self.root['menu'] = self.menu
>>
>> self.submenu = Menu(self.menu)
>> self.ck = 0
>> self.submenu.add_checkbutton(label="My checkbutton",
>> variable=self.ck, command=self.displayCK)
>> self.menu.add_cascade(label="sub", menu=self.submenu )
>>
>> def displayCK(self):
>> print( self.ck )
>>
>> app = Window()
>> app.root.mainloop()
>
>
> see my recent post on your last question. The way you are writing
> these classes is wrong. Always inherit from something, in this case
> Tk. Fix that first and then pretty up this GUI. But to answer your
> question "self.ck" needs to be an instance of tk.IntVar. Read more
> about it here...
>
> http://infohost.nmt.edu/tcc/help/pubs/tkinter/checkbutton.html

I already tried with self.ck = IntVar()
and now it displays PY_VAR0

FYI, I'm using Thunderbird 3, which appears to have some bugs with
indentation (according to Alf P. Steinbach). That's why I replaced \t by
a single space
From: rantingrick on
On Jun 9, 12:20 pm, Dodo <dodo_do_not_wake...(a)yahoo.Fr> wrote:
> Le 09/06/2010 18:54, rantingrick a crit :
>
>
>
>
>
> > On Jun 9, 11:26 am, Dodo<dodo_do_not_wake...(a)yahoo.Fr>  wrote:
> >> Hello,
>
> >> I trying to make this piece of code work (this is python3)
>
> >> from tkinter import *
> >> from tkinter.ttk import *
>
> >> class Window:
> >>    def __init__(self):
> >>     self.root = Tk()
>
> >>     self.menu = Menu(self.root)
> >>     self.root['menu'] = self.menu
>
> >>     self.submenu = Menu(self.menu)
> >>     self.ck = 0
> >>     self.submenu.add_checkbutton(label="My checkbutton",
> >> variable=self.ck, command=self.displayCK)
> >>     self.menu.add_cascade(label="sub", menu=self.submenu )
>
> >>    def displayCK(self):
> >>     print( self.ck )
>
> >> app = Window()
> >> app.root.mainloop()
>
> > see my recent post on your last question. The way you are writing
> > these classes is wrong. Always inherit from something, in this case
> > Tk. Fix that first and then pretty up this GUI. But to answer your
> > question "self.ck" needs to be an instance of tk.IntVar. Read more
> > about it here...
>
> >      http://infohost.nmt.edu/tcc/help/pubs/tkinter/checkbutton.html
>
> I already tried with self.ck = IntVar()
> and now it displays PY_VAR0
>
> FYI, I'm using Thunderbird 3, which appears to have some bugs with
> indentation (according to Alf P. Steinbach). That's why I replaced \t by
> a single space

IntVar is a class and self.ck is an instance of that class which is a
PY_VAR. Try print(dir(self.ck)) in your callback to see what methods
are available to this instance. Im just speculating here but somehow
there must be a way to "get" and "set" the IntVar's value... hmmm?

You're about to kick yourself when you realize it. ;-)