11

我正在使用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

我添加了这样的项目:

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 中,所有删除树视图边框的尝试都失败了。

另一个问题是现在 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 +".")
4

3 回答 3

19

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 上不起作用:这是一个错误(或功能 :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)

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

此代码有效:

chat2.insert("", "end", iid=(idmensajeactual,) , values=mensaje, tags=(messageid))

最后

我已将我的存根作为 github 要点上传。您可以在这里查看并根据您的需要进行调整:https ://gist.github.com/lucasg/7643411

输出 :

在此处输入图像描述

于 2013-11-25T15:53:14.293 回答
15

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

style = ttk.Style()
style.layout("Treeview", [
    ('Treeview.treearea', {'sticky': 'nswe'})
])
于 2014-05-16T00:21:01.797 回答
0

以防更多人也发现这个老问题,我在@lucasg 答案的帮助下找到了解决第二个问题的方法。

s = ttk.Style()
s.theme_use('default')
s.configure('.',borderwidth = 0)

它似乎适用于具有“默认”主题的 Windows 用户。

于 2021-12-03T10:03:55.990 回答