[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

tkinter (ttk) combobox dropdown text is white on white

Oops, I hit "reply" instead of "reply-list" last time.? Trying again...

On 06/03/2018 02:01 PM, Christian Gollwitzer wrote:
> Am 03.06.18 um 21:54 schrieb Jim Lee:> import tkinter as tk
>> from tkinter import ttk
>> root = tk.Tk()
>> cb = ttk.Combobox(root)
>> cb.grid(row=0, column=0, sticky='NSEW')
>> cb['values'] = ['one', 'two', 'three', 'four']
>> root.mainloop()
>> The text of the values in the combobox dropdown list is white on 
>> white.?? The *selected* item in the list is white on light grey, but 
>> all the unselected items are invisible (white on white). 
> Which platform are you on, i.e. which operating system? I guess it is 
> Linux. In that case the default colors are read by Tk from the X11 
> options database, which is some cruft from the past to set options for 
> X11 applications. Try to run
> ????xrdb -query
> That should give you a list of default values, and maybe you can see 
> something. The dropdown list is actually a popdown menu, so look for 
> Menu colors. For instance, if you use a dark theme in your desktop 
> environment, it could be that the foreground is correctly set to 
> white, but the background is hardcoded white for some reason e.g.
> ????Christian

Thanks.? Yes, I am on Linux (Fedora 28, MATE desktop).? Yes, I am using 
a dark theme - however, xrdb does not show #ffffff for *any* background 
color, so I have no idea where ttk is picking it up from.? Even if I 
change to a light desktop theme, the ttk widget still displays white on 
white.? The only solution I have found so far is rather hackish, but it 

class MyCombobox(ttk.Combobox):
 ??? def __init__(self, *args, **kwargs):
 ??????? super().__init__(*args, **kwargs)
 ??????? self.bind('<Map>', self._change_popdown_color)

 ??? def _change_popdown_color(self, *args):
 ??????? popdown = self.tk.eval('ttk::combobox::PopdownWindow 
 ??????? self.tk.call('{}.f.l'.format(popdown), 'configure', 
'-foreground', 'black')

However, I am still looking for a more elegant solution that preferably 
doesn't hardcode colors...