微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Eel将JavaScript变量值传递给Python

如何解决使用Eel将JavaScript变量值传递给Python

我有一个使用eel库构建良好的GUI的python程序。

在GUI中,我需要将一个JS函数中的变量传递给Python以存储在变量中。

有什么想法吗?

解决方法

您可以阅读下面的Github文章。也许这会有所帮助。

https://github.com/samuelhwilliams/Eel

返回值 尽管我们想将代码视为由单个应用程序组成,但是Python解释器和浏览器窗口在单独的进程中运行。这可能会使它们之间来回通信变得一团糟,尤其是当我们总是必须显式地将值从一侧发送到另一侧时。

Eel支持从应用程序另一端检索返回值的两种方法,这有助于使代码简洁。

为防止永远挂在Python端,已设置了超时时间,尝试从JavaScript端检索值,默认值为10000毫秒(10秒)。可以使用_js_result_timeout参数将其更改为eel.init。 JavaScript端没有相应的超时。

回调 调用公开函数时,可以立即传递回调函数。函数在另一端执行完后,将自动使用返回值异步调用此回调。

例如,如果我们在Javascript中定义并公开了以下函数:

eel.expose(js_random);
function js_random() {
  return Math.random();
}

然后在Python中,我们可以像这样从Javascript端检索随机值:

    def print_num(n):
        print('Got this from Javascript:',n)

# Call Javascript function,and pass explicit callback function
eel.js_random()(print_num)

# Do the same with an inline lambda as callback
eel.js_random()(lambda n: print('Got this from Javascript:',n))
(It works exactly the same the other way around).

同步退货 在大多数情况下,对另一端的调用是为了快速检索某些数据,例如小部件的状态或输入字段的内容。在这种情况下,同步几毫秒然后继续执行代码比将整个过程分解成多个回调更为方便。

要同步检索返回值,只需将任何内容都传递给第二组括号即可。因此,在Python中,我们将编写:

n = eel.js_random()()  # This immediately returns the value
print('Got this from Javascript:',n)

您只能在浏览器窗口启动后(调用eel.start()之后)执行同步返回,否则显然会挂起。

在Javascript中,该语言不允许我们在等待回调时进行阻塞,除非在异步函数内部使用await。因此,JavaScript方面的等效代码为:

async function run() {
  // Inside a function marked 'async' we can use the 'await' keyword.

  let n = await eel.py_random()(); // Must prefix call with 'await',otherwise it's the same syntax
  console.log("Got this from Python: " + n);
}

run();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。