ttk.Combobox сбой, когда состояние доступно только для чтения и не в фокусе

Когда ttk.Combobox доступен только для чтения, а не в фокусе, его фоновый фон становится белым, который отличается от фона серого поля и делает выпадающий список уродливым:

пример

Желаемый стиль будет вторым. Как сделать combobox работать так?

One Solution collect form web for “ttk.Combobox сбой, когда состояние доступно только для чтения и не в фокусе”

Решение состоит в том, чтобы изменить стиль ttk следующим образом:

s = ttk.Style() s.map("TCombobox", selectbackground=[ ('!readonly', '!focus', 'SystemWindow'), ('readonly', '!focus', 'SystemButtonFace'), ], ) 

Это изменяет поведение comboboxes во всем мире. В следующем демо (из которого был сделан скриншот вопроса) я определил пользовательский стиль для хорошо работающего combobox как «Alt.TCombobox» и использовал его для него:

 # cboxdemo.py by Adam Szieberth (2013) # Python 3.3.0 """Read-only Ttk.Combobox style demo module. The style of the second combobox has been slightly modified to make text background match with combobox background when out of focus. In read-only state (which is default) you can notice that text background gets white in the first (original styled) combobox when focus moves towards. Second combobox looks nice then. With the button you can test that the two works exactly the same in writeable state. """ from random import randint from tkinter import Button, Frame, StringVar, Tk from tkinter.ttk import Combobox, Style class App(Frame): def __init__(self, parent): super().__init__(parent) self.state = None self.style = Style() self.style.map("Alt.TCombobox", selectbackground=[ ('!readonly', '!focus', 'SystemWindow'), ('readonly', '!focus', 'SystemButtonFace'), ], ) self.button = Button(self, text="Change state!", command=self.switch) self.cbox1var, self.cbox2var = StringVar(), StringVar() self.cbox1 = Combobox(self, exportselection=0, values=["sex", "sleep", "eat", "drink", "dream",], textvariable=self.cbox1var, ) self.cbox1.bind('<<ComboboxSelected>>', self.bfocus) self.cbox1.current(1) self.cbox2 = Combobox(self, exportselection=0, values=["fear", "clarity", "power", "old age",], style="Alt.TCombobox", textvariable=self.cbox2var, ) self.cbox2.bind('<<ComboboxSelected>>', self.bfocus) self.cbox2.current(3) self.cbox1.pack() self.cbox2.pack() self.button.pack() self.switch() def bfocus(self, *args): if randint(0,1): self.button.focus() print('Focus moved!') else: print('Focus stayed.') def switch(self): if self.state == ['readonly']: self.state = ['!readonly'] print('State is writeable!') else: self.state = ['readonly'] print('State is read-only!') self.cbox1.state(self.state) self.cbox2.state(self.state) if __name__ == "__main__": root = Tk() root.title('ttk.Combobox styling') App(root).pack() root.mainloop() 
  • Tkinter: Как активировать ttk.Radiobutton и получить его значение?
  • Команда Tkinter игнорирует некоторые строки
  • Python tkinter с календарем ttk
  • 3 Различные проблемы с ttk treeviews в python
  • Python / ttk / tKinter - передача аргумента нажатием кнопки func?
  • Поиск текущей вкладки Ttk Notebook
  • ttk treeview: альтернативные цвета строк
  • Изменить тип события события для виджетов или использовать метод .trace_variable ()?
  • Как создать представление дерева с флажками в Python
  • Как контролировать выделение выделения со списком tkinter
  • Почему мой обработчик click ttk.Treeview возвращает неправильный элемент в tree.focus ()?
  • Python - лучший язык программирования в мире.