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 つの異なるツリービューにバインドする方法はありますか? これまでの試みはすべて失敗しており、スクロールバーでツリービューの1つだけを移動できます。3 つのツリービューにバインドすることは可能ですか? (はいの場合: どのように?, 価値がある?, 私はすべきですか?)

また、別の問題: ツリービューの境界線を削除しようとするすべての試みが TTK python で失敗しました。

もう 1 つの問題は、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 オブジェクトと、すべての列に別のツリーを作成することで構成されます。スクロールバーのアクティベーションは、トップレベルのツリー ビューにリンクされています。同じツリー オブジェクトに 3 つの列を配置するよりも少し面倒ですが、機能します。

# 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 )

2番目の質問:境界/尾根

スタイル構成オブジェクトを使用する

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 )

3 番目の質問 : トランケート

これが最も簡単な質問です。パラメーター は、各列に for が適用されることを-values期待しています。iterable元:

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

そこにバグがあります: astringiterable! (これは文字通り char のリストです) したがってinsert、メッセージで呼び出そうとすると"This is a message"、ttk は"This"最初の列、"is"2 番目の列などに適用されます...メッセージが全体として適用されるべきであるという事実を強制するには、最後にカンマを追加するだけです:(idmensajeactual,)

このコードは機能します:

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

ついに

スタブを github gist としてアップロードしました。ここで確認して、必要に応じて調整できます: https://gist.github.com/lucasg/7643411

出力:

ここに画像の説明を入力

于 2013-11-25T15:53:14.293 に答える
15

私はあなたの質問の一部に答えることができます: ツリービューの境界線を取り除く方法:

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