我在tcl / tk上编写各种程序的时间越长,我越会钦佩它的功能和体贴。但是直到最近,有一件事没有让我休息。开发GUI时,通常必须使用文件资源管理器(tk_getSaveFile,tk_getOpenFile或tk_chooseDirectory)。并且如果在Windows或OS X平台上加载了这些平台的本机文件浏览器,则在Linux平台上加载了来自tcl / tk的资源管理器(好吧,Linux中没有本机资源管理器):
在此资源管理器中,什么不适合您?缺少文件夹/文件的基本操作-创建,销毁,重命名。不,不要以为tcl本身就可以实现所有这些机制,当然它们根本不在Explorer GUI中。但是在Linux上,这并不是很明显。但是在Android平台上,来自Tcl / Tk的指挥者带来了许多不便:
当我们谈论Android平台时,我们指的是在Androwish上开发应用程序。然后这样的时候到了,自我隔离,等等。结果,诞生了一种Balalaika(也称为package / tcl的包)tkfe(tk文件浏览器)。在开发tkfe软件包时,我们不仅考虑到至少需要对文件/目录进行基本操作,而且还希望不仅在单独的窗口中而且在单独的框架中都有一个指南,用户自己可以将其放置在自己的GUI中。该项目有一个使用软件包的综合示例。因此,下载项目,转到〜// TkFileExplorer / samples文件夹并运行示例:$wish tkfe_samplefull.tcl
实际上,该示例清楚地说明了程序包的所有功能。例如,运行资源管理器以在单独的窗口中选择一个文件夹:
资源管理器本身具有两种语言的界面:俄语和英语。单击带有标志的按钮时,将即时进行翻译:
除带有标志的按钮外,还有一个带有工具(工具)的按钮,单击后将显示上下文菜单,可以在当前目录(创建目录/文件)或选定的文件/文件夹(删除/重命名):
文件浏览器的任何功能都将返回变量的名称(带下划线的NAME)(请参见tkfe_samplefull.tcl示例),所选文件或目录的路径将写入该变量;如果拒绝选择,则该变量将为空。收到变量名称后,它将保留等待获得任何结果的时间,例如: . . .
#
# window - ; frame -
set typew "window"
#
set msk "*.txt *.doc *.crt * .*"
#
set tekdir $env(HOME)
#
set vrr [FE::fe_getopenfile $typew $w $tekdir $msk]
#
vwait $vrr
. . .
如果使用框架导体的放置类型,则需要注意其在图片中的放置。可以以任何方式放置(网格,包装或放置)。首选方法仍然是放置方法。您不必担心重新设置图像的格式,因为与网格和打包不同,放置位置可以将框架叠加在现有图像的顶部:
如果仔细查看图像,您会注意到右侧的屏幕截图与左侧的屏幕截图有所不同,其隐藏文件夹的外观(名称开头从这一点来看)。要显示隐藏的按钮,必须启用带有眼睛形图标的按钮。文件夹和文件也可以按字母顺序排序,文件按大小排序:
当将资源管理器放置在框架中时,您还应该注意阻止多余的按钮(将资源管理器放置在窗口中时,tkfe balalaika会处理此问题)。tkfe软件包包括两个函数,这些函数使窗口小部件在给定窗口小部件内不可访问(all_disable)或可用(all_enable): proc all_disable {parent} {
set widgets [info commands $parent*]
foreach w $widgets {
catch {$w configure -state disabled}
}
}
proc all_enable {parent} {
set widgets [info commands $parent*]
foreach w $widgets {
catch {$w configure -state normal}
}
}
namespace export fe_getsavefile
namespace export fe_getopenfile
namespace export fe_choosedir
namespace export all_enable
namespace export all_disable
但是,我更喜欢使用tk busy功能。在示例中可以清楚地看到
这一点:这是一个理论。实际上,tkfe软件包用于基于cryptoarmpkcs公钥标准的加密工作站。现在,在Linux平台上的此应用程序中使用文件资源管理器看起来像这样:
但是资源管理器位于框架中:
并且,当然,在Android平台上使用资源管理器变得非常方便:
有人可能会问:Windows或OS X呢?是的,一切都很好。但是像在Windows上一样,这是Russification的问题,在我们的例子中,这是在文件和文件夹的命名中使用西里尔字母,以及使用反斜杠。因此,必须将以下行添加到代码中:#
# MS Win cp1251
set tekdir [encoding convertfrom cp1251 $tekdir ]
#
set tekdir [string map {"\\" "/"} $tekdir]
这是Windows平台上的tkfe Explorer的外观:
软件包本身及其使用示例在此处。