簡體   English   中英

3 python 中 ttk 樹視圖的不同問題

[英]3 Different issues with ttk treeviews in 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')

現在,它完美地工作(這里有一個截圖作為例子):截屏 但是最后一行代碼更改了該行中所有 3 列的顏色。 我想要的是僅更改 #2 列(僅消息)而不是整行(不是 Nick 或 Time 列)的文本顏色。 我嘗試了很長時間,但現在是凌晨 4 點,我投降了 ☹ 有什么辦法可以做到嗎?

兩周后更新

現在我嘗試做 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 +".")

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期望iterable適用於每個列。 例如:

for (col, value) in zip( tree.columns(), values ) :
     col.insert(value)

這就是bug的所在: string也是iterable (它實際上是一個字符列表)所以當你嘗試使用"This is a message"的消息調用insert時,ttk會將"This"應用於第一列, "is"應用於第二列,依此類推......要強制執行消息應作為一個整體應用的事實,只需在末尾添加一個昏迷: (idmensajeactual,)

此代碼有效:

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

最后

我已將我的存根上傳為github gist。 你可以在這里查看並調整它以滿足你的需求: https//gist.github.com/lucasg/7643411

輸出:

在此輸入圖像描述

我可以回答你的部分問題:如何擺脫Treeview邊界:

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

為了防止更多人也發現這個老問題,我在@lucasg 回答的幫助下為您的第二個問題找到了解決方法。

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

它似乎適用於具有“默認”主題的 Windows 用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM