tk print from 8.7 for 8.6
experimented a bit with print.tcl from tk8.7 in tk8.6
Tip 604 Tip Printing Support for Text and Canvas Widgets
Printing in core - still a ways to go before TIP, but major milestone
#print-8.6erw.tcl
# ..lib/print-8.6erw.tcl
#0.3
#13.09.2023 14.20
# using print.tcl and tk print from tk8.7 for tk8.6
if {[info tclversion] eq "8.6"} {
source [file join [file normalize [file dirname [info script]]] print.tcl]
# ..lib/print.tcl
# print.tcl from src/tk/library (Source Code tk 8.7)
# https://core.tcl-lang.org/tips/doc/trunk/tip/604.md
if {[tk windowingsystem] eq "win32"} {
package require gdi
package require printer
#Tcl Extensions by Michael Schwarz
#http://wiki.tcl-lang.org/page/TkPrint
package require struct::list
namespace eval ::tk::print {
# this 4 procs exists in tk8.7 not in libs printer or gdi, wrapper in tk 8.6
proc _openprinter {args} {
# variable printargs
variable printer_name
variable paper_width
variable paper_height
variable dpi_x
variable dpi_y
variable copies
#set pliste [printer list]
set hDC [printer open {*}$args]
set attr [struct::list flatten [printer attr -hDc $hDC]]
# diff to 8.7, proc _set_dc, set printargs(hDC) $printer_name
# set printer_name [dict get $attr device]
# set printargs(printer_name) [dict get $attr device]
set printer_name [lindex $hDC 0]
set paper_width [lindex [dict get $attr "page dimensions"] 0]
set paper_height [lindex [dict get $attr "page dimensions"] 1]
set dpi_x [lindex [dict get $attr "pixels per inch"] 0]
set dpi_y [lindex [dict get $attr "pixels per inch"] 1]
set copies [dict get $attr copies]
}
proc _closeprinter {} {
printer close
}
proc _opendoc {} {
printer job start
}
proc _closedoc {} {
printer job end
}
proc _openpage {} {
printer page start
}
proc _closepage {} {
printer page end
}
proc _gdi {args} {
gdi {*}$args
#tailcall gdi {*}$args
}
proc _selectprinter {} {
# variable printargs
variable printer_name
variable paper_width
variable paper_height
variable dpi_x
variable dpi_y
variable copies
set hDC [printer dialog select]
set attr [struct::list flatten [printer attr -hDc $hDC]]
# diff to 8.7, proc _set_dc, set printargs(hDC) $printer_name
# set printer_name [dict get $attr device]
# set printargs(printer_name) [dict get $attr device]
set printer_name [lindex $hDC 0]
set paper_width [lindex [dict get $attr "page dimensions"] 0]
set paper_height [lindex [dict get $attr "page dimensions"] 1]
set dpi_x [lindex [dict get $attr "pixels per inch"] 0]
set dpi_y [lindex [dict get $attr "pixels per inch"] 1]
set copies [dict get $attr copies]
}
}
}
}Example: printtest86.tcl
#printtest86.tcl
package require Tk
#package require tkcon
#tkcon show
# ../lib/lib print-8.6erw.tcl
# ../lib/print.tcl
# print.tcl from src/tk/library (Source Code tk 8.7)
source [file join [file join [file normalize [file dirname [info script]]] lib print-8.6erw.tcl]]
proc call {} {
#set out ""
set out [catch {tk print .t} err1]
.t insert end "arr: [array get ::tk::print::printargs]\n"
.t insert end "out: $out \n"
.t insert end "err1: $err1 \n"
.t insert end "attr: [catch {printer attr -hdc $::tk::print::printargs(hDC)} err2]\n"
.t insert end "err2: $err2 \n\n"
}
text .t
button .btn -text print -command {call}
.t insert end "[info patchlevel] \n"
.t insert end "[tk windowingsystem]\n"
.t insert end "[info nameofexecutable]\n\n"
pack .t -fill both -expand 1
pack .btn -expand 0greg Update 2026: A maintained version is now available on GitHub: https://github.com/gregnix/tkprintcompat