Comment appeler une fonction TCL à partir de Python

Mise à jour: 30 septembre 2006
Version: 1.0
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2006 Jean-Louis BICQUELET-SALAÜN

interet

Beaucoup de widgets on été écrit en TCL, de nombreuses personnes on écrit en TCL, il est aussi facile d'écrire rapidement en TCL, il serait donc dommage de ne pas profiter de ces ressources.

C'est d'autant plus facile que le module Tkinter dispose d'un interpréteur de TCL/TK.

fonctionnement

Il suffit de d'importer le module Tkinter de créer un objet Tk puis d'utiliser la fonction root.tk.eval qui contient votre code TCL.

exemples

un menu

from Tkinter import *

root = Tk()
root.tk.eval('''
proc menu {} {
            font create helvfont -family Helvetica -size 10 -weight normal -slant roman
            wm title . "Personnal Menu"

            button .firefox -text "firefox" -bd 1 -foreground #444444 -command \
        	{ if { [catch { exec c:/data/firefox/firefox.exe } ] } { exit } } -width 8 -font helvfont

            button .htmlpad -text "htmlpad" -bd 1 -foreground #444444 -command \
	    { exec c:/data/bin/htmlpad.exe } -width 8 -font helvfont


            button .excal -text "excal" -bd 1 -foreground #444444 -command \
	    {  exec c:/data/bin/excal32.exe } -width 8 -font helvfont

            button .negato -text "negato" -bd 1 -foreground #444444 -command \
	    { if { [catch { exec c:/data/bin/negato.exe } ] } { exit } } -width 8 -font helvfont

            button .exit -text "exit" -bd 1 -foreground #444444 -command \
        	{exit} -width 8 -font helvfont


            grid .firefox -row 0 -column 0 -sticky news
            grid .excal -row 1 -column 0
            grid .htmlpad -row 1 -column 1
            grid .negato -row 2 -column 1
            grid .exit -row 2 -column 2
}
 '''
 )
root.tk.eval('menu')

une horloge

Il est possible d'appeler d'autres fonctions TCL à partir de l'évaluateur. L'exemple qui suit est plus complexe:

from Tkinter import *

root = Tk()
root.tk.eval('''
  proc hands {} {
    set twopi 6.283185
    catch { .c delete withtag hands }

    # Compute seconds since midnight

    set s [expr { [clock seconds] - [clock scan 00:00:00] }]

    # Angle of second hand

    set angle [expr { $s * $twopi / 60. }]
    set y [expr { 100 - 90 * cos($angle) }]
    set x [expr { 100 + 90 * sin($angle) }]
    .c create line 100 100 $x $y -width 1 -tags hands

    # Minute hand

    set angle [expr { $s * $twopi / 60. / 60. }]
    set y [expr { 100 - 85 * cos($angle) }]
    set x [expr { 100 + 85 * sin($angle) }]
    .c create line 100 100 $x $y -width 3 -capstyle projecting -tags  hands

    # Hour hand

    set angle [expr { $s * $twopi / 60. / 60. / 12. }]
    set y [expr { 100 - 60 * cos($angle) }]
    set x [expr { 100 + 60 * sin($angle) }]
    .c create line 100 100 $x $y -width 7 -capstyle projecting -tags hands

    after 1000 hands

 }

proc main {} {
grid [canvas .c -width 200 -height 200]
set halfpi 1.570796
set piover6 0.5235987

 .c create oval 2 2 200 200 -fill white -outline black
 for { set h 1 } { $h <= 12 } { incr h } {
    set angle [expr { $halfpi - $piover6 * $h }]
    set x [expr { 100 + 90 * cos($angle) }]
    set y [expr { 100 - 90 * sin($angle) }]
    .c create text $x $y -text $h -font {Helvetica -12}
 }
 hands
}
 '''
 )
root.tk.eval('main')
root.mainloop()