我正在尝试使用TCL / TK创建一个表,并在不使用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
命令检索单个文本小部件选择。
答案 0 :(得分:1)
默认情况下,选择一次仅限于一个窗口小部件。如果您关闭每个窗口小部件的窗口小部件级别的选择导出(配置-exportselection 0
),那么您可以接管管理。但是,除非窗口小部件具有焦点(由于平台GUI规则),否则某些平台也不会显示选择,因此您可能还需要管理文本标记以应用选择的外观。 (sel
标签是选择;它是专门管理的,但您可以相当轻松地复制其外观。)
请记住,您可以在窗口和文本窗口小部件中嵌入窗口小部件(如果子窗口小部件的名称使它们成为容器的子窗口)。如果你正在那条路线上,window
子命令和/或项目类型就是你正在寻找的。 p>
另一件大事是管理剪贴板。你会明确地接受它。通常的命令是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