Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #5905
| From | Peter Otten <__peter__@web.de> |
|---|---|
| Newsgroups | comp.lang.python |
| Subject | Re: TK program problem |
| Followup-To | comp.lang.python |
| Date | 2011-05-21 10:18 +0200 |
| Organization | None |
| Message-ID | <ir7shb$dd8$1@solani.org> (permalink) |
| References | <9f91909a-ce08-47dd-81d3-e7cf2edad3b6@h12g2000pro.googlegroups.com> |
Followups directed to: comp.lang.python
bvdp wrote:
> I've just done an update to my system here to Ubuntu 11.04. Mostly no
> problems ... but I have an important (to me) python/TK program that's
> stopped working. Well, it works ... mostly.
>
> The python version is 2.7.1+ (no idea what the + means!).
>
> I _think_ I have traced the problem to certain menus which call a
> class. The calls appear to be ignored.
>
> Basically, what I have is a line like:
>
> bf = makeButtonBar(root, row=0, column=0, buttons=(
> ("Quit", self.quitall ),
> ("Stop", self.stopPmidi ),
> ("New Dir", self.chd),
> ("Load Playlist", self.playList),
> ("Favorites", selectFav),
> ("Options", setOptions) ) )
>
> To create a menu bar. The function makeButtonBar() creates the buttons
> with:
>
> for txt, cmd in buttons:
> Button(bf, text=txt, height=1, command=cmd).grid(column=c,
> row=0, pady=5)
>
>
> All this is fine (and worked perfectly before my upgrade). The menu
> items which are ordinary functions continue to work. BUT the callbacks
> which are classes are just ignored when they are clicked.
>
> A cut from one of the ignored classes:
>
>
> class selectFav:
>
> def __init__(self):
> ...
>
> And I've inserted some prints in the __init__() and nothing is
> printed. Also, converted the class to new-style () but no change there
> either.
>
> Either python/tk has changed or my system is totally $*(#*#.
> Suggestions welcome!
Here's a minimal script to reproduces the problem:
$ cat tkcallclass.py
import Tkinter as tk
root = tk.Tk()
root.withdraw()
class Classic:
def __init__(self):
print "hello"
button = tk.Button(root, command=Classic)
button.invoke()
$ python2.6 tkcallclass.py
hello
$ python2.7 tkcallclass.py
Traceback (most recent call last):
File "tkcallclass.py", line 11, in <module>
button.invoke()
File "/usr/local/lib/python2.7/lib-tk/Tkinter.py", line 2081, in invoke
return self.tk.call(self._w, 'invoke')
_tkinter.TclError: invalid command name "__main__.Classic"
$
In 2.7 the Tkinter code was changed to use hasattr(obj, "__call__") instead
of callable(obj) to recognize callbacks. This gives different results for
oldstyle classes
>>> class A: pass
...
>>> callable(A)
True
>>> hasattr(A, "__call__")
False
...and they are no longer registered automatically with Tkinter. In theory
you could register them explicitly yourself
$ cat tkcallclass2.py
import Tkinter as tk
root = tk.Tk()
root.withdraw()
class Classic:
def __init__(self):
print "hello"
button = tk.Button(root, command=root.register(Classic))
button.invoke()
$ python2.7 tkcallclass2.py
hello
but in practice changing them to newstyle (i. e. have them inherit from
object) or wrapping them in a lambda appears convenient.
Personally, I would reconsider whether using a class as a callback is really
necessary. Replacing the class with a function should be a straightforward
process.
Back to comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
TK program problem bvdp <bob@mellowood.ca> - 2011-05-20 11:03 -0700
Re: TK program problem Ian Kelly <ian.g.kelly@gmail.com> - 2011-05-20 13:20 -0600
Re: TK program problem bvdp <bob@mellowood.ca> - 2011-05-20 15:12 -0700
Re: TK program problem Ian Kelly <ian.g.kelly@gmail.com> - 2011-05-20 16:33 -0600
Re: TK program problem bvdp <bob@mellowood.ca> - 2011-05-20 16:07 -0700
Re: TK program problem Ian Kelly <ian.g.kelly@gmail.com> - 2011-05-20 17:29 -0600
Re: TK program problem bvdp <bob@mellowood.ca> - 2011-05-20 16:34 -0700
Re: TK program problem rantingrick <rantingrick@gmail.com> - 2011-05-20 16:37 -0700
Re: TK program problem bvdp <bob@mellowood.ca> - 2011-05-21 17:07 -0700
Re: TK program problem Peter Otten <__peter__@web.de> - 2011-05-21 10:18 +0200
Re: TK program problem bvdp <bob@mellowood.ca> - 2011-05-21 17:03 -0700
Re: TK program problem Terry Reedy <tjreedy@udel.edu> - 2011-05-21 20:33 -0400
Re: TK program problem bvdp <bob@mellowood.ca> - 2011-05-21 19:20 -0700
Re: TK program problem Terry Reedy <tjreedy@udel.edu> - 2011-05-22 17:17 -0400
Re: TK program problem rantingrick <rantingrick@gmail.com> - 2011-05-22 07:03 -0700
Re: TK program problem Chris Angelico <rosuav@gmail.com> - 2011-05-23 00:25 +1000
csiph-web