Artículo
· 31 ago, 2022 Lectura de 2 min

Python Embebido y tcl tkinter en Windows

Si tu código de Python Embebido llama a la librería tkinter (que es usada por muchas librerías especializadas en la creación de gráficos, como matplotlib), puede que obtengas este error:

<THROW> *%Exception.PythonException <CLASS DOES NOT EXIST> 230 ^^0^DO ##CLASS(User.Test).Test() 
<class '_tkinter.TclError'>: Can't find a usable init.tcl in the following directories:

c:/intersystems/irispy/lib/python/lib/tcl8.6
c:/intersystems/irispy/lib/tcl8.6
c:/intersystems/lib/tcl8.6
c:/intersystems/irispy/library
c:/intersystems/library
c:/intersystems/tcl8.6.9/library
c:/tcl8.6.9/library

This probably means that Tcl wasn't installed properly.

Este es un ejemplo de código para generar este error:

Class User.Test
{

/// do ##class(User.Test).Test()
ClassMethod Test() [ Language = python ]
{
import matplotlib.pyplot as plt
import numpy as np

# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)

fig, ax = plt.subplots()
ax.plot(t, s)

ax.set(xlabel='time (s)', ylabel='voltage (mV)')
ax.grid()

fig.savefig("test.png")
}

}

En ese caso, necesitas no instalar las librerías tcl y tk. Uno de los enfoques es la generación desde el código fuente.

Para Windows, puedes obtener los binarios preconstruidos aquí. Por ejemplo, basado en mi error, necesito la version-8.6.12.5. Descárgala y desde el archivo lib, copia tcl8.6 y tk8.6 en c:/intersystems/irispy/lib/python/lib/ o en cualquier otra ruta desde tu mensaje de error.

Tras ello, puedes encontrarte otro error:

Can't find a usable init.tcl in the following directories:
c:/intersystems/irispy/lib/python/lib/tcl8.6 
c:/intersystems/irispy/lib/tcl8.6 
c:/intersystems/lib/tcl8.6 
c:/intersystems/irispy/library 
c:/intersystems/library 
c:/intersystems/tcl8.6.9/library 
c:/tcl8.6.9/library

c:/intersystems/irispy/lib/python/lib/tcl8.6/init.tcl: version conflict for package "Tcl": have 8.6.9, need exactly 8.6.12
version conflict for package "Tcl": have 8.6.9, need exactly 8.6.12
while executing "package require -exact Tcl 8.6.12"
(file "c:/intersystems/irispy/lib/python/lib/tcl8.6/init.tcl" line 19)
invoked from within "source c:/intersystems/irispy/lib/python/lib/tcl8.6/init.tcl" ("uplevel" body line 1)
invoked from within "uplevel #0 [list source $tclfile]"

This probably means that Tcl wasn't installed properly.

Eso significa que los binarios son de una versión diferente de la que cabría esperar, pero como es una diferencía mínima, puede resolverse abriendo init.tcl y reemplazando

package require -exact Tcl 8.6.12

con

package require -exact Tcl 8.6.9

Haz lo mismo en tk.tcl:

package require -exact Tk  8.6.12

con

package require -exact Tk  8.6.9

Y tras esto, tkinter debería funcionar.

Comentarios (0)1
Inicie sesión o regístrese para continuar