Tkinterとは
みなさん、Pythonはめちゃくちゃ触ると思うんですよえぇまぁこんな記事を見てるぐらいだろうし。
で、PythonでGUIアプリを作るときにはTkinterを使うと思うんですよね。
TkinterはPythonの標準ライブラリで、Pythonをインストールしたらすぐに使えるGUIライブラリです。
しかし、TkinterはGUIアプリケーションとしてはやっぱり...なんか...うーんって感じです。いやまぁGUIアプリケーション!!って感じでいいんですけど。モダンじゃない気がする多分。
そこで今回はTkinterを使わないGUIアプリケーションの作り方を紹介します。
今回使うもの
皆さんElectronってご存じですか?
ElectronはJavaScriptでデスクトップアプリケーションを作るためのフレームワークです。
フロントエンドにはHTML、JS、CSSを使い、バックエンドにはnode.jsを使って、フロントエンドとバックエンドの間をIPCで通信することでデスクトップアプリケーションを作ることができます。
昔はこれを使ってGUIアプリケーションを作っていたのですが、いかんせんバックエンドのJavaScriptに慣れなくて断念しました。
じゃあ...それをPythonで再現してみればいいんじゃね...!?
というわけで開発したのが、勝手にPyctronと名付けて可愛がっているものです。
今回はそれの動作原理的なものから紹介していきます。
実際に作ってみよう
Sanic
まずはバックエンドのサーバーを作ります。
今回はSanicを使います。
Sanicは、Pythonで簡単にWebサーバーを作ることができるものです。
import sanic
from sanic import response, Request
app = sanic.Sanic(__name__)
@app.route("/")
async def index(request: Request):
return await response.file("src/index.html")
@app.post("/greet")
async def greet(request: Request):
return response.text(f"Hello {request.json['name']}!")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
こんな感じに書くだけで、2つのエンドポイントを持ったWebサーバーが作れてしまいました。
これを実行すると、http://localhost:8000
にアクセスするとsrc/index.html
の中身が表示され、http://localhost:8000/greet
にPOSTリクエストを送るとHello {name}!
と表示されます。
WebView
みなさん、WebViewってご存じですか?
WebViewは、ネイティブアプリケーションの中にWebページを表示するためのものです。
今回は、pywebview
というものを使用してWebViewを起動していきたいと思います。
import webview
window = webview.create_window("Google WebView", url="https://google.com")
if __name__ == "__main__":
webview.start(http_server=True, debug=True)
これだけで、Googleのページを表示するGUIアプリケーションが出来上がってしまいます。
連携
これら2つのコードを合体させていきましょう。
さて、この2つを合体させる方法...あなたにはわかりますか?
私は(適切な方法は)わかりませんでした。
まとめ
現状、それぞれの関数がメインスレッドでの実行を要求していながら、どちらもブロッキング関数なので、どちらかがメインスレッドを占有してしまい、もう片方が実行できないという状況になっています。
これを解決するための方法が...