On 1/7/2021 4:20 AM, Terry Reedy wrote:
On 1/7/2021 2:42 AM, Christian Gollwitzer wrote:
Am 07.01.21 um 08:29 schrieb Paulo da Silva:
Does anybody know why cmd method isn't called when I change the button
state (clicking on it) in this example?
I know that this seems a weird class use. But why doesn't it work?
Thanks.
class C:
from tkinter import Checkbutton
import tkinter
@staticmethod
^^it works if you remove the staticmethod here
staticmethods are essentially useless in Python. What little was gained
by their addition is partly offset by the introduced confusion.
def cmd():
print("Test")
The confusion is that methods are callable, whereas 'staticmethods' are
not. I was not completely aware of this until pointed out by Peter
Otten with example
" cmd()
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
class C:
File "<pyshell#28>", line 4, in C
cmd()
TypeError: 'staticmethod' object is not callable
You have to go through the descriptor protocol:"
Indeed, dir(cmd) shows that it does not have a .__call__ attribute.
top=tkinter.Tk()
cb=Checkbutton(command=cmd)
Button commands have to be tcl functions. Tkinter wraps Python
functions as tcl function. Static methods also wrap python functions,
as a .__func__ attribute. So the code if one passes cmd.__func__.
"So the code works if one passes the callable cmd.__func__."
Maybe there is a bug in tkinter, that it doesn't work with static
methods?
One could propose that tkinter test whether callables are staticmethods
Command options, as documented, must be callables. Neither staticmethods
nor classmethods are callable.
and unwrap them when they are.
I would propose instead that if possible tkinter raise TypeError when
passed a non-callable as a command.
Classmethods also do not work as is. By experiment, the following works.
cb=Checkbutton(command=lambda: C.cmd.__func__(C))
But if the class were nested, it would be more complicated.
--
Terry Jan Reedy
--
https://mail.python.org/mailman/listinfo/python-list