package require Tk 8
menu .menubar -type menubar
.menubar add cascade -label File -menu .menubar.file -underline 0
#file menu
menu .menubar.file -tearoff 0
.menubar.file add command -label "New" -underline 0 \
-command { new }
.menubar.file add command -label "Open..." -underline 0 \
-command {
set fileid [open $filename r]
# filename is set in file_save_as
set data [read $fileid $filesize]
close $fileid
.text.t insert end $data
wm title . $filename
}
proc save { } {
set data [.text.t get 1.0 {end -1c}]
set fileid [open $filename w]
puts -nonewline $fileid $data
close $fileid
}
proc file_save_as { } {
global filename
set data [.text.t get 1.0 {end -1c}]
set file_types {
{"Tcl Files" { .tcl .TCL .tk .TK} }
{"Text Files" { .txt .TXT} }
{"All Files" * }
}
set filename [tk_getSaveFile -filetypes $file_types\
-initialdir pwd -initialfile $filename\
-defaultextension .tcl]
wm title . $filename
set fileid [open $filename w]
puts -nonewline $fileid $data
close $fileid
}
tk appname "Edit"I know this could have been even more minimalist, but thought this would answer most of the recent questions I have seen. Left one little glitch in here on purpose... Also, no error handling.Hope this is helpful to someone. I remember (not too long ago), how long it took me to get this far working out of a book :^) so
Also, please note that the menu in the above script requires tcl/tk 8.0 or higher. There are some grab problems with this type of a menu when running Gnome.
A really minimal example is of course this one-liner:
if 0 {
pack [text .t -wrap word] -fill both -expand 1
}Even though it doesn't have a scrollbar, you can scroll with middle mouse-button held down. And you can paste into it, copy from it... all from one line of Tk code :^) RSescargo 19 Apr 2005 - Somewhere along the way this file stopped being complete. When I used wish-reaper to download it, several important parts were missing. I had to go back to the revision history to reconstruct the new and file_get procs. I also had to reconstruct most of the menus.EKB 19 April 2005 -- It still seems incomplete (??) Is it possible to restore it?escargo - I would prefer to have it restored in place instead of having correcting code added after, since I want to use wish-reaper (or equivalent functions) to extract the code. (That's why I also put if 0 { in front of the minimal example above.)
EKB 19 April 2005 - Here's an alternative for the "File|Open..." menu commandFirst, make the File|Open command call a named proc:
.menubar.file add command -label "Open..." -underline 0 \
-command file_openThis is usually a good idea, because then it is easy to bind it to a key combination, similar to using actions:bind . <Control-o> file_openThe Ctrl-O key combination can now be added as an annotation on the menu, using the -accelerator switch:
.menubar.file add command -label "Open..." -underline 0 \
-command file_open -accelerator "Ctrl+O"The proc itself has some extra bells and whistles compared to the one aboveproc file_open {} {
global filename
set data [.text.t get 1.0 {end -1c}]
set file_types {
{ {Tcl Files} { .tcl .TCL .tk .TK} }
{ {Text Files} { .txt .TXT} }
{ {All Files} * }
}
set new_filename [tk_getOpenFile -filetypes $file_types\
-initialdir [file dirname $filename] \
-initialfile [file tail $filename] \
-defaultextension .tcl]
if {$new_filename == ""} {
# The user pressed "cancel"
return
}
if [catch {open $new_filename r} fileid] {
# Error opening file -- with "catch", fileid holds error message
tk_messageBox -icon error -message "Couldn't open \"$filename\":\n$fileid"
return
}
# OK, didn't cancel, and filename is valid -- save it
set filename $new_filename
# ?? This was original: "set data [read $fileid $filesize]" -- where is
# variable "filesize" defined?
set data [read $fileid]
close $fileid
# First, clear out text widget
.text.t delete 1.0 end
# Now, insert new file
.text.t insert end $data
wm title . $filename
}
