我正在使用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列(只是消息)和不整行(不是Nick或Time列)的文本颜色。我现在尝试了很长时间但是凌晨4点我投降了☹有没有办法做到这一点?
2周后更新
现在我尝试了3个不同的树视图(每个1列),最终以这种方式结束: 虽然这解决了颜色问题,但我有一个新问题:滚动条。有没有办法将滚动条绑定到3个不同的树视图?到目前为止我所有的尝试都失败了,我只能用滚动条移动一个树视图。可以绑定3个树视图? (如果是的话:怎么样?值得?,我应该吗?)
还有另一个问题:在TTK python中,所有删除treeview边框的尝试都失败了。
另一个问题是,现在Mensaje树视图只显示第一个单词。不知道为什么没有:\这是关于第一个单词问题的新代码。
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 +".")
答案 0 :(得分:15)
解决方案包括创建顶级ttk.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完全忽略-borderwidth
参数。 (comp.lang.tcl
邮件列表中的更多信息:http://coding.derkeiler.com/Archive/Tcl/comp.lang.tcl/2007-11/msg00923.html)
这是最简单的问题:参数-values
期望iterable
适用于每列。例如:
for (col, value) in zip( tree.columns(), values ) :
col.insert(value)
这就是错误所在:string
也是iterable
! (它实际上是一个字符列表)所以当你尝试用insert
消息调用"This is a message"
时,ttk将"This"
应用于第一列,"is"
应用于第二列, 等等 ...
要强制执行消息应作为一个整体应用的事实,只需在最后添加一个昏迷:(idmensajeactual,)
此代码有效:
chat2.insert("", "end", iid=(idmensajeactual,) , values=mensaje, tags=(messageid))
我已将我的存根上传为github gist。您可以在此处查看并根据您的需要进行调整:https://gist.github.com/lucasg/7643411
输出:
答案 1 :(得分:10)
我可以回答你的部分问题:如何摆脱Treeview边界:
style = ttk.Style()
style.layout("Treeview", [
('Treeview.treearea', {'sticky': 'nswe'})
])