ABU 27-Sep-2022
ABU 10-Aug-2024 - Added compatibility with Tcl9
extrafont is a multi-platform binary package designed to provide "private fonts" for Tk apps.
"Private fonts" are fonts usually delivered with an app.
They don't need to be installed in some 'standard' system-wide directories; once these fonts are loaded, they can be used in the same way of pre-installed fonts.
These loaded fonts are only visible by the process (app) who loaded'em, and then disappear when the app terminates.
1.0 - Initial Release
1.1
1.2
1.3
1.3.1
The extrafont package provides these commands:
Examples: * list all the (extrafont) loaded font-files: extrafont::query files * list all the (extrafont) loaded font-families from font-files "Ariel*.ttf"" extrafont::query families -file "*/Ariel*.ttf" * list all the details of the font-family "Ariel*" extrafont::query details -family "Ariel*"
One important distinction to keep in mind is among
Font-filename is used just for loading an external font:
set fontfamilies [extrafont::load "c:/tmp/Monoton-regular.ttf"]
This font-file contains just one font. The font-family-name can be extracted as result of the extrafont::load command
foreach fontfamily $fontfamilies { puts "Loaded font-family: $fontfamily" } # just get the 1st font-familiy set myNewFontFamily [lindex $fontfamilies 0] ;# --> "Monoton"
Then, when you want to use this new font, you should create or configure a tk-fontname (using the standard 'font' command)
set myfontname "tk_monoton" ;# ... choose the name you want .. font create $myfontname -family $myNewFontFamily -size 20 # or, let tk choose a fontname for you ... set myfontname [font create -family $myNewFontFamily -size 20] # then use $myfontname for a new widget ... label .mylabel -font $myfontname .......
MG This is awesome! I have a couple of suggestions/observations, though:
font create myNewFont -family [extrafont::load $file]
lsearch -all -inline -glob -nocase [font families] $familyPattern
This is a really neat functionality to add, thank you. :)
APN I second that.
ABU - Extracting the font-family from a font-file, or better, as suggested by MG, let extrafont::load return the loaded font-family, is a very difficult task.
Windows/Linux/Mac have three very different font-management APIs, and as far as I googled I never found any hint about how to solve it.
Expert help is welcomed !
MG I had, naively, assumed it would be a fairly simple matter, but I can't find any related API calls for getting the info (on Windows). Without something intended specifically for it, all I can think of is looping through the list of installed font families first, storing the list of families, and comparing to the result after loading. However, that is both ridiculously inefficient, and potentially not even useful (since your new font may have the same name as, but be a different font to, something already installed). I'm sure you can extract the information from the font file directly, but given how many different font-file formats there are, that would be rather a pain to do...
beware 13/12/2017. I did this:
set currentfonts [extrafont::availableFamilies] set currfontl [llength $currentfonts] set fontpairs [list] foreach f $fontlist { extrafont::load $f set nowfonts [extrafont::availableFamilies] lappend fontpairs [list $f [lindex $nowfonts $currfontl]] incr currfontl } tk_messageBox -message $fontpairs
Which seems to help. fontlist is the result of glob on my directory of local fonts. Basically, at least on my system, the new fonts are added to the end of the list of available families, so if you add the fonts individually you can tally the filename against the font name.
ABU 27-May-2018 See the recent release of extrafont ver 1.2 enhanced the extrafont::load command, so that it returns the loaded font-families. Be aware that the returned value is a *list* of family-names, not just a single family-name.
MG Congrats on solving it! Great to see. I don't currently have a legitimate use for it personally, but I'm looking forward to playing with it for the hell of it at some point soon.