Closed19

Fletでカウントダウンタイマーを作る

mhmh

雑に確認したが、20秒で0.2秒ぐらいの誤差になるのは気になるか

test.py
import time

diff = 0
for _ in range(20):
    start = time.perf_counter()
    time.sleep(1.0)
    end = time.perf_counter()
    print(end - start)
    diff += (end - start) - 1.0
print(f"{diff=}")
$ python test.py 
1.0135058000014396
1.0103363999951398
1.0089951999980258
1.0015754000050947
1.0078976000077091
1.0112458999938099
1.0125435999943875
1.0147921000025235
1.0131346999987727
1.001626799989026
1.0138484999915818
1.0142044999956852
1.009830899987719
1.0145514000032563
1.0125041999999667
1.0011726999946404
1.015364299993962
1.009197800012771
1.0124055999913253
1.0148489000130212
diff=0.21358229996985756

https://docs.python.org/ja/3.10/library/time.html?highlight=time perf_counter#time.perf_counter

また、システムが他の処理をスケジュールするために、実行停止時間が要求した時間よりも多少長い時間になることもあります。
https://docs.python.org/ja/3.10/library/time.html?highlight=time perf_counter#time.sleep

公式ドキュメントにもこのように書かれてるので、前のステップとの時間差分で補正するなりしたほうが良さそう。

mhmh

時間設定できなかったり、画面サイズなどが適当だったりするが、残り時間をクリックするとタイマー開始・停止するカウントダウンタイマーができた

mhmh

なるべくウィンドウサイズを小さくしたいので、残り時間表示画面と残り時間設定画面を別画面にしたい。
そのため残り時間表示画面から設定画面に遷移する手段を設ける必要がある。

今のところ考えているのが、以下の通り。
とりあえず上から試してみたい。

mhmh
mhmh

「分に0、秒に150を入力する」みたいなケースもあるので、秒の最大値は設けないでおく。

mhmh

そろそろ実行可能ファイルにパッケージ化するため、ワークフローを作成した。
https://github.com/mh326/countdown-timer/blob/master/.github/workflows/build-flet-cross.yml

Repository variablesも設定した。
APP_NAME : countdown-timer

v* のタグをpushすると自動でパッケージ化を行い、Releaseにアップロードしてくれる。

$ git tag -a v0.0.1 -m 'first release'

$ git push origin v0.0.1
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 161 bytes | 161.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/mh326/countdown-timer.git
 * [new tag]         v0.0.1 -> v0.0.1

https://github.com/mh326/countdown-timer/actions/runs/8314179262

作成されたReleaseはDraft状態なので、手動で公開する。
https://github.com/mh326/countdown-timer/releases/tag/v0.0.1

参考
https://ksk-log.com/posts/2023/12/23-ghaction-flet-cross-build/

奮闘記
https://zenn.dev/mh326/scraps/ce86c7c467bf2e

mhmh

コマンドライン引数を ArgumentParser (argparse) で取ろうとしたが、 flet run ではコマンドライン引数を取ることができないっぽい

$ flet run -m 1 -s 30
usage: flet [-h] [--version] {create,run,pack,publish,build} ...
flet: error: unrecognized arguments: -s 30

$ python main.py -m 1 -s 30
Namespace(min='1', sec='30')
mhmh

flet buildでパッケージ化された実行可能ファイルではコマンドライン引数が無視されている

PS C:\Users\...\countdown-timer\build\windows> .\countdown_timer.exe -m 1 --sec 30
PS C:\Users\...\countdown-timer\build\windows> .\countdown_timer.exe --help
PS C:\Users\...\countdown-timer\build\windows>
mhmh

flet packでパッケージ化された実行ファイルではコマンドライン引数がちゃんと読み込まれている。

PS C:\Users\...\countdown-timer\dist> .\main.exe -m 1 --sec 30
PS C:\Users\...\countdown-timer\dist> .\main.exe --help
PS C:\Users\...\countdown-timer\dist>

が、 --help オプションを付けた場合、以下のエラーメッセージが出る。

Traceback (most recent call last):
  File "main.py", line 24, in <module>
  File "argparse.py", line 1833, in parse_args
  File "argparse.py", line 1866, in parse_known_args
  File "argparse.py", line 2079, in _parse_known_args
  File "argparse.py", line 2019, in consume_optional
  File "argparse.py", line 1943, in take_action
  File "argparse.py", line 1106, in __call__
  File "argparse.py", line 2567, in print_help
  File "argparse.py", line 2573, in _print_message
AttributeError: 'NoneType' object has no attribute 'write'

ここら辺も試したがうまくいかなかった。
動作に支障はないのでこのままでいいか。
https://stackoverflow.com/a/73036826
https://stackoverflow.com/a/77725944

このスクラップは5ヶ月前にクローズされました