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.12Por
package require -exact Tcl 8.6.9Faça o mesmo para o tk.tcl:
package require -exact Tk 8.6.12Por
package require -exact Tk 8.6.9E depois disso, o tkinter deve funcionar.