[issue45160] ttk.OptionMenu radiobuttons change variable value twice

2021-09-10 Thread fhdrsdg


New submission from fhdrsdg :

Found when trying to answer this SO question: 
https://stackoverflow.com/questions/53171384/tkinter-function-repeats-itself-twice-when-ttk-widgets-are-engaged

The ttk.OptionMenu uses radiobuttons for the dropdown menu, whereas the 
tkinter.OptionMenu uses commands. Both of them use `_setit` as command, 
presumably first used for tkinter and then copied to the ttk implementation. 
The `_setit` does two things: changing the associated `variable` and calling 
the associated callback function. This is needed for the tkinter.OptionMenu 
since commands don't support changing a `variable`.

However, for the ttk.OptionMenu an additional reference to the variable was 
added to the radiobutton following this issue: 
https://bugs.python.org/issue25684. This was needed to group radiobuttons, but 
now leads to the variable being changed twice: once by the radiobutton and once 
through `_setit`. When tracing the variable this leads to the tracing callback 
being called twice on only one change of the OptionMenu.

The solution is to not use `_setit` for the radiobutton command but instead 
just use `command=self._callback`

--
components: Tkinter
messages: 401557
nosy: fhdrsdg
priority: normal
severity: normal
status: open
title: ttk.OptionMenu radiobuttons change variable value twice
type: behavior
versions: Python 3.10, Python 3.11, Python 3.6, Python 3.7, Python 3.8, Python 
3.9

___
Python tracker 
<https://bugs.python.org/issue45160>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45160] ttk.OptionMenu radiobuttons change variable value twice

2021-09-11 Thread fhdrsdg


fhdrsdg  added the comment:

Ah yes, you're right that `command=self._callback` doesn't pass the new value 
like it should.
Your suggestion does, but throws a "TypeError: 'NoneType' object is not 
callable" when no command is given when creating the OptionMenu. The current 
`_setit` implementation uses a `if self.__callback:` check for that.

Should we do something like this?

for val in values:
menu.add_radiobutton(label=val,
variable=self._variable)
if self._callback:
menu.entryconfigure('last', command=lambda val=val: self._callback(val))


I don't have any experience making pull requests. I might look into it at some 
point but for now it would be great if you could make it.

--

___
Python tracker 
<https://bugs.python.org/issue45160>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com