1.窗体图标设置
今天想自己尝试改动Tcl下的窗口图标来着,搜索到在tcl/tk wiki:
package require Tcl
package require Tk
if { $argc!=1 } {
puts stderr "$argv0 gif_pathname"
exit
}
set icon_pathname [lindex$argv0]
set i [image create photo .i1 -format gif -file$icon_pathname]
set b [button .b1 -text hello]
pack $b
toplevel .icon;pack [label .icon.l -image $i]
wm iconwindow ..icon
在命令行窗口中:wish f1.tcl tiger.gif后,得到的图标窗体如下:
即时我把图片下载好的PNG图片,通过在线转换成16x16,后仍然没法在红色Tcl位置显示出我想要的Tiger图标,心中自有一种愤怒感,连改动图标这么简单的事情,都设置不了,tk作为界面设计的灵活性就可不是有一点差了。但是没办法,由于QuartusII的调试工具仅仅支持Tcl语言,出离的愤怒,而且oschina上有网友说Tk在UI上的bug多的不计其数,维护的人都不好意思了[作为行外人,自己听听知道就行了,具体有些什么bug,我也不知道],还有一个既是优点又是缺点的地方,其所使用的表达式,以字符存储为主,而非数据存储,比如说C和matlab。
2.打包成win下的exe可执行文件
因为上面的图标没法在窗体栏正确的显示吗,所以想尝试下,如果转换成-data格式的数据指定,看能否识别。
2.1获得image 对象的-data数据
所以,第一件事情就是把图片转换成-data十六进制格式。然后在Creating image photo data from GIF files获取了从gif图片导出成16进制数的脚本工具。
代码如下:
#======================================================================
# gif2base64.tcl
# Tcl Source File -- Created with SAPIEN Technologies
# PrimalSCRIPT(TM)
# NAME: base64 Encode Routine
# AUTHOR: David Bigelow , Simplified Logic, Inc.
# DATE : 10/29/2001
# UPGRADE: Martin Hahn, LVermGeo Rheinland-Pfalz, martin.hahn@lvermgeo.rlp.de
# UPGRADE: hae, use panedwindow
# DATE : 03.03.2004
# COMMENT: base64 Image Encoding Application
#====================================================================
package require base64
wm title . "Base64 Image Encoder"
set pw [panedwindow .pw -orient horizontal]
listbox .lb -width 20 -height 30
text .tb -width 80 -height 30
$pw add .lb
$pw add .tb
pack $pw -expand 1 -fill both
bind .lb
catch {destroy .ii}
.tb delete 0.0 end
set fnamein [.lb get [.lb curselection]]
set fpin [open [concat $::dirname/$fnamein] r]
fconfigure $fpin -translation binary
set encoded [::base64::encode [read $fpin]]
close $fpin
set fpout [open [concat $::dirname/[file rootname $fnamein].b64] w]
.tb insert end "***** CLIP START BELOW *****\n\n"
set numlines [llength [split $encoded]]
set count 1
foreach item [split $encoded] {
# Filter to not include a line continuation on the last line
if {$count < $numlines} {
.tb insert end "$item\\\n"
puts $fpout "$item"
} else {
.tb insert end "$item\n"
puts $fpout "$item\n"
}
incr count
}
.tb insert end "\n***** END CLIP *****\n"
close $fpout
image create photo testimg -data $encoded
label .ii -image testimg
pack .ii -side top
}
.tb insert end "[package names]"
set ::dirname [tk_chooseDirectory -title "Select Image Directory " -initialdir [pwd]]
set files [glob -nocomplain $::dirname/*.gif]
foreach fname $files {
.lb insert end [file tail $fname]
}
focus -force .tb
非常好用,能将gif图片转化为16进制数据
将set i [image create photo .i1 -format gif -file $icon_pathname ] 改为set i [image create photo .i1 -format gif –data {R01G00…AA7}]
即可。
后来尝试将图标换成了这个数据后,图标仍然不再窗体栏展示,算了,不知道原因在哪儿,问题1不能解决就是了,而且我也没看到过有人的窗体是设置了自己的图标,而且大型模拟机ixbar3000的图标也是默认的红色图标。注意:图2中只能显示gif格式的文件图,因为只开发了 这一种格式的文件转换,tk也默认支持ppm,和位图bitmap(但是后来了解到的位图是单色的?不过可以透明。)
2.2打包exe独立执行文件
上述文件第一次用上,还比较实用,打包成exe文件,可以尝试下。搜索到了Tcl/tk实例—使用tclkit工具将脚本打包成可执行文件(.exe)(内容是how2sd的中文简化版),但是在第四步时,做出来的exe老是提示:Can't find package base64 while executing…… 。我的base64文件(安装路径下没有搜索到base64.tcl,只有base64-2.4.2.tm和base64-1文件,后来就从googlecode下载)的确是放在app.vfs/lib/下面的,而且加入了tk.tcl包。后来打开了base64-2.4.2文件,很多namespac和proc,独立的主脚本基本没有,而且查看和google-code下的差不多,觉得就用本系统的就足矣。然后,继续想了下tcl的运行过程,可以尝试一下source的运行方法,后来将之放在同目录下成功了。
在app.tcl中第一行加入语句 source base64-2.4.2.tm。
但是,在加入了过后依然不能完成之前的独立wish86 gif2base64.tcl,结果如下:
当选择了文件夹之后,上面默认的宏包便消失了,然后左边区域也没有任何文件名称(我设置的路径和之前一模一样)。双击没有文件的区域,提示listbox的选项 index出错.
事后,分析其中的原因,有可能是1这句话语法本身有问题,导致报错;2.这句话没问题,只是遇到了特殊的场合才出现的问题,比如空白的区域没有一个文字。然后进一步锁定原因2,在之前的gif2base64.tcl文件中,没有选取文件,故意让文件显示栏为空,出现如图5所示同样的报错。于是开始想,下一步可能的原因可能是:1. 选择文件夹的名称是空(本身选择文件夹的界面就有所差异);2. 或者文件路径不为空,但是文件夹路径名称在我选择后没有传进去;
后来分析了下代码,按照运行步骤读懂了程序,单独在wish里面source和单步运行调试。
到这儿时发现了问题的可能所在:
路径中有中文?!能不能换个其它英文路径再试之,结果一下子就对了。
然后瞬间就想到了之前在运行
tclkit.exe sdx.kit qwrap app.tcl
tclkit.exe sdx.kit unwrap app.kit
tclkit.exe sdx.kit wrap app.exe -runtime tclkit2.exe
运行这几行命令时,也出现过路径中有中文无法识别的现象,于是现在可以总结出来了,不是程序的问题。
.kit对中文路径的支持效果奇差无比!
接下来,就需要测试一下这个打包程序电脑的数据了。
结果是可以,但是tclkit要转换成对应的版本win32,而非win64