我正在使用 d3 和 Flask 在浏览器中显示树形图。整个东西在本地存储和操作。
当用户将鼠标悬停在树形图中的每个节点上时,我想显示相关图像。
对于树形图所基于的 JSON 数据,我使用 url_for 和我的静态文件夹,如下所示:
d3.json("{{ url_for('static', filename=json_data) }}", function(error, flare) {
// Lots of code
包含 d3 也是一样的:
<script src="{{ url_for('static', filename='d3.js') }}"></script>
但是,当涉及到我想在悬停时出现的图像时,我使用来自 JSON 的数据来创建图像的名称。因为这意味着使用 JavaScript 变量而不是 python 变量,所以我看不到如何使用 url_for 显示它。
作为替代方案,我尝试使用一系列不同的绝对和相对路径,但没有任何效果。我读过一些关于 Firefox 不想显示本地文件的内容,但这肯定不适用于在我的计算机上运行的东西吗?我可以在浏览器中正常显示大量本地文件。无论哪种方式,我都安装了一个名为 LocalLink 的附加组件。这是我尝试使用此方法的代码:
var img_path;
d3.selectAll( ".node" ).on( "mouseover", function(d) {
img_path = "{{ image_path }}" + d.name + ".png";
document.getElementById('thumb').src=img_path;
document.getElementById('thumb').style.display='block';
在这里,python image_path 变量类似于 r"file:///C:/Python27/my/app/folders/etc/"
这几乎可以工作。图像不会出现在悬停时,但如果我使用 Firebug 并将鼠标悬停在 HTML 中的适当标签上,正确的图像会在我的光标旁边显示为缩略图。
我尝试使用引用“file:///.....”位置的图像创建一个简单的 HTML 页面。这样可行。这让我觉得这个方法的问题是 Flask。网站位置的绝对路径似乎没有问题(我已经测试过了,它有效),所以我猜测 Flask 不喜欢本地文件位置的绝对路径。
因此,有几种可能性可以解决这个问题:
- 有一种方法可以将 url_for 与 JavaScript 中生成的变量一起使用。
- 有一种方法可以将信息传递回 python 变量并在 url_for 中使用它。
- 有一种方法可以让 Flask 使用“file:///.....”格式显示这些图像。
还有其他方法吗?
我考虑过的唯一其他选择是将整个事情转移到网上。但是,我对 Python 托管不是很熟悉,而且这个应用程序使用了 Twisted 和 PyQT。我不知道如何将它们安装在服务器上。我什至不知道我构建的内容是否可以在线使用 - 你可以在实时网站上使用 Twisted 或 PyQT 吗?我对 Twisted 的所作所为只有模糊的感觉。
如果人们认为这是我最好/唯一的选择,我将详细解释我的应用程序是如何工作的,但在那之前我不会把事情搞得一团糟。