GUI
下列简单的脚本建立一个基于 Tk 的应用,看起来象:
这个应用的窗口有一个顶层菜单条,它有一个下拉菜单设置 3D 对象的颜色,还使用 Tk 标尺组件来指定旋转的角度。标尺条连接到画布组件上。
frame .fr1 -width 18c -height 15.0c -bd 2 ;#main frame
#toplevel .fr1
pack .fr1
frame .fr1.menubar -relief raised -bd 2
pack .fr1.menubar -padx 1 -fill x
menubutton .fr1.menubar.graphics -text Graphics -underline 0 -menu \
.fr1.menubar.graphics.menu
button .fr1.menubar.qb -text Quit -underline 0 -com exit
pack .fr1.menubar.graphics -side left
pack .fr1.menubar.qb -side right
#Graphics menu
menu .fr1.menubar.graphics.menu
.fr1.menubar.graphics.menu add cascade -label "Line Colour" \
-menu .fr1.menubar.graphics.menu.fmenu
menu .fr1.menubar.graphics.menu.fmenu
.fr1.menubar.graphics.menu.fmenu add radiobutton -label "Magenta" \
-com {ChangeColour "Magenta"}
.fr1.menubar.graphics.menu.fmenu add radiobutton -label "Yellow" \
-com {ChangeColour "Yellow"}
.fr1.menubar.graphics.menu.fmenu add radiobutton -label "White" \
-com {ChangeColour "White"}
frame .fr1.panl -width 2.0c -height 12.0c -bg black
frame .cfr -width 16.0c -height 12.0c -bd 1
pack .fr1.panl .cfr -in .fr1 -side left -padx 2 -fill x
canvas .can -width 12.0c -height 11.8c -xscrollcommand ".xs set" \
-yscrollcommand ".ys set"
scrollbar .ys -command ".can yview"
pack .can .ys -in .cfr -side left -fill x -fill y
scrollbar .xs -orient horizontal -command ".can xview"
place .xs -in .fr1 -x 3.2c -y 13.2c -width 12.0c
scale .scal -label "rotate box throu" -bigincrement 30 \
-from 0 -to 360 -showvalue True -orient horizontal -tickinterval 0 \
-variable cval -com {rotate_box $cval}
pack .scal -in .fr1.panl
tkwait visibility .scal
SetupPhigs .can
MakeCube
proc ChangeColour { curcolour } {
ChCol $curcolour
}
注意给标尺组件的选项。通过调用"tkwait"来挂起进程一直等到标尺组件可见。这确保画布组件在它的 X 标识符被访问之前已被建立。如果没有它,PHIGS 将尝试在不存在的 X 窗口中打开它的工作站并为此而抱怨。
在工作目录中的一个文件中建立这个脚本。要调用你扩展的 "wish",你可以包含下面的这一行:
#!./myapp作为你的脚本的第一行。否则,从命令行交互的运行 myapp 并 source 这个脚本(确保这个脚本文件是可执行的)。结果将是:
你将发现 PHIGS 更新工作站失败。你可以通过与标尺条或下拉菜单交互来发送一个 X 事件强制进行更新。
Tk 不支持 3D 图形和在画布组件中显示的项目的旋转。在这个例子中,使用 PHIGS 完成了这些功能。旋转和颜色变更的结果看起来将象:
对于有兴趣的读者,我们推荐基于 Tk 的 GOOD ,它是给在 X 下运行的应用的一个面向对象的框架,支持 SGI GL 等。它是自由的但要当心它的文档是德文的。