classification
Title: tkinter button colors on Mac
Type: behavior Stage: resolved
Components: macOS, Tkinter Versions: Python 3.11, Python 3.10, Python 3.9
process
Status: closed Resolution: third party
Dependencies: Superseder:
Assigned To: Nosy List: epaine, markroseman, ned.deily, rhettinger, ronaldoussoren, serhiy.storchaka, taleinat, terry.reedy
Priority: normal Keywords:

Created on 2021-05-27 01:56 by terry.reedy, last changed 2021-05-28 01:03 by terry.reedy. This issue is now closed.

Messages (11)
msg394506 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2021-05-27 01:56
Mac Mohave, 3.9 with 8.6.8 and 3.10 with 8.6.11

import tkinter as tk
r = tk.Tk()
b = tk.Button(r, text='START', fg='white', bg='red')  # Or '#f00'.
b.pack()
r.mainloop()

On Windows, white on red button, as expected.  On Mac, all white until one presses and holds mouse, and then blue background.  Default black on white works OK.

This may be new since several years ago, when 2 of us worked on turtle demo, which has 3 such buttons.  They all now misbehave (reported by Raymond).  If someone tested on Mac, it must have worked then.

I retried with the b= line replaced with

s = ttk.Style()
s.configure('Td.TButton', foreground='white', background='red')
b = ttk.Button(r, text='START', style='Td.TButton')

with the same result.  (Mark, did I get this right?)
msg394513 - (view) Author: Tal Einat (taleinat) * (Python committer) Date: 2021-05-27 05:48
FWIW this also behaves as expected on Ubuntu 20.04 with both Python 3.8 and 3.10.
msg394521 - (view) Author: Tal Einat (taleinat) * (Python committer) Date: 2021-05-27 08:30
Confirmed on macOS.

This bugs also affects the underlying Tcl/Tk, confirmed with 8.6.11.

To reproduce:

$ wish
% button .b -text START -bg red -fg white
.b
% pack .b
msg394522 - (view) Author: Tal Einat (taleinat) * (Python committer) Date: 2021-05-27 09:12
I've created an issue about this on the Tcl/Tk issue tracker:

https://core.tcl-lang.org/tk/tktview/46274a117823fd65c6d98d38465b43165d0c4680
msg394526 - (view) Author: E. Paine (epaine) * Date: 2021-05-27 09:52
Does the activebackground option fix this? E.g.

r = tk.Tk()
b = tk.Button(r, fg="white", bg="red", activebackground="red")
b.pack()
r.mainloop()
msg394534 - (view) Author: Tal Einat (taleinat) * (Python committer) Date: 2021-05-27 10:22
Thanks for helping with this, E. Paine!

Unfortunately, no, adding activebackground='red' doesn't help, even directly in a wish shell.
msg394585 - (view) Author: Tal Einat (taleinat) * (Python committer) Date: 2021-05-27 18:46
The Tcl/Tk devs have closed the issue I opened on their issue tracker as "not a bug", with the following comment:

"Because Tk on the Mac uses API's to draw buttons, some configuration options are set by the OS and not by Tk. This is documented in the button man page: "On Aqua/Mac OS X, some configuration options are ignored for the purpose of drawing of the widget because they would otherwise conflict with platform guidelines. The configure and cget subcommands can still manipulate the values, but do not cause any variation to the look of the widget. The options affected notably include -background and -relief." Closing this ticket as not a bug."
msg394586 - (view) Author: Tal Einat (taleinat) * (Python committer) Date: 2021-05-27 18:48
It appears that this behavior is the intended behavior of Tk on macOS.  Given that tkinter is meant to be a relatively straightforward wrapping of Tcl/Tk, it seems to me that we too should consider this not to be a bug, and resolve this issue as "won't fix".
msg394596 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2021-05-27 20:47
"The configure and cget subcommands can still manipulate the values, but do not cause any variation to the look of the widget." is wrong.  Setting the foreground color *does* change the unpressed foreground color, so that 'white' becomes 'white on white'.  I consider not being more explicit about which options are or or not fixed, or at least not warning about foreground, to be a doc buglet.  What a trap for someone trying to make a cross-platform dark theme.  But their docs are theirs.

And our docs are ours.  We can't change external tk or ttk docs, but how about adding the following to the our ttk doc, just above 'Combobox'?

Button

On macOS, the pressed colors are fixed as white on blue.  The background is otherwise fixed as white.  So an attempt at white on dark results in white on white.
msg394598 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2021-05-27 20:51
#44254 is a followup to change turtledemo unpressed button colors to something on white.
msg394618 - (view) Author: Mark Roseman (markroseman) * Date: 2021-05-27 23:40
Let it go. Changing the Python docs to a behaviour that isn't guaranteed by the underlying library is a virtual guarantee that a later version of Tk (or even the way the API it uses behaves on another version of macOS) will have some other (unrelated) modifications that change the current behaviour to something else.
History
Date User Action Args
2021-05-28 01:03:09terry.reedysetstatus: open -> closed
resolution: third party
stage: needs patch -> resolved
2021-05-27 23:40:07markrosemansetmessages: + msg394618
2021-05-27 20:51:07terry.reedysetmessages: + msg394598
2021-05-27 20:47:55terry.reedysettype: behavior
messages: + msg394596
stage: needs patch
2021-05-27 18:48:41taleinatsetmessages: + msg394586
2021-05-27 18:46:21taleinatsetmessages: + msg394585
2021-05-27 10:22:43taleinatsetmessages: + msg394534
2021-05-27 09:52:58epainesetnosy: + epaine
messages: + msg394526
2021-05-27 09:12:22taleinatsetmessages: + msg394522
2021-05-27 08:30:54taleinatsetmessages: + msg394521
2021-05-27 05:48:54taleinatsetmessages: + msg394513
2021-05-27 01:56:25terry.reedysetnosy: + serhiy.storchaka
2021-05-27 01:56:01terry.reedycreate