3 python中ttk treeviews的不同问题

Sae*_*yth 10 python treeview ttk

我正在使用treeviewPython中的多列进行聊天客户端.

这是以下代码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
Run Code Online (Sandbox Code Playgroud)

我添加这样的项目:

chat.insert("", "end", "", values=((user, message, time)), tags=(messageid))
chat.tag_configure(messageid, foreground='#ff0000')
Run Code Online (Sandbox Code Playgroud)

现在,这完美地运作(这是一个截图作为例子): 截图但最后一行代码会更改该行中所有3列的颜色.我想要的只是改变#2列(只是消息)的文本颜色,而不是整行(不是尼克或时间列).我现在尝试了很长时间但是凌晨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)
Run Code Online (Sandbox Code Playgroud)

这就是消息:

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 +".")
Run Code Online (Sandbox Code Playgroud)

luc*_*asg 15

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 )
Run Code Online (Sandbox Code Playgroud)

第二个问题:边界/山脊

使用样式配置对象

ttk.Style().configure(  '.',              # every class of object
            relief = 'flat',  # flat ridge for separator
            borderwidth = 0,  # zero width for the border
                )
Run Code Online (Sandbox Code Playgroud)

但它不适用于Windows:它是一个错误(或一个功能:p).

Windows完全忽略该-borderwidth参数.(comp.lang.tcl邮件列表中有更多信息:http://coding.derkeiler.com/Archive/Tcl/comp.lang.tcl/2007-11/msg00923.html)

第三个问题:截断

这是最简单的问题:参数 -values期望iterablefor应用于每个列.例如:

for (col, value) in zip( tree.columns(), values ) :
     col.insert(value)
Run Code Online (Sandbox Code Playgroud)

这就是bug的所在:a string也是一个iterable!(它实际上是一个char列表)所以当你尝试insert使用该消息调用时"This is a message",ttk将应用于"This"第一列,"is"第二列,依此类推......强制执行消息应作为一个整体应用的事实,最后添加一个昏迷:(idmensajeactual,)

此代码有效:

chat2.insert("", "end", iid=(idmensajeactual,) , values=mensaje, tags=(messageid))
Run Code Online (Sandbox Code Playgroud)

最后

我已将我的存根上传为github gist.你可以在这里查看并调整它以满足你的需求:https://gist.github.com/lucasg/7643411

输出:

在此输入图像描述


Aiv*_*var 10

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

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