【PyScript】HTMLファイルでPythonを動かしてブラウザツールを作ってみた

# はじめに
PyScriptを使用するとブラウザ上でPythonコードを実行できるようになります。本記事はPyScriptを触ってみた備忘録記事になります。

# PyScriptとは？
ブラウザでPythonを実行するためのツールです。htmlファイル内の<py-script></py-script>タグの中にPythonのコードを記載する事ができます。


# インポート

`<head>`タグ内に下記を記載します。

```
<link rel="stylesheet" href="https://pyscript.net/releases/2024.10.1/core.css">
<script type="module" src="https://pyscript.net/releases/2024.10.1/core.js"></script>
```    

[ドキュメント](https://docs.pyscript.net/2024.10.1/beginning-pyscript/#:~:text=arrr%22%5D%0A%7D-,index.html,-Next%20we%20come) には　次の`index.html`のサンプルが記載されています。

```html:index.html (*ドキュメントより引用)
<!DOCTYPE html>
<html>
  <head>
      <meta charset="utf-8" />
      <meta name="viewport" content="width=device-width,initial-scale=1" />
      <title>🦜 Polyglot - Piratical PyScript</title>
      <link rel="stylesheet" href="https://pyscript.net/releases/2024.10.1/core.css">
      <script type="module" src="https://pyscript.net/releases/2024.10.1/core.js"></script>
  </head>
  <body>![p_samp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/7177e3f6-5b1e-d910-9938-cbef9e35b908.gif)


    <!-- TODO: Fill in our custom application code here... -->

  </body>
</html>
```


# 簡単なツールを作ってみる

PyScriptを使って文字列を生成するツールを作成してみます。
指定した文字数の文字列を生成させます。下記のスクリプトではテキストボックスに入力された文字数のひらがなをランダムで生成します。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>意味のないひらがな文字列生成ツール</title>
    <link rel="stylesheet" href="https://pyscript.net/releases/2024.10.1/core.css">
    <script type="module" src="https://pyscript.net/releases/2024.10.1/core.js"></script>
    <style>
        body { width: 1000px; margin: 0 auto; text-align: center; }
        input, button { margin: 10px 0; padding: 5px; }
        #result { font-size: 18px; margin-top: 20px; word-wrap: break-word; }
    </style>
</head>
<body>
    <h1>意味のないひらがな文字列生成ツール</h1>
    <input type="number" id="length" min="1" max="100" value="10" placeholder="文字列の長さ">
    <button id="generate">生成</button>
    <div id="result"></div>

    <py-script>
        from pyodide.ffi import create_proxy
        from js import document
        import random

        hiragana = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん"

        # ボタンがクリックされたときに呼び出される関数
        def generate_nonsens_text(event):
            # 文字数を取得
            length = int(document.querySelector("#length").value)
            # hiragana から文字数分ランダムに取得した値で文字列を生成
            result = ''.join(random.choice(hiragana) for _ in range(length))
            # 文字列を画面に表示
            document.querySelector("#result").innerText = result

        generate_proxy = create_proxy(generate_nonsens_text)
        document.querySelector("#generate").addEventListener("click", generate_proxy)
    </py-script>
</body>
</html>
```

ブラウザで動かしてみると、10文字分のランダム文字列を生成できることを確認できました。

![p_samp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/194eb888-297f-5b7e-e2a5-7955e9efba16.gif)


# 参考

- https://docs.pyscript.net/2024.10.1/beginning-pyscript/

- https://pyodide.org/en/stable/usage/type-conversions.html

- https://pyodide.org/en/stable/usage/api/python-api/ffi.html#pyodide.ffi.create_proxy