HE 2007-12-26: I wrote this small editor to try the new peer functionality of the text widget and the new ttk::notebook.
HJG: Added an "About"-command.
AM 2009-10-03: Here is a small example of how to add formatting to the text widget: Editing with different fonts
package require Tk set title {edit 0.0} global dateien ;# Array with index = tab and data = filename #-------# # procs # #-------# proc textfenster {mframe {master {}}} { if {$master eq {}} { text [set mframe].t -bg white -xscrollcommand [ list [set mframe].x set] -yscrollcommand [ list [set mframe].y set] -wrap word } else { $master peer create [set mframe].t } scrollbar [set mframe].x -orient horizontal -command [ list [set mframe].t xview] -width 12 scrollbar [set mframe].y -orient vertical -command [ list [set mframe].t yview] -width 12 grid configure [set mframe].t -column 0 -row 0 -sticky nsew grid configure [set mframe].x -column 0 -row 1 -sticky ew grid configure [set mframe].y -column 1 -row 0 -sticky ns grid columnconfigure [set mframe] 0 -weight 1 grid columnconfigure [set mframe] 1 -weight 0 grid rowconfigure [set mframe] 0 -weight 1 grid rowconfigure [set mframe] 1 -weight 0 return [set mframe].t } proc newTab {{filename {}}} { set pw [ttk::panedwindow .nb.pw[llength [.nb tabs]] -orient vertical] frame $pw.f1 frame $pw.f2 $pw add $pw.f1 $pw add $pw.f2 textfenster $pw.f1 textfenster $pw.f2 $pw.f1.t $pw.f1.t configure -undo 1 pack $pw -expand 1 -fill both if {$filename eq {}} { .nb add $pw } else { .nb add $pw -text [file tail $filename] set fid [open $filename r] $pw.f1.t insert end [read $fid] close $fid $pw.f1.t edit modified 0 } set ::dateien($pw) $filename .nb select $pw return $pw } proc menu_new {} { newTab return } proc menu_open {} { set filename [tk_getOpenFile -title $::title] if {$filename eq {}} { return } newTab $filename return } proc menu_close {{pw {}}} { if {$pw eq {}} { set pw [.nb select] } if {[$pw.f1.t edit modified]} { if {[tk_messageBox -title $::title -type yesno -icon info -message "The contents of the tab isn't saved yet. Save now?"] eq {yes}} { menu_save $pw } } .nb forget $pw destroy $pw unset ::dateien($pw) return } proc menu_save {{pw {}}} { if {$pw eq {}} { set pw [.nb select] } if {$::dateien($pw) eq {}} { menu_saveAs $pw } set fid [open $::dateien($pw) w] puts -nonewline $fid [$pw.f1.t get 1.0 end] close $fid $pw.f1.t edit modified 0 return } proc menu_saveAs {{pw {}}} { if {$pw eq {}} { set pw [.nb select] } set filename [tk_getSaveFile -title $::title -initialfile $::dateien($pw)] if {$filename ne {}} { set ::dateien($pw) $filename .nb tab $pw -text [file tail $filename] menu_save $pw } return } proc menu_exit {} { foreach pw [.nb tabs] { menu_close $pw } exit } proc menu_undo {} { set pw [.nb select] if {$pw ne {}} { $pw.f1.t edit undo } return } proc menu_redo {} { set pw [.nb select] if {$pw ne {}} { $pw.f1.t edit redo } return } proc menu_cut {} { set pw [.nb select] if {$pw ne {}} { tk_textCut $pw.f1.t } return } proc menu_copy {} { set pw [.nb select] if {$pw ne {}} { tk_textCopy $pw.f1.t } return } proc menu_paste {} { set pw [.nb select] if {$pw ne {}} { tk_textPaste $pw.f1.t } return } proc menu_delete {} { set pw [.nb select] if {$pw ne {}} { #$pw.f1.t edit redo } return } proc menu_about {} { tk_messageBox -title "About $::title" -type ok -icon info \ -message "A small editor with tabs. \nUses ttk::notebook from Tcl/Tk 8.5." return } #-----# # GUI # #-----# proc gui {} { # Menu menu .menu -tearoff 0 .menu add cascade -label File -menu .menu.file .menu add cascade -label Edit -menu .menu.edit .menu add cascade -label Help -menu .menu.help menu .menu.file -tearoff 0 .menu.file add command -label New -command menu_new -accelerator Ctrl+N .menu.file add command -label Open -command menu_open -accelerator Ctrl+O .menu.file add command -label Close -command menu_close -accelerator Ctrl+C .menu.file add command -label Save -command menu_save -accelerator Ctrl+S .menu.file add command -label {Save as...} -command menu_saveAs .menu.file add separator .menu.file add command -label Exit -command menu_exit menu .menu.edit -tearoff 0 .menu.edit add command -label Undo -command menu_undo -accelerator Ctrl+Z .menu.edit add command -label Redo -command menu_redo -accelerator Ctrl+R .menu.edit add separator .menu.edit add command -label Cut -command menu_cut -accelerator Ctrl+X .menu.edit add command -label Copy -command menu_copy -accelerator Ctrl+C .menu.edit add command -label Paste -command menu_paste -accelerator Ctrl+V .menu.edit add command -label Delete -command menu_delete -accelerator Del menu .menu.help -tearoff 0 .menu.help add command -label About -command menu_about -accelerator F1 . configure -menu .menu # GUI ttk::notebook .nb pack .nb -expand 1 -fill both wm geometry . 400x400 wm protocol . WM_DELETE_WINDOW menu_exit return } #------# # Main # #------# proc main {} { gui return } main