みんなのPython勉強会 #65 LT
2021/01/13 nikkie
Eel というパッケージを紹介
Python, HTML, CSS, JavaScriptから GUIアプリ が作れる
Pythonの関数をJavaScriptから呼び出せる
@eel.expose
def say_hello():
return f"Hello World {random.choice(NUMBERS)}"
<script type="text/javascript">
// Pythonのsay_hello関数をJavaScriptから呼び出せる!
eel.say_hello();
</script>
Eelを使った時に、HTMLからclassを読み出すことも可能ですか?
このLTで回答していきます
HTMLの要素のclassを扱いたい?
PythonのクラスをJavaScriptで扱いたい?
2への回答を中心に準備してきました
アンジャッシュのコントみたく、質問と噛み合わなかったらすみません🙏
👉 JavaScriptでやる のをオススメします(要素のclassを変更できる)
let styledElements = document.getElementsByClassName("styled");
for (var i=0, len=styledElements.length|0; i<len; i=i+1|0) {
// red-styledクラスからblue-styledクラスに変える
styledElements[i].classList.remove("red-styled");
styledElements[i].classList.add("blue-styled");
}
👉 JavaScript でできます
👉 Pythonのクラスは扱えない(と思われる)
👉 クラスの スタティックメソッド なら呼び出せた
@eel.expose
は「デコレータ」Python用語集 によると
別の関数を返す関数で、通常、 @wrapper 構文で関数変換として適用されます。
@eel.expose
def say_hello():
return f"Hello World {random.choice(NUMBERS)}"
@eel.expose
の動き@eel.expose
が付いたPythonの関数の名前を eel.jsに書き込む (動的!)
eel.jsが実行された後、JavaScriptのコードでは、eel.Pythonの関数名
と呼び出せる(ように見える)
console.log(eel);
で確認できます
@eel.expose
class Helloest:
@staticmethod
def say():
return "Hello World from Helloest class"
>>> Helloest.say()
'Hello World from Helloest class'
eel.Helloest
eel.Helloest.say();
// raises `Uncaught TypeError: eel.Helloest.say is not a function`
Pythonのクラスのメソッドは、JavaScriptから呼び出せないようです
インスタンスメソッド
クラスメソッド
スタティックメソッド
class Helloer:
def __init__(self, name):
self.name = name
# JavaScriptでeel.と呼び出すときの名前を指定
@eel.expose("Helloer_say_instance_method")
def say_instance(self):
return f"Hello World from instance method / {self.name}"
>>> h = Helloer("Alice")
>>> h.say_instance()
'Hello World from instance method / Alice'
class Helloer:
class_var = "BLOND"
@classmethod
@eel.expose("Helloer_say_class_method")
def say_class(cls):
return f"Hello World from class method / {cls.class_var}"
>>> Helloer.say_class()
'Hello World from class method / BLOND'
class Helloer:
@staticmethod
@eel.expose("Helloer_say_static_method")
def say_static():
return "Hello World from static method"
>>> Helloer.say_static()
'Hello World from static method'
スタティックメソッド は呼び出せた🎉
eel.Helloer_say_static_method();
インスタンスメソッド・クラスメソッドは呼び出せない🙅♀️
self
や cls
引数に該当するオブジェクトがJavaScriptから渡せない模様
self
や cls
をメソッド内で使っていなければダミーの引数を使って呼び出せる(それはスタティックメソッドでは?)
スタティックメソッドは呼び出せた
思うに、クラスの呼び出しはPython・JavaScriptそれぞれの中で完結。互いに呼び出すときは 言語標準のデータ構造 で
HTMLのclassについての質問でしたら、JavaScriptでできます
質問の意図が汲めていなかったら @ftnext までどうぞ
Special thanks sphinx-revealjs by @attakeiさん
Python 3.8.6, Eel==0.14.0