我做了一个通过Python执行它时完美工作的程序,但是当我计算可执行文件时,它会显示ImportError: No module named 'tkinter'
。我不明白为什么因为一切似乎都对我好。
我将app.py
的副本粘贴到pyInstaller所在的C:\Python\Scripts
文件夹中。我计算命令行pyinstaller -F app.py
,这会在app.exe
文件夹中创建dist
。当我运行此代码时,我有
ImportError: No module named 'tkinter'
Failed to execute script prog
我因为试图制作.exe
而被阻挡了几天:(
操作系统:Windows64
通过pip install
安装PyInstaller
Python: 3.5 for Win64
注意:我今天已经unistall / install python 3次(在阅读本网站和国外的文档后)。
注2:我仅将Python用于科学问题。我不是计算机科学家,所以在解释计算机时要善待我:S
这是我的代码:
from math import*
from pylab import*
import numpy as np
from tkinter import *
from tkinter.messagebox import *
import matplotlib
import numpy as np
import matplotlib.backends.backend_tkagg
import matplotlib.pyplot as plt
import time
#pour convertir en exe: pyinstaller -F nom_fichier.py
#########
#Fonction euler :
#=================
def eulersolver(posi_init,temps_init,temps_fin,dx_dt):
x0=float(posi_init);
t0=float(temps_init);
tmax=float(temps_fin);
fun=str(dx_dt);
h=0.01; #pas d'integration
N=int(abs(tmax-t0)/h)+1; #+1 pour arriver a T[N]=Tmax
X=np.zeros(N) #indice de n=0 -> N-1 (il y en a N)
T=np.zeros(N)
def F(x1,t1):
x=x1;
t=t1;
F=eval(fun);
return F;
T[0]=t0;
X[0]=x0;
data=open("data.txt","w") #cré le fichier de datas
data.write("t\t;x\n") #y met les titres
data.write(str(T[0])+"\t;"+str(X[0])+"\n") #les premiers points
for i in range(1,N):
T[i]=T[i-1]+h;
X[i]=X[i-1]+F(X[i-1],T[i-1])*h;
data.write(str(T[i])+"\t;"+str(X[i])+"\n") #enregistre les points dans data
data.close();#ferme data
plt.plot(T,X,label="Solution");
plt.title('EulerSolver représentation');
plt.xlabel('t');
plt.ylabel('x(t)');
axes=plt.gca()
axes.set_xlim([t0,tmax])
plt.show();
legend()
if askyesno('Fin de résolution', 'Encore une résolution ?'):
showwarning('Attention', 'Le présent fichier data.txt sera effacé !')
else:
showinfo('Merci', "Merci d'avoir utilisé mon application !")
showerror("Pense-bête", "Fichier data.txt créé !")
app.destroy();
return
####################################### FIN FONCTION EULER
app=Tk();
app.title("EulerSolver")
pre="""
Programme permettant de résoudre une ODE d'ordre 1
avec la méthode dite d'Euler. EDO du type dx(t)/dt=F(x,t).
Pensez à écrire avec la convention python (pas de multiplication
implicite, pas pas de '^' pour les puissance, et pensez à mettre
des virgules aux chiffres (5.0 au lieu de 5 tout court).
"""
presentation=Label(app,text=pre,padx=25,pady=10)
presentation.pack()
#Domaine
DOM=LabelFrame(app,text="Limites du calcul", padx=25, pady=20)
DOM.pack(fill="both", expand="yes")
Label(DOM,text="Domaine temporel de résolution :").pack(side=LEFT)
temps_init=StringVar()
temps_init.set("temps initial")
TI=Entry(DOM, textvariable=temps_init, width=15,justify=LEFT)
TI.pack()
saut=Label(DOM,text='',pady=2).pack()
temps_fin=StringVar()
temps_fin.set("temps final")
TF=Entry(DOM, textvariable=temps_fin, width=15,justify=LEFT)
TF.pack()
#CI
CI=LabelFrame(app,text="Conditions initiales", padx=25, pady=15)
CI.pack(fill="both", expand="yes")
Label(CI,text="Donner la valeur initiale de x :").pack(side=LEFT)
cond_init=StringVar()
cond_init.set("x(t=t0)")
X0=Entry(CI, textvariable=cond_init, width=15)
X0.pack()
#Fonction
FUNC=LabelFrame(app,text="Fonction", padx=25, pady=15)
FUNC.pack(fill="both", expand="yes")
Label(FUNC,text="Donnez dx/dt en terme de x et t seulement :").pack(side=LEFT)
derivee=StringVar()
derivee.set("dx/dt")
F=Entry(FUNC, textvariable=derivee, width=15)
F.pack()
message=Label(app,text="Si tout es rempli, on peut résoudre !",padx=25,pady=5)
message.pack()
resolution=Button(app, text="Résoudre", command=lambda : eulersolver(X0.get(),TI.get(),TF.get(),F.get()))
resolution.pack()
fin=Label(app,text="(c)*********",padx=25,pady=5)
fin.pack()
app.mainloop();