Class and tkinter problem
Paulo da Silva
p_d_a_s_i_l_v_a_ns at nonetnoaddress.pt
Thu Jan 7 20:30:15 EST 2021
Às 20:35 de 07/01/21, Terry Reedy escreveu:
> 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.
>Yes, that would be much better.
Thanks.
More information about the Python-list
mailing list