You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Invoking the GUI after an installation of mne-icalabel[gui] via pip on a Windows 11 and Debian bookworm machine in a fresh Python 3.9 environment fails with an
ImportError: Failed to import any qt binding
Installing PyQt5 resolves the error.
Steps to reproduce
On both machines, I performed the following installations:
and then followed the tutorial exactly. Here is the outcome
click to expand Windows CMD
C:\Users\adina\repos>pipinstallmne-icalabel[gui]
Requirementalreadysatisfied: mne-icalabel[gui] inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (0.3.1)
Requirementalreadysatisfied: poochinc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne-icalabel[gui]) (1.6.0)
Requirementalreadysatisfied: torchinc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne-icalabel[gui]) (1.12.1)
Requirementalreadysatisfied: mne>=1.1inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne-icalabel[gui]) (1.1.0)
Requirementalreadysatisfied: numpy>=1.16.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne-icalabel[gui]) (1.23.2)
Requirementalreadysatisfied: scipy>=1.2.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne-icalabel[gui]) (1.9.0)
CollectingqtpyDownloadingQtPy-2.2.0-py3-none-any.whl (82kB)
|████████████████████████████████|82kB2.9MB/sCollectingmne-qt-browserDownloadingmne_qt_browser-0.3.1-py3-none-any.whl (70kB)
|████████████████████████████████|70kB4.5MB/sRequirementalreadysatisfied: matplotlibinc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne-icalabel[gui]) (3.5.3)
Requirementalreadysatisfied: decoratorinc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne>=1.1->mne-icalabel[gui]) (5.1.1)
Requirementalreadysatisfied: jinja2inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne>=1.1->mne-icalabel[gui]) (3.1.2)
Requirementalreadysatisfied: packaginginc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne>=1.1->mne-icalabel[gui]) (21.3)
Requirementalreadysatisfied: tqdminc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommne>=1.1->mne-icalabel[gui]) (4.62.3)
Requirementalreadysatisfied: appdirs>=1.3.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frompooch->mne-icalabel[gui]) (1.4.4)
Requirementalreadysatisfied: requests>=2.19.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frompooch->mne-icalabel[gui]) (2.27.1)
Requirementalreadysatisfied: pyparsing!=3.0.5,>=2.0.2inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frompackaging->mne>=1.1->mne-icalabel[gui]) (3.0.9)
Requirementalreadysatisfied: certifi>=2017.4.17inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (fromrequests>=2.19.0->pooch->mne-icalabel[gui]) (2021.10.8)
Requirementalreadysatisfied: charset-normalizer~=2.0.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (fromrequests>=2.19.0->pooch->mne-icalabel[gui]) (2.0.7)
Requirementalreadysatisfied: idna<4,>=2.5inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (fromrequests>=2.19.0->pooch->mne-icalabel[gui]) (3.3)
Requirementalreadysatisfied: urllib3<1.27,>=1.21.1inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (fromrequests>=2.19.0->pooch->mne-icalabel[gui]) (1.26.7)
Requirementalreadysatisfied: MarkupSafe>=2.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (fromjinja2->mne>=1.1->mne-icalabel[gui]) (2.1.1)
Requirementalreadysatisfied: kiwisolver>=1.0.1inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommatplotlib->mne-icalabel[gui]) (1.4.4)
Requirementalreadysatisfied: cycler>=0.10inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommatplotlib->mne-icalabel[gui]) (0.11.0)
Requirementalreadysatisfied: pillow>=6.2.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommatplotlib->mne-icalabel[gui]) (9.2.0)
Requirementalreadysatisfied: python-dateutil>=2.7inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommatplotlib->mne-icalabel[gui]) (2.8.2)
Requirementalreadysatisfied: fonttools>=4.22.0inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frommatplotlib->mne-icalabel[gui]) (4.36.0)
Requirementalreadysatisfied: six>=1.5inc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (frompython-dateutil>=2.7->matplotlib->mne-icalabel[gui]) (1.16.0)
CollectingcolorspaciousDownloadingcolorspacious-1.1.2-py2.py3-none-any.whl (37kB)
CollectingscoobyDownloadingscooby-0.6.0-py3-none-any.whl (14kB)
CollectingqdarkstyleDownloadingQDarkStyle-3.1-py2.py3-none-any.whl (870kB)
|████████████████████████████████|870kB6.8MB/sCollectingdarkdetectDownloadingdarkdetect-0.7.1-py2.py3-none-any.whl (8.2kB)
Collectingpyqtgraph>=0.12.3Downloadingpyqtgraph-0.12.4-py3-none-any.whl (995kB)
|████████████████████████████████|995kB3.2MB/sRequirementalreadysatisfied: typing-extensionsinc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (fromtorch->mne-icalabel[gui]) (4.3.0)
Requirementalreadysatisfied: coloramainc:\users\adina\appdata\local\programs\python\python39\lib\site-packages (fromtqdm->mne>=1.1->mne-icalabel[gui]) (0.4.4)
Installingcollectedpackages: qtpy, scooby, qdarkstyle, pyqtgraph, darkdetect, colorspacious, mne-qt-browserSuccessfullyinstalledcolorspacious-1.1.2darkdetect-0.7.1mne-qt-browser-0.3.1pyqtgraph-0.12.4qdarkstyle-3.1qtpy-2.2.0scooby-0.6.0WARNING: Youareusingpipversion21.2.4; however, version22.2.2isavailable.
Youshouldconsiderupgradingviathe'C:\Users\adina\AppData\Local\Programs\Python\Python39\python.exe -m pip install --upgrade pip'command.
C:\Users\adina\repos>ipythonPython3.9.9 (tags/v3.9.9:ccb0e6a, Nov152021, 18:08:50) [MSCv.192964bit (AMD64)]
Type'copyright', 'credits'or'license'formoreinformationIPython8.4.0--AnenhancedInteractivePython. Type'?'forhelp.
In [1]: importos
...:
...: importmne
...: frommne.preprocessingimportICA
...:
...: frommne_icalabel.guiimportlabel_ica_componentsIn [2]: sample_data_folder=mne.datasets.sample.data_path()
...: sample_data_raw_file=os.path.join(
...: sample_data_folder, "MEG", "sample", "sample_audvis_filt-0-40_raw.fif"
...: )
...: raw=mne.io.read_raw_fif(sample_data_raw_file)
...:
...: # Here we'll crop to 60 seconds and drop gradiometer channels for speed
...: raw.crop(tmax=60.0).pick_types(meg="mag", eeg=True, stim=True, eog=True)
...: raw.load_data()
OpeningrawdatafileC:\Users\adina\mne_data\MNE-sample-data\MEG\sample\sample_audvis_filt-0-40_raw.fif...
Readatotalof4projectionitems:
PCA-v1 (1x102) idlePCA-v2 (1x102) idlePCA-v3 (1x102) idleAverageEEGreference (1x60) idleRange : 6450 ... 48149=42.956 ... 320.665secsReady.
Reading0 ... 9009=0.000 ... 59.999secs...
Out[2]: <Raw|sample_audvis_filt-0-40_raw.fif, 171x9010 (60.0s), ~14.8MB, dataloaded>In [3]: # high-pass filter the data and then perform ICA
...: filt_raw=raw.copy().filter(l_freq=1.0, h_freq=None)
...: ica=ICA(n_components=15, max_iter="auto", random_state=97)
...: ica.fit(filt_raw)
Filteringrawdatain1contiguoussegmentSettinguphigh-passfilterat1HzFIRfilterparameters---------------------Designingaone-pass, zero-phase, non-causalhighpassfilter:
-Windowedtime-domaindesign (firwin) method-Hammingwindowwith0.0194passbandrippleand53dBstopbandattenuation-Lowerpassbandedge: 1.00-Lowertransitionbandwidth: 1.00Hz (-6dBcutofffrequency: 0.50Hz)
-Filterlength: 497samples (3.310sec)
[Parallel(n_jobs=1)]: UsingbackendSequentialBackendwith1concurrentworkers.
[Parallel(n_jobs=1)]: Done1outof1|elapsed: 0.0sremaining: 0.0s
[Parallel(n_jobs=1)]: Done2outof2|elapsed: 0.0sremaining: 0.0s
[Parallel(n_jobs=1)]: Done3outof3|elapsed: 0.0sremaining: 0.0s
[Parallel(n_jobs=1)]: Done4outof4|elapsed: 0.0sremaining: 0.0s
[Parallel(n_jobs=1)]: Done161outof161|elapsed: 0.0sfinishedFittingICAtodatausing161channels (pleasebepatient, thismaytakeawhile)
Selectingbynumber: 15componentsFittingICAtook0.8s.
Out[3]: <ICA|rawdatadecomposition, method: fastica (fitin22iterationson9010samples), 15ICAcomponentsexplaining94.3%ofvariance (161PCAcomponentsavailable), channeltypes: mag, eeg, nosourcesmarkedforexclusion>In [4]: gui=label_ica_components(raw, ica)
...:
...: # The `ica` object is modified to contain the component labels
...: # after closing the GUI and can now be saved
...: # gui.close() # typically you close when done
...:
...: # Now, we can take a look at the components, which were modified in-place
...: # for the ICA instance.
...: print(ica.labels_)
---------------------------------------------------------------------------ImportErrorTraceback (mostrecentcalllast)
InputIn [4], in<cellline: 1>()
---->1gui=label_ica_components(raw, ica)
3# The `ica` object is modified to contain the component labels4# after closing the GUI and can now be saved5# gui.close() # typically you close when done67# Now, we can take a look at the components, which were modified in-place8# for the ICA instance.9print(ica.labels_)
File~\AppData\Local\Programs\Python\Python39\lib\site-packages\mne_icalabel\gui\__init__.py:26, inlabel_ica_components(inst, ica, show, block)
5"""Launch the IC labelling GUI. 6 7 Parameters (...) 22 The graphical user interface (GUI) window. 23 """24frommne.viz.backends._utilsimport_init_mne_qtapp, _qt_app_exec--->26from ._label_componentsimportICAComponentLabeler28# get application29app=_init_mne_qtapp()
File~\AppData\Local\Programs\Python\Python39\lib\site-packages\mne_icalabel\gui\_label_components.py:4, in<module>1fromtypingimportDict, List, Union3frommatplotlibimportpyplotasplt---->4frommatplotlib.backends.backend_qt5aggimportFigureCanvasQTAgg5frommneimportBaseEpochs6frommne.ioimportBaseRawFile~\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\backend_qt5agg.py:7, in<module>4from .. importbackends6backends._QT_FORCE_QT5_BINDING=True---->7from .backend_qtaggimport ( # noqa: F401, E402 # pylint: disable=W06118_BackendQTAgg, FigureCanvasQTAgg, FigureManagerQT, NavigationToolbar2QT,
9backend_version, FigureCanvasAgg, FigureCanvasQT10 )
13 @_BackendQTAgg.export14class_BackendQT5Agg(_BackendQTAgg):
15passFile~\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\backend_qtagg.py:9, in<module>5importctypes7frommatplotlib.transformsimportBbox---->9from .qt_compatimportQT_API, _enum, _setDevicePixelRatio10from .. importcbook11from .backend_aggimportFigureCanvasAggFile~\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\backends\qt_compat.py:142, in<module>140break141else:
-->142raiseImportError("Failed to import any qt binding")
143else: # We should not get there.144raiseAssertionError(f"Unexpected QT_API: {QT_API}")
ImportError: Failedtoimportanyqtbinding
click to expand Linux zsh
```
(joss) adina@muninn in ~/repos/mne-icalabel on git:main!
❱ ipython
Python 3.9.12 (main, Mar 24 2022, 13:02:21)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import os
...:
...: import mne
...: from mne.preprocessing import ICA
...:
...: from mne_icalabel.gui import label_ica_components
In [2]: sample_data_folder = mne.datasets.sample.data_path()
...: sample_data_raw_file = os.path.join(
...: sample_data_folder, "MEG", "sample", "sample_audvis_filt-0-40_raw.fif"
...: )
...: raw = mne.io.read_raw_fif(sample_data_raw_file)
...:
...: # Here we'll crop to 60 seconds and drop gradiometer channels for speed
...: raw.crop(tmax=60.0).pick_types(meg="mag", eeg=True, stim=True, eog=True)
...: raw.load_data()
Opening raw data file /home/adina/mne_data/MNE-sample-data/MEG/sample/sample_audvis_filt-0-40_raw.fif...
Read a total of 4 projection items:
PCA-v1 (1 x 102) idle
PCA-v2 (1 x 102) idle
PCA-v3 (1 x 102) idle
Average EEG reference (1 x 60) idle
Range : 6450 ... 48149 = 42.956 ... 320.665 secs
Ready.
Reading 0 ... 9009 = 0.000 ... 59.999 secs...
Out[2]: <Raw | sample_audvis_filt-0-40_raw.fif, 171 x 9010 (60.0 s), ~14.8 MB, data loaded>
In [3]: # high-pass filter the data and then perform ICA
...: filt_raw = raw.copy().filter(l_freq=1.0, h_freq=None)
...: ica = ICA(n_components=15, max_iter="auto", random_state=97)
...: ica.fit(filt_raw)
Filtering raw data in 1 contiguous segment
Setting up high-pass filter at 1 Hz
FIR filter parameters
Designing a one-pass, zero-phase, non-causal highpass filter:
Windowed time-domain design (firwin) method
Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 161 out of 161 | elapsed: 0.1s finished
Fitting ICA to data using 161 channels (please be patient, this may take a while)
Selecting by number: 15 components
Fitting ICA took 0.5s.
Out[3]: <ICA | raw data decomposition, method: fastica (fit in 22 iterations on 9010 samples), 15 ICA components explaining 94.3 % of variance (161 PCA components available), channel types: mag, eeg, no sources marked for exclusion>
In [4]: gui = label_ica_components(raw, ica)
...:
...: # The ica object is modified to contain the component labels
...: # after closing the GUI and can now be saved
...: # gui.close() # typically you close when done
...:
...: # Now, we can take a look at the components, which were modified in-place
...: # for the ICA instance.
...: print(ica.labels_)
ImportError Traceback (most recent call last)
Input In [4], in <cell line: 1>()
----> 1 gui = label_ica_components(raw, ica)
3 # The ica object is modified to contain the component labels
4 # after closing the GUI and can now be saved
5 # gui.close() # typically you close when done
6
7 # Now, we can take a look at the components, which were modified in-place
8 # for the ICA instance.
9 print(ica.labels_)
File ~/repos/mne-icalabel/mne_icalabel/gui/init.py:26, in label_ica_components(inst, ica, show, block)
5 """Launch the IC labelling GUI.
6
7 Parameters
(...)
22 The graphical user interface (GUI) window.
23 """
24 from mne.viz.backends._utils import _init_mne_qtapp, _qt_app_exec
---> 26 from ._label_components import ICAComponentLabeler
28 # get application
29 app = _init_mne_qtapp()
File ~/repos/mne-icalabel/mne_icalabel/gui/_label_components.py:4, in
1 from typing import Dict, List, Union
3 from matplotlib import pyplot as plt
----> 4 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
5 from mne import BaseEpochs
6 from mne.io import BaseRaw
File ~/env/joss/lib/python3.9/site-packages/matplotlib/backends/backend_qtagg.py:9, in
5 import ctypes
7 from matplotlib.transforms import Bbox
----> 9 from .qt_compat import QT_API, _enum, _setDevicePixelRatio
10 from .. import cbook
11 from .backend_agg import FigureCanvasAgg
File ~/env/joss/lib/python3.9/site-packages/matplotlib/backends/qt_compat.py:142, in
140 break
141 else:
--> 142 raise ImportError("Failed to import any qt binding")
143 else: # We should not get there.
144 raise AssertionError(f"Unexpected QT_API: {QT_API}")
ImportError: Failed to import any qt binding
</details>
Installing PyQt5, which currently isn't listed as a dependency for the ```[gui]``` components, solved the issue on both machines.
The text was updated successfully, but these errors were encountered:
Yes, we took the same approach as mne-qt-browser: install qtpy but don't install one of the 4 possibles qt bindings. c.f. their requirement file. It is up to the user to install in the environment one of PyQt5, PyQt6, PySide2, or Pyside6.
The difference with mne-qt-browser is that we raise if the bindings are missing, while the browser will swap the backend to matplotlib.
The error message should be improved, it's not super explicit, and maybe also let's add a note in the tutorial. Would that be acceptable to resolve this issue?
The error message should be improved, it's not super explicit, and maybe also let's add a note in the tutorial. Would that be acceptable to resolve this issue?
Describe the bug
Invoking the GUI after an installation of
mne-icalabel[gui]
via pip on a Windows 11 and Debian bookworm machine in a fresh Python 3.9 environment fails with anInstalling PyQt5 resolves the error.
Steps to reproduce
On both machines, I performed the following installations:
and then followed the tutorial exactly. Here is the outcome
click to expand Windows CMD
click to expand Linux zsh
``` (joss) adina@muninn in ~/repos/mne-icalabel on git:main! ❱ ipython Python 3.9.12 (main, Mar 24 2022, 13:02:21) Type 'copyright', 'credits' or 'license' for more information IPython 8.4.0 -- An enhanced Interactive Python. Type '?' for help.In [1]: import os
...:
...: import mne
...: from mne.preprocessing import ICA
...:
...: from mne_icalabel.gui import label_ica_components
In [2]: sample_data_folder = mne.datasets.sample.data_path()
...: sample_data_raw_file = os.path.join(
...: sample_data_folder, "MEG", "sample", "sample_audvis_filt-0-40_raw.fif"
...: )
...: raw = mne.io.read_raw_fif(sample_data_raw_file)
...:
...: # Here we'll crop to 60 seconds and drop gradiometer channels for speed
...: raw.crop(tmax=60.0).pick_types(meg="mag", eeg=True, stim=True, eog=True)
...: raw.load_data()
Opening raw data file /home/adina/mne_data/MNE-sample-data/MEG/sample/sample_audvis_filt-0-40_raw.fif...
Read a total of 4 projection items:
PCA-v1 (1 x 102) idle
PCA-v2 (1 x 102) idle
PCA-v3 (1 x 102) idle
Average EEG reference (1 x 60) idle
Range : 6450 ... 48149 = 42.956 ... 320.665 secs
Ready.
Reading 0 ... 9009 = 0.000 ... 59.999 secs...
Out[2]: <Raw | sample_audvis_filt-0-40_raw.fif, 171 x 9010 (60.0 s), ~14.8 MB, data loaded>
In [3]: # high-pass filter the data and then perform ICA
...: filt_raw = raw.copy().filter(l_freq=1.0, h_freq=None)
...: ica = ICA(n_components=15, max_iter="auto", random_state=97)
...: ica.fit(filt_raw)
Filtering raw data in 1 contiguous segment
Setting up high-pass filter at 1 Hz
FIR filter parameters
Designing a one-pass, zero-phase, non-causal highpass filter:
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.0s remaining: 0.0s
[Parallel(n_jobs=1)]: Done 161 out of 161 | elapsed: 0.1s finished
Fitting ICA to data using 161 channels (please be patient, this may take a while)
Selecting by number: 15 components
Fitting ICA took 0.5s.
Out[3]: <ICA | raw data decomposition, method: fastica (fit in 22 iterations on 9010 samples), 15 ICA components explaining 94.3 % of variance (161 PCA components available), channel types: mag, eeg, no sources marked for exclusion>
In [4]: gui = label_ica_components(raw, ica)
...:
...: # The
ica
object is modified to contain the component labels...: # after closing the GUI and can now be saved
...: # gui.close() # typically you close when done
...:
...: # Now, we can take a look at the components, which were modified in-place
...: # for the ICA instance.
...: print(ica.labels_)
ImportError Traceback (most recent call last)
Input In [4], in <cell line: 1>()
----> 1 gui = label_ica_components(raw, ica)
3 # The
ica
object is modified to contain the component labels4 # after closing the GUI and can now be saved
5 # gui.close() # typically you close when done
6
7 # Now, we can take a look at the components, which were modified in-place
8 # for the ICA instance.
9 print(ica.labels_)
File ~/repos/mne-icalabel/mne_icalabel/gui/init.py:26, in label_ica_components(inst, ica, show, block)
5 """Launch the IC labelling GUI.
6
7 Parameters
(...)
22 The graphical user interface (GUI) window.
23 """
24 from mne.viz.backends._utils import _init_mne_qtapp, _qt_app_exec
---> 26 from ._label_components import ICAComponentLabeler
28 # get application
29 app = _init_mne_qtapp()
File ~/repos/mne-icalabel/mne_icalabel/gui/_label_components.py:4, in
1 from typing import Dict, List, Union
3 from matplotlib import pyplot as plt
----> 4 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
5 from mne import BaseEpochs
6 from mne.io import BaseRaw
File ~/env/joss/lib/python3.9/site-packages/matplotlib/backends/backend_qt5agg.py:7, in
4 from .. import backends
6 backends._QT_FORCE_QT5_BINDING = True
----> 7 from .backend_qtagg import ( # noqa: F401, E402 # pylint: disable=W0611
8 _BackendQTAgg, FigureCanvasQTAgg, FigureManagerQT, NavigationToolbar2QT,
9 backend_version, FigureCanvasAgg, FigureCanvasQT
10 )
13 @_BackendQTAgg.export
14 class _BackendQT5Agg(_BackendQTAgg):
15 pass
File ~/env/joss/lib/python3.9/site-packages/matplotlib/backends/backend_qtagg.py:9, in
5 import ctypes
7 from matplotlib.transforms import Bbox
----> 9 from .qt_compat import QT_API, _enum, _setDevicePixelRatio
10 from .. import cbook
11 from .backend_agg import FigureCanvasAgg
File ~/env/joss/lib/python3.9/site-packages/matplotlib/backends/qt_compat.py:142, in
140 break
141 else:
--> 142 raise ImportError("Failed to import any qt binding")
143 else: # We should not get there.
144 raise AssertionError(f"Unexpected QT_API: {QT_API}")
ImportError: Failed to import any qt binding
The text was updated successfully, but these errors were encountered: