ttk treeview: выбранный цвет

#python #tkinter #treeview #ttk

#python #tkinter #просмотр дерева #ttk

Вопрос:

Выбранная строка моего ttk treeview отображается в виде темно-синего фона с белым текстом.

Если я задам цвет строки с помощью тега, например:

 self.tree.item(item, tags=('oddrow'))
  

и настройте тег как цвет, например:

 self.tree.tag_configure('oddrow', background='lightgrey')
  

и выберите oddrow, цвет фона не изменится (он остается светло-серым), в то время как текст изменится с черного на белый. Как я могу сделать фон выбранной строки темно-синим, независимо от того, помечена строка цветом или нет?

Строки, не помеченные тегами, отображаются как черные на белом, или если они выбраны как белые на темно-синем.

Я пытался

 ttk.Style().configure('Treeview', selectbackground='blue')
  

но это ничего не дало.

РЕДАКТИРОВАТЬ: я полагаю, что когда я выбираю элемент, я мог бы повторно пометить его как not oddrow, а затем вернуться, когда он не выбран, но это довольно неэлегантно.

Комментарии:

1. Вы пробовали self.tree.tag_configure('oddrow', background='lightgrey', selectbackground='blue') ?

2. @StevenRumbalski: _tkinter: Ошибка TclError: неизвестная опция «-selectbackground»

3. Просто прочитайте документы по адресу tcl.tk/man/tcl/TkCmd/ttk_treeview.htm#M69 . tag поддерживает только передний план, фон, шрифт и изображение. Извините за плохой совет.

Ответ №1:

Из учебника TkDocs для деревьев, кажется, вы можете:

  • создайте тег с желаемыми цветами (для выбранной строки)

Затем перехватывайте виртуальные события из treeview:

  • назначьте тег строке, когда она получит фокус
  • отмените назначение тега из строки, когда он теряет фокус

Вот конкретный абзац в документации, которую я использовал:

 The treeview will generate virtual events "<TreeviewSelect>", "<TreeviewOpen>" 
and "<TreeviewClose>" which allow you to monitor changes to the widget made 
by the user.   You can use the "selection" method to determine the current 
selection (the selection can also be changed from your program). 
  

Вместе с некоторым кодом из руководства:

 tree.tag_configure('ttk', background='yellow')
tree.tag_bind('ttk', '<1>', itemClicked); # the item clicked can be found via tree.focus()
  

примечание: я не уверен, что это сработает. Мне нужно будет откопать код, чтобы увидеть, что я сделал.

Комментарии:

1. По сути, это то, что я в итоге сделал, как я довольно загадочно упомянул в своем РЕДАКТИРОВАНИИ. Когда выбрана строка (отслеживается с помощью <TreeviewSelect> ), я повторно помечаю все строки альтернативными цветами (чтобы очистить все предыдущие изменения), затем помечаю текущую строку простым фоном, чтобы цвет выбора по умолчанию отображался правильно.

2. @foosion — я хотел предложить помечать / отключать только выбранную строку. То есть оставьте все oddrow s помеченными так, как они есть, и добавьте второй тег к выбранной строке. В чем я не уверен, так это в том, что произойдет, если у вас есть два тега в одной строке — какой из них выигрывает?

3. Часть того, что я делаю, — это удаление строк, добавление строк, перемещение строк, поэтому переназначение всего часто имеет смысл. Другой альтернативой является снятие метки с выбранной строки (что делает фон выделения правильным; в качестве альтернативы пометьте его цветом выделения), а затем повторно пометьте его при изменении выделения.

Ответ №2:

Если кто-то ищет ответ, чтобы изменить выбранный цвет для tkinter treeview, вы можете проверить приведенный ниже код.

Вы должны изменить состояние «выбрано», а не «активно».

 style = ttk.Style()
style.configure("Treeview",
                background="#E1E1E1",
                foreground="#000000",
                rowheight=25,
                fieldbackground="#E1E1E1")
style.map('Treeview', background=[('selected', '#BFBFBF')])
  

Комментарии:

1. здесь совершенно неуместно