Escrito por

IRIS Developer at Shift
Artigo Vitor Leal da Silva · 10 h atrás 2m read

Embedded Python e tcl tkinter no Windows

Se o seu código em Embedded Python chamar a biblioteca tkinter (que é utilizada por várias bibliotecas de geração de gráficos, incluindo a matplotlib), você poderá se deparar com o seguinte erro:

<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.

Aqui está um exemplo de código para disparar este erro:

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")
}

}

Nesse caso, você não precisa instalar as bibliotecas tcl e tk. Uma das abordagens é compilar a partir do código-fonte.

Para Windows, você pode obter os binários pré-compilados aqui. Por exemplo, com base no meu erro, eu preciso da versão 8.6.12.5. Baixe-a e, da pasta lib, copie tcl8.6 e tk8.6 para c:/intersystems/irispy/lib/python/lib/ ou qualquer outro caminho que apareça na sua mensagem de erro.

Depois disso, você poderá se deparar com outro erro:

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.

Isso significa que os binários são de uma versão diferente daquela que seria esperada, mas como é uma diferença micro (uma variação pequena), isso pode ser resolvido abrindo o init.tcl e substituindo

package require -exact Tcl 8.6.12

Por

package require -exact Tcl 8.6.9

Faça o mesmo para o  tk.tcl:

package require -exact Tk  8.6.12

Por

package require -exact Tk  8.6.9

E depois disso, o tkinter deve funcionar.