python中ttk treeviews的3个不同问题

2024-09-28 16:20:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python中的一个带有多个列的treeview做一个聊天客户端。

这是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')

现在,这非常有效(这里有一个屏幕截图作为例子):screenshot但是最后一行代码改变了该行中所有3列的颜色。我只想更改#2列(仅消息)的文本颜色,而不是整个行(不是Nick列或Time列)。我试了很长一段时间,但现在是凌晨4点,我投降了,有什么办法吗?

两周后更新

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

还有一个问题:在TTK python中,所有删除treeview border的尝试都失败了。

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

Tags: no代码textchatcolumnwidthnickanchor
2条回答

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

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

一。第一个问题:滚动条

解决方案包括为每个列创建一个顶级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邮件列表的更多信息: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)

这就是错误所在:astring也是一个iterable!(它实际上是一个字符列表)因此,当您试图用消息"This is a message"调用insert时,ttk将对第一列应用"This",对第二列应用"is",依此类推。。。 要强制将消息作为一个整体应用,只需在末尾添加coma:(idmensajeactual,)

此代码有效:

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

最后

我上传了我的存根作为github的主旨。你可以在这里查看并根据需要调整:https://gist.github.com/lucasg/7643411

输出:

enter image description here

相关问题 更多 >