Repository: evidentlyai/evidently
Issue: ModuleNotFoundError: No module named 'tkinter' on evidently version 0.3.2 when importing evidently modules
Root cause: Validation Gap

We have been using evidently 0.3.1 to run data drift detection jobs on DataBricks cluster with runtime 11.3 LTS ML for a while. 

It has  been running without issue for a few weeks using evidently 0.3.1.  When the cluster booted today, it automatically used 0.3.2 because we didn't have evidently pinned and now it gives this error 

`ModuleNotFoundError: No module named 'tkinter'`

Full error stack:

```
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<command-1695407214055700> in <cell line: 6>()
      4 
      5 from evidently import ColumnMapping
----> 6 from evidently.test_suite import TestSuite
      7 
      8 from evidently.test_preset import NoTargetPerformanceTestPreset

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/test_suite/__init__.py in <module>
----> 1 from .test_suite import TestSuite

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/test_suite/test_suite.py in <module>
     20 from evidently.pipeline.column_mapping import ColumnMapping
     21 from evidently.renderers.base_renderer import TestRenderer
---> 22 from evidently.suite.base_suite import Display
     23 from evidently.suite.base_suite import Suite
     24 from evidently.suite.base_suite import find_test_renderer

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/suite/base_suite.py in <module>
     28 from evidently.renderers.base_renderer import TestRenderer
     29 from evidently.renderers.notebook_utils import determine_template
---> 30 from evidently.suite.execution_graph import ExecutionGraph
     31 from evidently.suite.execution_graph import SimpleExecutionGraph
     32 from evidently.tests.base_test import GroupingTypes

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/suite/execution_graph.py in <module>
      7 
      8 from evidently.base_metric import Metric
----> 9 from evidently.tests.base_test import Test
     10 
     11 

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/tests/__init__.py in <module>
     17 from .classification_performance_tests import TestTNR
     18 from .classification_performance_tests import TestTPR
---> 19 from .data_drift_tests import TestAllFeaturesValueDrift
     20 from .data_drift_tests import TestColumnDrift
     21 from .data_drift_tests import TestCustomFeaturesValueDrift

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/tests/data_drift_tests.py in <module>
     13 from evidently.calculations.stattests import PossibleStatTestType
     14 from evidently.metric_results import DatasetColumns
---> 15 from evidently.metrics import ColumnDriftMetric
     16 from evidently.metrics import DataDriftTable
     17 from evidently.metrics import EmbeddingsDriftMetric

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/metrics/__init__.py in <module>
     16 from .classification_performance.quality_by_feature_table import ClassificationQualityByFeatureTable
     17 from .classification_performance.roc_curve_metric import ClassificationRocCurve
---> 18 from .data_drift.column_drift_metric import ColumnDriftMetric
     19 from .data_drift.column_value_plot import ColumnValuePlot
     20 from .data_drift.data_drift_table import DataDriftTable

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/metrics/data_drift/column_drift_metric.py in <module>
----> 1 from tkinter import N
      2 from typing import List
      3 from typing import Optional
      4 from typing import Union
      5 

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

ModuleNotFoundError: No module named 'tkinter'
```

Pip freeze output

