tcl tk 将 <Control-v> 绑定到表格列表中的单元格

tcl tk bind <Control-v> to a cell in a tablelist

我使用以下代码创建了一个表列表(由 Nehmeti 设计):

set _bvnr(tbl1) [tablelist::tablelist $_bvnr(fr2).tbl1 \
   -columns {0 "OID vmbust" \
             0 "OID vmflst" \
             0 "Flurstück" \
             0 "Buchungsblatt" \
             0 "Buchungsart" \
             0 "Laufende Nummer"} \
   -background white\
   -labelborderwidth 1\
   -selectborderwidth 0\
   -selectmode single \
   -exportselection 0\
   -labelfont $tabuefont\
   -font $tabinfont\
   -selectforeground $vmVConfig::setVar(activeFG)\
   -selectbackground $vmVConfig::setVar(activeBG)\
   -stretch all\
   -height 8\
   -setfocus 0\
   -forceeditendcommand 1 \
   -editstartcommand [itcl::code $this editStartTbl1] \
   -editendcommand [itcl::code $this editEndTbl1] \
   -xscrollcommand [list vmTkTools::configSB "h" $_bvnr(fr2).scrbx1]\
   -yscrollcommand [list vmTkTools::configSB "v" $_bvnr(fr2).scrby1]\
   -showarrow 0]

我让第 5 列可以由

编辑
$_bvnr(tbl1) columnconfigure 5 -editable no -name bgb -editwindow entryfield

editstart命令的方法如下:

itcl::body vmBVNummer::editStartTbl1 {tbl row col txt} {

   set _bvnr(tblCPath1) [$tbl editwinpath]

   # Entryfield erstellen
   $_bvnr(tblCPath1) configure -highlightthickness 2 \
                               -borderwidth 0 \
                               -selectbackground $vmVConfig::setVar(activeBG) \
                               -selectforeground $vmVConfig::setVar(activeFG) \
                               -state normal \
                               -textfont $entfont \
                               -validate "[list vmTclTools::valInteger2 %P] " \
                               -textbackground white

   set _bvnr(editLnr) $txt

bind [$tbl entrypath] <Control-v> [itcl::code $this pasteGrber]
   return $txt
}

通过绑定方法 "pasteGrber" 我试图防止 "selection get" 中的文本可以粘贴到输入字段中,如果它不是整数(在 vmTclTools::valInteger 中检查)

itcl::body vmBVNummer::pasteGrber {} {

   set tbl [getTbl1Path]

   set cursorPos [[$tbl entrypath] index insert]
   if {[catch {selection get} txt]} {
      #puts "FEHLER: >>$txt<<"
   }

   if {[vmTclTools::valInteger2 $txt] == 1} {
      $_bvnr(tblCPath1) insert $cursorPos $txt
      clipboard clear
      selection clear
      return 1
   } else {
      bell
      return 0
   }
}

getTbl1Path 方法只是给出了表列表的路径。 valInteger returns 只有 0 或 1.

每当我将一些文本粘贴到已编辑的单元格时,都会执行 pasteGrber 方法,但无论如何都会粘贴复制的文本。我怎样才能避免这种情况?

要停止触发正常绑定,您需要让 main 绑定脚本执行 break。这意味着您应该让 pasteGrber 方法在它想要抑制可能触发的其他绑定时执行此操作:

return -code break

这使得 调用上下文 执行 break (因为 break 确实生成了一种特殊类型的异常)。