Day6 PythonでGUIアプリ作るなら? (原始的Edit)
続きものではないので,前回の話は別にみなくていいです.
原始的なGUIアプリ開発をしましょう
「フレームワークは甘えなんよ」(某お舟スクール校長風)
もっと原始的な感じでGUIアプリを開発していきます.
まずはWebサーバーを立てます.
ん? Webサーバー?
まずは今回考えるGUIアプリの構想を共有しましょう.
こういうイメージです.
サーバーはGUIのデザインをHTMLとして送って,ブラウザはそれを描画することでGUIになる.
ブラウザはコマンドをサーバーに送ることで,サーバーはそれを処理してアプリとなる.
…ほらほら,GUIアプリでしょ?
なぜコマンド式になるかというと,ブラウザでは一部の機能が利用できないからです.
ブラウザからはストレージの操作を勝手にできませんし,HTTPリクエストとかも制限があります.そのため,何でもできるサーバーを立ててあげるのです.
まずはWebサーバーを立てる
from aiohttp.web import Application, json_response, Request, run_app
class Cog:
__registed = []
def __init__(self, app: Application) -> None:
for command in dir(self):
if command.startswith("_") or command.endswith("__"):
continue
app.router.add_post( f"/api/{command}", getattr(self, command))
self.__registed.append(command)
def Command(func):
async def wrapper(cls: Cog, request: Request, *args, **kwargs):
req = {}
if request.json is not None:
req = request.json
try:
return json_response({"result": True, "value": await func(cls, **req)})
except Exception as e:
return json_response({"result": False, "error": str(e)})
return wrapper
class Commands(Cog):
@Command
async def test(self, req: Request):
db = nanka_db()
data = db.nanka_data()
return data
if __name__ == "__main__":
app = Application()
Commands(app)
run_app(app)
(ごめんなさい昔のコードを引っ張て来てかつデバッグも何もしてないので動くかは知りません)
イメージとしてはこんな感じです.
これに適当なHTMLを書いてstatic routeしたものをブラウザで開けばGUIアプリっぽくなりますよね?
もっとGUIアプリ味を…!
そこでPyWebViewというものを使います!
WebViewというものを表示できるライブラリなのですが,さっきWebサーバーを立てたので,そのWebサーバーのURLをWebViewで開けば…GUIアプリになりそうじゃないですか?
一応サンプルコードはDocsからして以下の通りです.
import webview
webview.create_window('Hello world', 'https://pywebview.flowrl.com/')
webview.start()
このPyWebViewとPythonサーバーを使うことでGUIアプリを作れるではありませんか!
…という記事が昔ありました(今更)
完全に忘れてましたがまったくもって過去の私とネタが被ってました.
のであとは過去の私に任せます.
それではあなたも
PythonでGUIアプリを量産するときはPyWebViewというものを使ってみてはいかがですか.
デザインをHTMLで書けるから意外といいかもよ?