一次选择多个TCL / TK文本小部件

时间:2017-03-07 01:20:11

标签: tcl tk

我正在尝试使用TCL / TK创建一个表,并在不使用Tktable小部件的情况下构建它。

我正在使用画布从头开始构建表格:

simple Tktable

我有一大堆自定义项(到目前为止)我觉得如果我在画布中构建表格会更容易,因此使用这种方法而不是Tktable。

我的表格中将填充只读文本小部件,可编辑的文本小部件和一些下拉菜单。

以下是我的问题:

1)如何允许用户同时选择多个文本小部件并检索选择?比如说,用户选择整行/列等。

请参阅以下简化代码:

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 + select)并以某种方式将选择存储在某处并检索它们以供以后使用。

如果上面的简明测试用例不清楚,请告诉我。

编辑1

忘记添加我知道如何使用selection get命令检索单个文本小部件选择。

2 个答案:

答案 0 :(得分:1)

默认情况下,选择一次仅限于一个窗口小部件。如果您关闭每个窗口小部件的窗口小部件级别的选择导出(配置-exportselection 0),那么您可以接管管理。但是,除非窗口小部件具有焦点(由于平台GUI规则),否则某些平台也不会显示选择,因此您可能还需要管理文本标记以应用选择的外观。 (sel标签是选择;它是专门管理的,但您可以相当轻松地复制其外观。)

请记住,您可以在窗口和文本窗口小部件中嵌入窗口小部件(如果子窗口小部件的名称使它们成为容器的子窗口)。如果你正在那条路线上,window子命令和/或项目类型就是你正在寻找的。

另一件大事是管理剪贴板。你会明确地接受它。通常的命令是clipboard,但也可以使用selection命令(它可以访问剪贴板/选择机制的较低级别部分;剪贴板是CLIPBOARD选择)。

理解这一点,你正在做的事情很复杂,可能需要花费很多时间和精力。问问自己,你的项目是否真的在这种复杂程度上是合理的。

答案 1 :(得分:1)

这个想法的要点是使用文本标签来标记所选文本,这样您不仅可以获得所选文本的外观,还可以将该文本标记为&#34;选择&#34;。然后,您的复制操作仅迭代所有文本小部件,并获取内容,如果它拥有标记&#34;选择&#34;。您可以通过删除标记取消选择所选文本,或者如下所示,按钮命令用自己的撤消命令替换自己。

因此,流程单击列按钮,该列中的所有文本小部件都将其内容标记为已选中(所选文本为白色背景和黑色前景,因此看起来已选中)单击弹出菜单或菜单按钮访问所有选定的项目并对内容执行操作,然后单击列按钮以取消选择列。所有选定的文本小部件都删除了选定的标记,并恢复了文本的默认外观。

假设您单击列的顶部(我假设它是一个按钮)并且您知道该列中的文本小部件,您可以使用标记标记每个文本小部件中的文本以指示它已被选中。然后,要复制,您可以遍历所有文本小部件并在每个标记的文本小部件中提取内容。取消选择迭代所有文本小部件并取消标记内容。在下面的代码中我假设我有以下函数:getAllTextWindowPaths - 给我画布中所有textwidgets的列表,getAllTextPathsInColumn colnumber - 给我列出$ colnumber列中画布中的所有textwidgets。

open Deedle
open System.IO

[<EntryPoint>]
let main argv =
    let csv = @"C:\tmp\testDeedle.csv"
    File.Exists csv |> printfn "%A"
    let df = Frame.ReadCsv(csv,hasHeaders=true,inferTypes=true)
    df.GetColumn("Date") |> printfn "%A"
    printfn "%A" argv
    0 // return an integer exit code