如何在pywebview/eel中从一个窗口启动一个动作并在另一个窗口中执行动作?

问题描述

所以,我一次在 pywebview 中打开了窗口。现在从窗口 1,我想单击一个按钮并在窗口 2 中显示一些文本。它们之间如何通信?我正在考虑使用 Flask-socketio 或任何基于套接字的解决方案。但这似乎有点矫枉过正,是吗?如何轻松实现?

这是在pywebview中打开多个窗口的代码

import webview

if __name__ == '__main__':
    master_window = webview.create_window(title='Window #1',url="<h1>First window</h1>")
    second_window = webview.create_window('Window #2',html='<h1>Second window</h1>')
    webview.start()

解决方法

好吧,最后,我不得不采用艰难的方式(虽然很容易),即套接字方式。我使用 flask-socketio 来实现此功能。下面是一个例子:

假设我有 2 separate windows、Window_1 和 Window_2。现在我在 Window_1 中有一个按钮,我将在这里单击一个按钮,然后在 Window_2 中会显示一个弹出窗口。

Window_1.html

<button id="click_me" type="button">Click Me</>
<script>
   // add jquery scripts (use a cdn or download from the source)
   let socket = io.connect('/');
   socket.emit('emit_button_click_signal',{});
</script>

Window_1.py

from flask_socketio import SocketIO

app = Flask(__name__)
socket_io = SocketIO(app,cors_allowed_origins='*')

@socket_io.on('emit_button_click_signal')
def emit_button_click_signal(data):
    emit('emit_button_click_signal_to_window_2',{},namespace='/',broadcast=True) # refer to flask-socketio basics for more

Window_2.html

<script>
    let socket = io.connect('/');
    socket.on('emit_button_click_signal_to_window_2',function (data) {
            // trigger some jquery to show a pop up in HTML..
        });
</script>

我们通过 window_2.html (JS is emitting)window_1.html (JS is receiving)Window_2.py (which acts as the messenger in OS level) 发送信号。而已。您可以使用它来构建 multi-panel based softwares,例如 photoshop、AutoCAD、Solidworks 等。