3 различные проблемы с TTK treeviews в python
Я делаю чат-клиент с помощью treeview
С несколькими столбцами в Python.
этот код treeview
:
chat = ttk.Treeview(height="26", columns=("Nick","Mensaje","Hora"), selectmode="extended")
chat.heading('#1', text='Nick', anchor=W)
chat.heading('#2', text='Mensaje', anchor=W)
chat.heading('#3', text='Hora', anchor=W)
chat.column('#1', stretch=NO, minwidth=0, width=130)
chat.column('#2', stretch=NO, minwidth=0, width=620)
chat.column('#3', stretch=NO, minwidth=0, width=65)
chat.column('#0', stretch=NO, minwidth=0, width=0) #width 0 to not display it
и я добавляю такие элементы:
chat.insert("", "end", "", values=((user, message, time)), tags=(messageid))
chat.tag_configure(messageid, foreground='#ff0000')
теперь, это работает отлично (вот скриншот в качестве примера): но эта последняя строка кода меняет цвет всех 3 столбцов в этой строке. Я хочу изменить только цвет текста столбца #2 (только сообщение) и не всего подряд (не ник или столбцы времени). Я пытался в течение длительного времени, но сейчас 4 утра, и я сдаюсь ☹ есть ли способ сделать это?
Обновление через 2 недели
теперь я попытался сделать 3 разных treeviews (по 1 столбцу каждый), и это заканчивается таким образом:
Хотя это устраняет проблему цвета, у меня есть новая проблема: полоса прокрутки. Есть ли способ связать полосу прокрутки с 3 различными видами деревьев? все мои попытки провалились до сих пор, и я могу переместить только один из treeview с помощью полоса прокрутки. Можно привязать к 3 treeviews? (Если да, то как? стоит? а должен?)
а также еще одна проблема: все попытки удалить границу treeview потерпели неудачу в TTK python.
другая проблема заключается в том, что теперь mensaje treeview отображает только первое слово. Не знаю, почему ни: это новый код о первой проблеме слова.
chat2 = ttk.Treeview(height="28", columns="Mensaje", selectmode="extended")
chat2.heading('#1', text='Mensaje', anchor=CENTER)
chat2.column('#1', stretch=NO, minwidth=400, width=620)
chat2.column('#0', stretch=NO, minwidth=0, width=0)
и это идет на сообщение:
BotGUI.chat2.insert("", "end", iid=(idmensajeactual), values=mensaje, tags=(messageid))
try:
BotGUI.chat2.tag_configure(messageid, foreground='#'+colorfuente) #tfl
except TclError:
print("[Error02] - can't assign colour of "+ usuario +".")
2 ответов
1. Первый Вопрос: Scrollbar
решение состоит из создания ТТК верхнего уровня.Объект Treeview и другое дерево для каждого столбца. Активации полос прокрутки связаны с представлением дерева верхнего уровня. Это немного более громоздко, чем иметь три столбца в одном объекте дерева, но он работает:
# Top level Treeview object
bot = ttk.Treeview( Tkinter.Tk() )
# Columns (treeview objects also)
columns = create_columns( bot)
################################
## Scrollbars
vsb = ttk.Scrollbar( bot,
orient="vertical",
command = bot.yview
)
hsb = ttk.Scrollbar( bot,
orient="horizontal",
command = bot.xview
)
## Link scrollbars activation to top-level object
bot.configure( yscrollcommand=vsb.set,
xscrollcommand=hsb.set)
## Link scrollbar also to every columns
map ( lambda col : col.configure( yscrollcommand=vsb.set,xscrollcommand=hsb.set), columns )
второй вопрос : граница/хребта
используйте объект конфигурации стиля
ttk.Style().configure( '.', # every class of object
relief = 'flat', # flat ridge for separator
borderwidth = 0, # zero width for the border
)
он не будет работать на Windows: это ошибка (или функция :p ).
Windows полностью игнорирует , ttk будет применяться "This"
в первом столбце, "is"
ко второму и так далее ...
Чтобы обеспечить тот факт, что сообщение должно применяться в целом, просто добавьте кому в конце:(idmensajeactual,)
этот код работает :
chat2.insert("", "end", iid=(idmensajeactual,) , values=mensaje, tags=(messageid))
наконец-то
я загрузил свой заглушку как GitHub gist. Вы можете проверить его здесь и настроить его под свои нужды : https://gist.github.com/lucasg/7643411
выход :
Я могу ответить на часть вашего вопроса: Как избавиться от Treeview border:
style = ttk.Style()
style.layout("Treeview", [
('Treeview.treearea', {'sticky': 'nswe'})
])