LoginSignup
1
0

PythonでTkinterじゃない「GUIアプリでも作ってみない?」1日目

Posted at

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つを合体させる方法...あなたにはわかりますか?
私は(適切な方法は)わかりませんでした。

まとめ

現状、それぞれの関数がメインスレッドでの実行を要求していながら、どちらもブロッキング関数なので、どちらかがメインスレッドを占有してしまい、もう片方が実行できないという状況になっています。
これを解決するための方法が...

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0