Flet で GitHub Release のダウンロード数を取得するアプリを作ってみた
Posted on 2024年04月04日 (木) in 自作ツール

目次
はじめに
前から興味を持っていた Flet で初めてアプリを作ってみました。
とても使いやすかく気に入ったので、今回紹介していこうと思います。
Flet とは
Flet はクロスプラットフォームに対応したフレームワークである Flutter を元に作られた、Python の GUI ライブラリです。
近年できた GUI ライブラリであるため非常に見た目が優れており、また Web, Mobile, Desktop に対応したモダンなアプリを Python だけで作ることができます。
また標準 GUI ライブラリである tkinter と比べて以下の利点があります。
- ウィジェットが非常に豊富で、カスタマイズ性も高い 
- ウィジェットを構造的に設置できる(配置が分かりやすい) 
- PC ソフトも web アプリもスマホアプリもこれ一つで作れる 
- 公式ドキュメントがかなり充実している 
逆に欠点は、
- 解説記事が少ない 
- 外部ライブラリである 
- ファイルの D&D に対応していない 
- 無料版 ChatGPT だとコードを書いてくれない(2024/04/03 時点) 
程度であり、これらが問題ない状況なら tkinter よりもオススメです。
また tkinter と同じく商用利用にも使えるため、安心して開発・公開することもできます。
作ったもの
今回作ったと言っても雪櫻ブログ – GitHub Release でのダウンロード数を Python から取得する方法に GUI を付けただけです。
また今回実行ファイルとして公開する気はないので、コードの記載のみとなります。
コード
import flet as ft
import requests
def main(page: ft.Page):
    def on_click(e):
        ori_url=entry.value
        url = ori_url.replace("github.com", "api.github.com/repos").replace("tag", "tags")
        headers = {"Accept": "application/vnd.github.v3+json"}
        try:
            response = requests.get(url, headers=headers)
            if response.status_code == 200:
                data = response.json()
                data_list=[]
                for asset in data['assets']:
                    data_list.append([asset['name'], str(asset['download_count'])])
                table.rows.clear()
                for i in data_list:
                    table.rows.append(
                        ft.DataRow(
                            cells=[
                                ft.DataCell(ft.Text(i[0])),
                                ft.DataCell(ft.Text(i[1])),
                            ],
                        ),
                    )
                page.update()
            else:
                page.dialog = dlg
                dlg.open = True
                page.update()
        except:
            page.dialog = dlg
            dlg.open = True
            page.update()
    page.title = "GitHub Rlease内のファイルダウンロード数取得"
    page.vertical_alignment = ft.MainAxisAlignment.CENTER
    button=ft.OutlinedButton("ダウンロード数を取得",on_click=on_click)
    entry=ft.TextField(label="URLを入力してください")
    table=ft.DataTable(
            columns=[
                ft.DataColumn(ft.Text("ファイル名")),
                ft.DataColumn(ft.Text("ダウンロード数"), numeric=True),
            ]
    )
    dlg = ft.AlertDialog(
        title=ft.Text("エラーです。入力を確認してください。")
    )
    page.add(
        ft.Row(
            [
                entry,
                button
            ],
            alignment=ft.MainAxisAlignment.CENTER,
        ),
        table,
    )
ft.app(target=main)
ChatGPT は使えませんでしたが、日本語記事と公式ドキュメントだけで作ることができました。
tkinter とは思想的にかなり違いそうなので、自分のように tkinter から来た人は最初面食らうかもしれませんが、すぐ慣れると思います。
感想
このアプリを作る時に率直に思ったことは、
- 「入れ子構造少し見にくい」 
- 「ウィジェットのデザイン最高!!!」 
- 「Table の中身の記述が tkinter とは真逆だけど、これに関しては tkinter がおかしい」 
- 「コード量は少し増えるな」 
でした。
特にウィジェットに関しては文句のつけようがなく優秀で、ほっとリロードまで対応してたので感動しました。(tkinter が酷い分)
日本語サイトが少ないのは玉に瑕ですが、最近は徐々に増えていますし公式ドキュメントが非常に優秀であるため(tkinter も見習え)、思ったよりも困りませんでした。
Python の GUI ライブラリはいくつかあり、私も「PySimpleGUI」や「CustomTkinter」などを使ったことがあります。
しかしそれらと比べて 三周りぐらい垢抜けていますし、それらのライブラリはライセンスが厳しいことも多いため、割と自由な Flet はそういう意味でも使いやすいと思いました。
いくつかある欠点も「UI デザインと機能」という点で補って余るほどなので、今後 Python で色々作りたい方には Flet をおすすめしていこうと思います。