pywebviewのjs_apiにwindowオブジェクトを注入するクラスを使いたい
起こったこと
pywebviewを使ったアプリを開発中である。
jsのapiを通してpython側でファイルを呼び出す「open_file_dialog」メソッドを使いたいのだが、このメソッドを呼ぶにはjs_apiにwindowオブジェクトを注入しなければならない気がした。
こうした
# main.py import webview from Api import Api window = webview.create_window( 'title', 'path_to_html', ) # windowオブジェクトをApiに注入 window._js_api = Api(window) webview.start() # Api.py from webview import OPEN_DIALOG class Api: def __init__(self, window): self.window = window def load_file_data(self): file_types = ('json (*.json)', 'All files (*.*)') paths = window.create_file_dialog( OPEN_DIALOG, allow_multiple=False, file_types=file_types) file_data = None with open(paths[0], 'r', encoding='utf-8') as f: file_data = f.read() # 以後、file_dataを使ったあれこれ
ただ、これはアンダースコアで開始するメンバー変数に対して直接記入している。これが本当に良いことなのかはちょっとわからない。若干ハック的な使い方なのかもしれない。
_single_leading_underscore: "内部でだけ使う" ことを示します。 たとえば from M import * は、アンダースコアで始まる名前のオブジェクトをimportしません。
ちなみにjsではこんな感じ
const button = document.querySelector(".button"); button.addEventListener("click", async () => { // pywebviewというグローバルが追加されている。promiseなのでawaitを使うなどをする await pywebview.api.load_file_data(); });