python中ttk TreeView的3个不同问题

python中ttk TreeView的3个不同问题,python,treeview,ttk,Python,Treeview,Ttk,我正在使用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='Ho

我正在使用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点,我投降了☹ 有什么办法吗

两周后更新

现在我试着做3个不同的TreeView(每个一列),结果是: 虽然这解决了颜色问题,但我有一个新问题:滚动条。有没有办法将滚动条绑定到3个不同的TreeView?到目前为止,我所有的尝试都失败了,我只能用滚动条移动其中一个树状视图。可以绑定到3个TreeView吗?(如果是:怎么做?沃思?我应该吗?)

还有另一个问题:在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 +".")
1.第一个问题:滚动条 解决方案包括创建顶级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上不起作用:这是一个bug(或一个特性:p)

Windows完全忽略
-borderwidth
参数。(有关
comp.lang.tcl
邮件列表的更多信息:)

第三个问题:截断 这是最简单的问题:参数
-values
期望对每个列应用
iterable
。例:

for (col, value) in zip( tree.columns(), values ) :
     col.insert(value)
这就是错误所在:字符串也是可编辑的!(这实际上是一个字符列表)因此,当您尝试调用带有消息
insert
“This a message”
,ttk将
“This”
应用于第一列,
“is”
应用于第二列,依此类推。。。 为了强调消息应该作为一个整体应用,只需在末尾添加一个coma:
(idmensajactual,)

此代码适用于:

chat2.insert("", "end", iid=(idmensajeactual,) , values=mensaje, tags=(messageid))
最后 我已将我的存根作为github gist上传。您可以在此处查看并根据需要进行调整:

输出:


我可以回答你的部分问题:如何摆脱Treeview边界:

style = ttk.Style()
style.layout("Treeview", [
    ('Treeview.treearea', {'sticky': 'nswe'})
])

messageid
是否会随每条消息而更改?是的,messageid是一个变量,它使用唯一的ID设置该用户的特定消息。因此,我可以在客户端中使用标记更改该消息的文本。我的问题是,我不知道如何将标签设置为一列,我的尝试只对整行有效。先生,你赢得了我的尊重。现在我将尝试一下,希望一切顺利。虽然我对第二个问题不在windows上工作感到有点难过,但我在努力实现这一点时遇到了一些重大问题。实际上在滚动条上:
\u tkinter.TclError:无法将.56559920.56558800放入.notebook.saladechat.minicajadechat
没有滚动条,其他一切都可以正常工作。minicajadechat和saladechat都是笔记本中的框架。我在代码中也遇到了一些问题,但如果我问这个问题,那将是自私的,对吗?或者你能看一眼,给我指个正确的方向吗?(570行)@Saelyth:谢谢。为了我的宠物项目,我已经在Treeview课程上苦苦挣扎了好几个星期,所以我对它有一两点了解。关于你的错误,我真的不知道它的原因:我用笔记本更新了要点,效果很好。哇。我只是想说“谢谢你”,因为你解决了有史以来最难看的界面问题之一。