[Tkinter-discuss] Detecting third-party ttk themes

Michael Lange klappnase at web.de
Sun Mar 10 15:15:14 CET 2013


On Fri, 8 Mar 2013 23:27:25 +0100
Michael Lange <klappnase at web.de> wrote:

> Has any one an idea, is there a way to change the pkgIndex.tcl file so
> that ttk will find the themes automagically or isn't this possible at
> all?

It is hard to find any docs a tcl-illiterate as me can use, so I made
some further experiments. First I added a third line to the tile-themes
pkgIndex.tcl file:

set themesdir [file join [pwd] [file dirname [info script]]]
lappend auto_path $themesdir
package provide tile-themes 0.6

Now I can do:

>>> import Tkinter, ttk
>>> root = Tkinter.Tk()
>>> s = ttk.Style()
>>> s.theme_names()
('clam', 'alt', 'default', 'classic')
>>> root.tk.call('ttk::themes')
('classic', 'default', 'clam', 'alt')
>>> root.tk.call('package', 'require', 'tile-themes')
'0.6'
>>> s.theme_names()
('clam', 'alt', 'default', 'classic')
>>> root.tk.call('ttk::themes')
('keramik', 'plastik', 'clam', 'winxpblue', 'alt', 'Aquativo', 'classic',
'default', 'keramik_alt')
>>> 

which apears to be a step in the right direction. But why does
theme_names() still fail to find the themes?
Then I tried some more with the pkgIndex.tcl :

set themesdir [file join [pwd] [file dirname [info script]]]
lappend auto_path $themesdir
package provide tile-themes 0.6
source [file join $themesdir plastik plastik.tcl]

and actually:

root = Tkinter.Tk()
>>> root.tk.call('package', 'require', 'tile-themes')
'0.6'
>>> s = ttk.Style()
>>> s.theme_names()
('plastik', 'clam', 'alt', 'default', 'classic')
>>> 

However when trying to source the other theme files as I did with
plastik.tcl inside the pkgIndex.tcl I get strange errors:

>>> root.tk.call('package', 'require', 'tile-themes')
error reading package index file /usr/lib/tile-themes/pkgIndex.tcl: too
many nested evaluations (infinite loop?) error reading package index
file /usr/share/tcltk/tk8.3/pkgIndex.tcl: too many nested evaluations
(infinite loop?) error reading package index
file /usr/lib/tile-themes/pkgIndex.tcl: too many nested evaluations
(infinite loop?) error reading package index
file /usr/lib/tile-themes/pkgIndex.tcl: Theme Aquativo already exists
error reading package index file /usr/lib/tile-themes/pkgIndex.tcl: Theme
Aquativo already exists error reading package index
file /usr/lib/tile-themes/pkgIndex.tcl: Theme Aquativo already exists
(...)

where the amount of errors heavily depends on the order in which
the theme files are sourced.
I don't have an idea what's wrong here, but it seems like the first
solution is the best for now.
I think maybe I should file a bug report / patch to ad the missing
'ttk::themes' to ttk.py .

Regards

Michael

.-.. .. ...- .   .-.. --- -. --.   .- -. -..   .--. .-. --- ... .--. . .-.

Landru! Guide us!
		-- A Beta 3-oid, "The Return of the Archons", stardate
		   3157.4


More information about the Tkinter-discuss mailing list