Jupyter Notebook 中 “Loading widget…” 不显示控件的问题
前言
最近在jupyter notebook中使用ipywidgets时,一直出现:
Loading widget...
控件完全不显示。
我折腾了很久,也问过AI。AI说应该是没有启用widgets的拓展包,然后按照AI给的步骤操作,最后也没有解决。
后来偶然在我使用的虚拟环境中运行jupyter notebook时,我脑门一拍,原来问题的根源不是 widgets 本身,而是 Jupyter Notebook 的启动方式和虚拟环境的关系。
一、现象:widgets 一直显示 Loading...
一般来说,我们在运行某个项目时,会先创建对应的虚拟环境,然后将其注册成jupyter notebook的内核。比如先创建一个虚拟环境myenv,并激活:
conda create -n myenv python=3.9
conda activate myenv
然后我们在这个虚拟环境中安装ipykernel:
pip install ipykernel
然后再执行:
python -m ipykernel install --user --name=myenv --display-name "Python(myenv)"
这样就成功将这个环境注册到jupyter的内核中,名字为Python (myenv)。
这时候我们打开终端执行jupyter notebook,并随便打开一个.ipynb文件,
然后我们可以在Kernel -> Change Kernel选择我们刚才创建的虚拟环境内核:

但是如果我们运行简单的ipywidgets语句时,就会出现如下情况:

就是一直显示Loading widget...
二、核心原因:启动 Notebook 的环境不是你选择的内核
前面虽然我们创建了虚拟环境,并在jupyter notebook中选择了对应虚拟环境的内核,但是要注意,我们是在base环境中启动的jupyter notebook,而不是在对应的虚拟环境中启动jupyter notebook。这是最关键也最容易被忽略的一点!
我们在网页上选择的内核只影响python及import的包,而ipywidgets前端还是来自你运行jupyter notebook命令的那个环境。
三、正确做法
其实很简单,还是以我们前面创建的虚拟环境myenv为例。(请提前把所需的包配置好)
如果我们要在myenv的环境下运行代码,那么先打开anaconda prompt,然后激活myenv:
![]()
然后在这个环境里输入jupyter notebook:(注意cd到自己需要的文件夹)
![]()
选择对应内核:

接下来运行一个简单的读取图片并显示的代码:
from IPython.display import display
import ipywidgets as widgetsimg = widgets.Image(value=open("pic.jpg","rb").read(), format='jpg')
display(img)
运行结果:

可以看到不再出现loading widget...的问题了。
四、总结
Notebook 启动环境 ≠ Notebook 内核(Kernel)
-
你在哪里输入
jupyter notebook,前端(JS 扩展)就来自哪个虚拟环境 -
你在网页上选的 Kernel(Python 内核)只影响 Python,不影响前端 widgets
要在jupyter notebook中运行涉及widget前端的代码时,则应该从相应的虚拟环境中启动jupyter notebook,然后再选择相应内核。
本文作者水平有限,如有错误欢迎指出,谢谢!
更多推荐

所有评论(0)