見出し画像

[初心者向け]Pythonista3のuiでデートピッカーを扱う方法

こんにちは。

普段プログラミングを趣味として自分なりに楽しんでやっています。
その中で学んだ事などを備忘録として残し、僕の思いも少し付け足してnoteにまとめています。

今回はPythonista3のuiでデートピッカー(DatePicker)を扱う方法を書いています。

デートピッカーとは

デートピッカーとは、その名の通りdate(日付)をpick(選択)するものです。

例えば目覚ましの時間を設定する時や、タイマーの時間を設定する時など、他にも誕生日の入力とかもありますね!

デートピッカーを使うことでユーザーがスロットを回すだけで簡単に日付などを選択をする事が出来ますし、入力ミスを防ぐ事も出来るのでオススメです。

Pythonista3のuiで使えるデートピッカーは、モードが4種類あります。
Date --- 月 日 年


Time --- 時 分


Date and Time --- 日 時 分


CountDown --- 時 分(カウントダウンの時間)

Countdown以外の3つは、

v['datepicker1'].date

とすると、現在デートピッカーが選択されている日付をdatetime.datetimeオブジェクトとして取得する事ができます。

アラームとか作る場合はデートピッカーで選択した値から現在時刻を引き算したりします。

で、今回は何を作ろうかと思ったんですが、アラームとかだとかなりごちゃごちゃしそうなので、カウントダウンタイマーを作ってみようと思います!

ただ、カウントダウンタイマーでもややこしいので、ゆっくり読み進めていただければと思います。

『Viewに部品を配置する』の巻

まずはpyファイルとpyuiファイルを作成します。
ファイル名はなんでもいいです!
が、今回はカウントダウンタイマーという事で『cntdwn_tmr』にしましょう!

cntdwn_tmr.pycntdwn_tmr.pyuiを作成しました。

まずはuiエディタの方から作っていきます!
[cntdwn_tmr.pyui]


カウントダウンの時間を表示する為のラベル。


カウントダウンの時間を設定する為のデートピッカー。
プロパティのModeの部分をCountdownに変更しておきましょう。


カウントダウンタイマーを開始させる為のボタン。
プロパティのActionの部分を『count_down』にしておいてください!後でこの名前の関数を定義します。

これでpyuiファイルは完成です!
次はプログラムを作っていきましょう!

『プログラムを作成する』の巻

[cntdown_tmr.py]ファイルを開いてください!
始めは以下のコードが書かれていると思います。

import ui

#①

v = ui.load_view()
v.present('sheet')

#①
この場所に関数を書いていきます。

ちょっとややこしいので一旦全体コードを見てから、少しずつ解説していきます。

import ui
import console
import threading
from datetime import timedelta


def timer():
	global set_time
	if set_time >= 0:
		label_format = timedelta(seconds=set_time)
		thread = threading.Timer(1, ti)
		thread.start()
		set_time -= 1
		v['label1'].text = str(label_format)
		if set_time < 0:
			v['button1'].enabled = True
			console.alert('hello')


def count_down(sender):
	global set_time
	set_time = v['datepicker1'].countdown_duration
	sender.enabled = False
	timer()


v = ui.load_view()
v.present('sheet')

まずは今回のプログラムに必要なモジュールをインポートしています。

import ui
import console
import threading
from datetime import timedelta

次にボタンを押された時の関数を見ていきます。

#①
def count_down(sender):
#②
	global set_time
	set_time = v['datepicker1'].countdown_duration
#③
	sender.enabled = False
#④
	timer()

#①
pyuiのボタンのActionに設定したcount_downという名前の関数を定義して、引数をsenderとしています。
このsenderは『送信者』という意味で、部品自身の事です。この場合だとsenderはpyuiで配置したボタン自身になります。

#②
変数set_timeをグローバル宣言しています。
変数set_timeにデートピッカーのcountdown_durationの値を格納。
(この値はデートピッカーで選択した値を秒単位で持っているので、選択されているのが1時間だった場合3600(秒)という数値が格納される)

#③
sender.enabled = Falseでボタンのタッチイベントを無効化しています。
(タイマーを重複して発動出来ないようにする為)

#④
このプログラムで他にtimerという関数を定義しているのでそいつを実行します。(この後説明します)

以上のcount_down関数が、ボタンを押した時に発動される処理になります。
次にcount_down関数の中で呼び出されているtimer関数の中身を見ていきます!

#①
def timer():
#②
	global set_time
#③
	if set_time >= 0:
#④
		label_format = timedelta(seconds=set_time)
#⑤
		thread = threading.Timer(1, timer)
		thread.start()
#⑥
		set_time -= 1
#⑦
		v['label1'].text = str(label_format)
#⑧
		if set_time < 0:
			v['button1'].enabled = True
			console.alert('hello')

#①
timerという名前の関数を定義しています。
これはボタンなどのイベントで呼び出される関数ではないので引数にsenderを入れなくて大丈夫です。

#②
変数set_timeをグローバル宣言しています。

#③
もしset_time(デートピッカーから取得した値)が0と等しいかそれ以上なら以下を実行。

#④
timedelta(second=set_time)でset_timeの値(秒)を時 : 分 : 秒の形に変換して変数label_formatに格納しています。
これはラベルに残り時間を表示する為の前処理です。

#⑤
thread = threading.Timer(1, timer)とthread.start()でタイマーの役割をさせる事ができます。
Timer(秒数 , 関数)でクラスをインスタンス化してからstart()メソッドを使う事で引数に入れた関数をn秒毎に再起的に実行させる事ができる。

※timeモジュールのsleep()だとラベルの表示がうまくいかないのでthreadingモジュールを利用しています。

#⑥
set_timeを1減らす。

#⑦
#④で作ったlabel_formatをラベルのテキストに設定しています。(これでラベルに残り時間を表示しています)

#⑧
もしset_timeが0より小さくなったら無効化していたボタンを有効化して、helloというアラートを表示する。

これでプログラムが完成しました!
右上の▷ボタンを押して実行してみましょう!

とりあえず試しに設定を1minでボタンを押してみてください!

カウントダウンが始まって秒数が減っていってますね。ボタンもちゃんと無効化されているのでカウントダウンが重複して発動される心配もありません。

0秒になったと同時にhelloという文字列のアラートが表示されたと思います。
Cancelを押してボタンを見ると有効化されていると思うので、またカウントダウンをスタートさせる事が出来ます。

まとめ的なやつ

今回はPythonista3のuiでデートピッカーを扱う方法を解説しました!

説明がややこしかったと思いますが、こんな感じでデートピッカーを使うと入力の手間やミスが無くなるので是非あなたのアプリで使ってみてください!

あまりよく分からなかった人は何度かこの記事を見ていただいて理解してもらえたらなと思います!

最後まで読んでいただきありがとうございました!
では、またお会いしましょう!

この記事が気に入ったらサポートをしてみませんか?