`absl-py==1.0.0
argon2-cffi==20.1.0
astor==0.8.1
astunparse==1.6.3
async-generator==1.10
attrs==21.2.0
azure-core==1.22.1
azure-cosmos==4.2.0
backcall==0.2.0
backports.entry-points-selectable==1.1.1
bcrypt==4.0.0
black==22.3.0
bleach==4.0.0
blis==0.7.8
boto3==1.21.18
botocore==1.24.18
cachetools==5.2.0
catalogue==2.0.8
certifi==2021.10.8
cffi==1.14.6
chardet==4.0.0
charset-normalizer==2.0.4
click==8.0.3
cloudpickle==2.0.0
cmdstanpy==0.9.68
confection==0.0.1
configparser==5.2.0
convertdate==2.4.0
cryptography==3.4.8
cycler==0.10.0
cymem==2.0.6
Cython==0.29.24
databricks-automl-runtime==0.2.11.1
databricks-cli==0.17.3
dbl-tempo==0.1.12
dbus-python==1.2.16
debugpy==1.4.1
decorator==5.1.0
defusedxml==0.7.1
dill==0.3.4
diskcache==5.4.0
distlib==0.3.6
distro==1.4.0
distro-info===0.23ubuntu1
entrypoints==0.3
ephem==4.1.3
evidently==0.3.2
facets-overview==1.0.0
fast-ml==3.68
fasttext==0.9.2
filelock==3.3.1
Flask==1.1.2
flatbuffers==1.12
fsspec==2021.8.1
future==0.18.2
gast==0.4.0
gitdb==4.0.9
GitPython==3.1.27
google-auth==2.6.0
google-auth-oauthlib==0.4.6
google-pasta==0.2.0
grpcio==1.44.0
gunicorn==20.1.0
gviz-api==1.10.0
h5py==3.3.0
hijri-converter==2.2.4
holidays==0.15
horovod==0.25.0
htmlmin==0.1.12
huggingface-hub==0.9.1
idna==3.2
ImageHash==4.3.0
imbalanced-learn==0.8.1
importlib-metadata==4.8.1
ipykernel==6.12.1
ipython==7.32.0
ipython-genutils==0.2.0
ipywidgets==7.7.0
isodate==0.6.1
itsdangerous==2.0.1
jedi==0.18.0
Jinja2==3.1.2
jmespath==0.10.0
joblib==1.0.1
joblibspark==0.5.0
jsonschema==3.2.0
jupyter-client==6.1.12
jupyter-core==4.8.1
jupyterlab-pygments==0.1.2
jupyterlab-widgets==1.0.0
keras==2.9.0
Keras-Preprocessing==1.1.2
kiwisolver==1.3.1
korean-lunar-calendar==0.3.1
langcodes==3.3.0
libclang==14.0.6
lightgbm==3.3.2
llvmlite==0.37.0
LunarCalendar==0.0.9
Mako==1.2.0
Markdown==3.3.6
MarkupSafe==2.0.1
matplotlib==3.4.3
matplotlib-inline==0.1.2
missingno==0.5.1
mistune==0.8.4
mleap==0.20.0
mlflow-databricks-artifacts==2.0.0
mlflow-skinny==1.29.0
multimethod==1.9
murmurhash==1.0.8
mypy-extensions==0.4.3
nbclient==0.5.3
nbconvert==6.1.0
nbformat==5.1.3
nest-asyncio==1.5.1
networkx==2.6.3
nltk==3.8.1
notebook==6.4.5
numba==0.54.1
numpy==1.20.3
oauthlib==3.2.0
opt-einsum==3.3.0
packaging==21.0
pandas==1.5.3
pandas-profiling==3.1.0
pandocfilters==1.4.3
paramiko==2.9.2
parso==0.8.2
pathspec==0.9.0
pathy==0.6.2
patsy==0.5.2
petastorm==0.11.4
pexpect==4.8.0
phik==0.12.2
pickleshare==0.7.5
Pillow==8.4.0
platformdirs==2.5.2
plotly==5.9.0
pmdarima==1.8.5
preshed==3.0.7
prometheus-client==0.11.0
prompt-toolkit==3.0.20
prophet==1.0.1
protobuf==3.19.4
psutil==5.8.0
psycopg2==2.9.3
ptyprocess==0.7.0
pyarrow==7.0.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
pybind11==2.10.0
pycparser==2.20
pydantic==1.9.2
Pygments==2.10.0
PyGObject==3.36.0
PyJWT==2.5.0
PyMeeus==0.5.11
PyNaCl==1.5.0
pynndescent==0.5.10
pyodbc==4.0.31
pyparsing==3.0.4
pyrsistent==0.18.0
pystan==2.19.1.1
python-apt==2.0.1+ubuntu0.20.4.1
python-dateutil==2.8.2
python-editor==1.0.4
pytz==2021.3
PyWavelets==1.1.1
PyYAML==6.0
pyzmq==22.2.1
regex==2021.8.3
requests==2.26.0
requests-oauthlib==1.3.1
requests-unixsocket==0.2.0
rsa==4.9
s3path==0.4.1
s3transfer==0.5.2
scikit-learn==0.24.2
scipy==1.7.1
seaborn==0.11.2
Send2Trash==1.8.0
setuptools-git==1.2
shap==0.41.0
simplejson==3.17.6
six==1.16.0
slicer==0.0.7
smart-open==5.2.1
smmap==5.0.0
spacy==3.4.1
spacy-legacy==3.0.10
spacy-loggers==1.0.3
spark-tensorflow-distributor==1.0.0
sqlparse==0.4.2
srsly==2.4.4
ssh-import-id==5.10
statsmodels==0.12.2
tabulate==0.8.9
tangled-up-in-unicode==0.1.0
tenacity==8.0.1
tensorboard==2.9.1
tensorboard-data-server==0.6.1
tensorboard-plugin-profile==2.8.0
tensorboard-plugin-wit==1.8.1
tensorflow-cpu==2.9.1
tensorflow-estimator==2.9.0
tensorflow-io-gcs-filesystem==0.27.0
termcolor==2.0.1
terminado==0.9.4
testpath==0.5.0
thinc==8.1.2
threadpoolctl==2.2.0
tokenize-rt==4.2.1
tokenizers==0.12.1
tomli==2.0.1
torch==1.12.1+cpu
torchvision==0.13.1+cpu
tornado==6.1
tqdm==4.62.3
traitlets==5.1.0
transformers==4.21.2
typer==0.4.2
typing-extensions==3.10.0.2
tzdata==2023.3
ujson==4.0.2
umap-learn==0.5.3
unattended-upgrades==0.1
urllib3==1.26.7
virtualenv==20.8.0
visions==0.7.4
wasabi==0.10.1
wcwidth==0.2.5
webencodings==0.5.1
websocket-client==1.3.1
Werkzeug==2.0.2
widgetsnbextension==3.6.0
wrapt==1.12.1
xgboost==1.6.2
zipp==3.6.0`

![Screenshot 2023-05-19 at 1 19 34 PM](https://github.com/evidentlyai/evidently/assets/14816618/4d98e91e-9d9f-48ab-89f8-8df89fbf5ec7)


Contents of the DataBricks cell that produces the error 

```
import math
import dataclasses
from sklearn import datasets, ensemble, model_selection

from evidently import ColumnMapping
from evidently.test_suite import TestSuite

from evidently.test_preset import NoTargetPerformanceTestPreset
from evidently.test_preset import DataQualityTestPreset
from evidently.test_preset import DataStabilityTestPreset
from evidently.test_preset import DataDriftTestPreset
from evidently.test_preset import RegressionTestPreset
from evidently.test_preset import MulticlassClassificationTestPreset
from evidently.test_preset import BinaryClassificationTopKTestPreset
from evidently.test_preset import BinaryClassificationTestPreset
```

Update: Reverted evidently version of the cluster to 0.3.1 by changing the dependency list of the cluster from 'evidently~=0.3.1' to 'evidently==0.3.1'.

This fixed the issue and our pipelines are working again. 

I'm now fairly confident that version 0.3.2 introduced a bug.