我尝试使用panel文档中的一个例子来说明如何使用pyodide显示python中的panel组件,但是是来自react组件,而不是来自纯html。
我已经设置了一个可以克隆的minimal NextJS react app,并且只需要使用npm i && npm start
就可以在本地运行,我的例子适用于返回字符串或数字的简单python代码,但是当我尝试将它与一个简单滑块的示例panel代码一起使用时,我不确定返回什么才能对渲染滑块做出React。
python代码包含在src/App.js中,我只是将面板代码中的myPythonCodeString变量重写为一个简单的1 + 9算法,以演示它在这种简单情况下的工作原理。
任何帮助都将不胜感激。
- 编辑:**我已经向这个存储库添加了一些提交来解决这个问题,当这个问题被问到时,存储库的状态可以在提交3c735653dda0e873f17a98d0fb74edaca367ca00中看到。
2条答案
按热度按时间v1l68za41#
您的代码实际上是正确的,并且生成了小部件。唯一的问题是
Helmet
不像<head>
那样同步加载脚本。因此,您的脚本最终将同时加载,并且由于它们相互依赖,加载将失败。有一种简单的方法可以获得正确的输出:
1.将包含
id="simple_app"
的元素添加到应用程序中1.注解
Helmet
中的每个脚本,pyodide
和bokeh
除外1.使用
npm run start
启动应用程序1.取消注解下一个脚本并保存文件,使应用程序重新加载其状态
1.等待应用程序在浏览器中重新加载,然后使用下一个脚本重复操作
最后,所有脚本都将以正确的方式加载,小部件将继续工作。
最简单的解决方案是让
Helmet
同步加载脚本,或者使用其他方法加载脚本。uidvcgyl2#
感谢@TachyonicBytes帮助解决这个问题。正如他们所说,有两个问题,一个是脚本需要同步加载,一个接一个按顺序加载,我使用useScript hook from the usehooks-ts library完成了这一点。另一个是我需要创建一个div,其id与python代码中面板组件中的servable目标的id匹配。
一个github repo和工作应用程序以及中的修正可以是viewed here
使用pyodide运行python代码的组件如下所示:
示例用法如下所示:
结果是: