2017-03-07 17 views
0

TCL/TKを使用してテーブルを作成し、Tktableウィジェットを使用せずにテーブルを作成しようとしています。複数のTCL/TKテキストウィジェットを一度に選択

私はで提供アプローチを使用して地面からテーブルを構築するためにキャンバスを使用しています:

simple Tktable

私は私が建てる場合は簡単です(今のところ)私が感じるのカスタマイズの全体の束を持っていますテーブルをキャンバスに入れ、Tktableではなくこのアプローチを使用しています。

テーブルには、読み取り専用のテキストウィジェット、編集可能なテキストウィジェット、およびいくつかのドロップダウンメニューが表示されます。ここで

は私の質問です:

1)私は、ユーザーが同時に複数のテキストウィジェットを選択し、選択を取得できるようにすることができますどのように?言うような、ユーザが選択した行全体/ COL等

以下の簡略化されたコードを参照してください。上記の例で

package require Tk 

proc makeWindow {} { 
    set toplevelWindow .gui 
    destroy $toplevelWindow 

    ## Make the toplevel window 
    toplevel $toplevelWindow 
    wm title $toplevelWindow "Test case 1" 
    wm minsize $toplevelWindow 200 200 
    set pathName $toplevelWindow.testMultiSelection 

    ## Create the canvas where I build the table 
    destroy $pathName 
    frame $pathName 

    set col 0 
    for {set i 0} {$i < 4} {incr i} { 
     set w "$pathName\_$i" 
     destroy $w 
     text $w -width 9 -height 1 -state normal 
     $w insert end $i 
     $w configure -state disabled 
     grid $w -row $i -column $col -sticky ew 
    } 
    grid config $toplevelWindow.testMultiSelection -column 0 -row 0 -sticky w 
} 

makeWindow 

は、私は(CTRLのような基本的なものをいくつかの数字を選択することを期待+選択)、何とか選択をどこかに保存し、後で使用できるようにそれらを取得します。

上記凝縮されたテストケースが明確でない場合は、教えてください。

EDIT 1

は私がselection getコマンドを使用して、単一のテキストウィジェットの選択を取得する方法を知っていることを追加するのを忘れ。

答えて

1

選択は、デフォルトでは一度に1つのウィジェットに限定されています。各ウィジェット(設定-exportselection 0)のウィジェットレベルで選択項目のエクスポートをオフにすると、その管理を引き継ぐことができます。ただし、ウィジェットにフォーカスがある(プラットフォームのGUIルールのため)場合を除いて、選択範囲の表示にテキストタグを管理する必要があるプラットフォームもあります。

ウィジェットをキャンバスとテキストウィジェットの両方に埋め込むことができることを覚えておいてください(サブウィジェットの名前が子になる場合は)。 windowサブコマンドおよび/またはアイテムタイプは、そのルートに行く場合に探しているものです。

もう一つの大きな点は、クリップボードを管理することです。あなたは明示的にそれをとっておきたいでしょう。そのための通常のコマンドはclipboardですが、selectionコマンドも使用できます(クリップボード/選択メカニズムの下位部分にアクセスできます;クリップボードはCLIPBOARDの選択です)。

あなたがやっていることは、複雑で、かなりの時間と労力がかかりそうです。あなたのプロジェクトが本当にであるかどうか自問自答してください。

+0

ありがとうございます。私はプロジェクトを始めたときに私が間違っていたと思う。私は現在、ダッシュボードのような "Excel"(Tktableとテーブルリスト)を開発するために使うことができる他のメガウィジェットを模索しています。上記のウィジェットは私のニーズを処理する上で非常に優れています。 – sanjay

1

このアイデアは、テキストタグを使用して選択したテキストをマークすることで、選択したテキストの外観を取得するだけでなく、そのテキストを「選択済み」としてマークすることです。次に、コピー操作では、すべてのテキストウィジェットを繰り返し実行し、タグが「選択済み」であれば内容を取得します。選択したテキストの選択を解除するには、タグを削除して内容を取得するか、buttonコマンドが独自の取り消しコマンドで置き換えられたようにします。

フローは列ボタンをクリックします。その列のすべてのテキストウィジェットの内容は選択されたタグ付きです(選択されたテキストは白い背景です&黒いフォアグラウンドなので選択されています)。選択されたすべての項目にアクセスして内容を操作し、列ボタンをクリックして列の選択を解除します。選択されたすべてのテキストウィジェットは選択されたタグを削除して、テキストのデフォルトの外観を復元します。

カラムの上部をクリックすると(私はそのボタンと仮定します)、そのカラムのテキストウィジェットを知っているとすれば、各テキストウィジェットのテキストにタグが選択されていることを示すことができます。コピーすると、すべてのテキストウィジェットを繰り返し処理し、タグ付きの各テキストウィジェット内のコンテンツをプルすることができます。すべてのテキストウィジェットに対して反復を選択解除し、コンテンツのタグを解除します。私が以下の関数を持っていると仮定して、以下のコードで:getAllTextWindowPaths - 私にキャンバス内のすべてのテキストウィジェットのリストを与えます。getAllTextPathsInColumn colnumber - キャンバス内のすべてのテキストウィジェットのリストを$ colnumberカラムに渡します。

# configure tags for all your text windows 

foreach t [ getAllTextWindowPaths ] { 
    $t tag configure selected -background white -foreground black 
} 
# configure the column select button 
button .canvas.button.column1 -text {1} -command [ list clickColumn      .canvas.button.column1 1 ] 

proc selectText { textpath { select 1 } } { 
    if { $select == 1 } { 
    $textpath tag add 1.0 end selected 
    } else { 
    $textpath tag remove 1.0 end selected 
    } 
} 

proc clickColumn { colpath colnum } { 
    # now call this click handler for for your column of textwidgets 
    # you can make same for a row 

    foreach t [getTextPathsInColumn $colnum ] { 
    selectText $t 1 
    } 
    $colpath configure -command [list unclickColumn $colpath $colnum ] 
} 
proc unclickColumn { colpath colnum } { 
    # now call this click handler for for your column of textwidgets 
    # you can make same for a row 

    foreach t [getTextPathsInColumn $colnum ] { 
    selectText $t 1 
    } 
    $colpath configure -command [list clickColumn $colpath $colnum ] 
} 

proc getSelectedContents { } { 
    # im adding to a list all the seleted contents but you can arrange 
    # it anyway you want 
    set retval {} 
    foreach t [getAllTextWindowPaths ] { 
     if { "selected" in [$t tag names 1.0 ] } { 
      lappend retval [ $t get 1.0 end ] 
     } 
    } 
    # optional call selectText $t 0 here foreach selected widget 
    # to clear selection or handle the column click handler again 
    return $retval 
} 
+0

これは問題を解決するための良いアプローチです。私は2つのテキストウィジェットでそれを試してみました。それはうまくいくようです。いずれにしても、私はまだこれがダッシュボード/テーブルのようなアプリケーションでは非常に複雑なことだと思っています。 megawidgetテーブルリストはこれまでのところ私の要件をうまく処理しているようです。 – sanjay

関連する問題