IphoneのアプリでpythonでIhoneで動かせるアプリが作れる「pythonista3」というものがあります。有料ですが、ちょっとしたアプリなら自分で作って楽しめそうです。今回は、体重記録アプリを作ってみました。
作ったのはこんなアプリです
画面はシンプルに体重を表示するラベルにボタンが「+」「‐」「rec_X」の3つのシンプルなものです。

機能としては以下のような感じです。
- コード上であらかじめ基準日と基準体重と目標体重を設定しておく。
- 日々の体重はCSVファイルに保存していく。
- 起動すると直近で記録した体重が表示される。+ボタンで表示が0.1kgづつ増え、-ボタンで0.1kgづつ減少する。
- 測定した体重に合わせて「rec_X」ボタンを押すと、CSVファイルに日付・時間と体重が記録されるとともに、Xに投稿するような文章がクリップボードにコピーされる。
基準体重からの減少と目標体重との差がこんな感じの文章がクリップボードに貼り付きます。
今の体重は63.0kgです。ダイエットを始めた2024年4月5日から2.0kg減りました!目標まであと8.0kgです。
#ダイエット記録
直近測定からの増減なども入れてもよいのですが、とりあえずは、さっとシンプルに基準体重と目標体重の差を文章にするというのにしました。
完成版のコードです
全コードは以下の約130行です。今回は、ボタンやラベルの画面uiの要素もコード上で書いたので、そのままコピペすれば使えるコードになっています。
画面のボタンやラベルなどもコードで書くようしたら、項目数がその都度で変動するような画面作成可能です。
import ui
import csv
import datetime
import clipboard
#++++++ 定数設定、直近データの読み込み ++++
kijun_date = '2024年4月5日'
kijun_weight = 65.0
mokuhyo_weight = 55.0
datacsv = 'data.csv'
#datacsv読み込み a+は読み書き両用でファイルなければ作成
with open(datacsv, 'a+') as f:
pass
with open(datacsv, 'r') as f:
reader = csv.reader(f)
data = [x for x in reader]
#直前の体重を取得。初回は基準体重にする。
if len(data)>0:
last_weight = data[-1][1]
else:
last_weight= f'{kijun_weight:.1f}'
#++++++++++ 部品的な関数 +++++++++++
#ツイート文字列の作成
def twi_create(now_weight):
delt_weight = kijun_weight - now_weight
tag_diff = now_weight - mokuhyo_weight
twi = f'今の体重は{now_weight:.1f}kgです。ダイエットを始めた{kijun_date}から{delt_weight:.1f}kg減りました!目標まであと{tag_diff:.1f}kgです。\n#ダイエット記録'
return twi
#********** ボタンの挙動 *************
#プラスボタンとマイナスボタンの処理
def plus_minus(sender):
t = sender.name
diff=0
if t=='plus_btn':
diff=0.1
if t=='minus_btn':
diff=-0.1
#ラベル表示されている体重の値を取得して、増減させてラベルに表示させる
weight_label = sender.superview['weight_label']
temp_weight = float(weight_label.text)+diff
weight_label.text = f'{temp_weight:.1f}'
sender.superview['rec_x_btn'].background_color=('#adadad')
#記録ボタン
def rec_x(sender):
dt_now = datetime.datetime.now()
str_now = dt_now.strftime('%Y%m%d-%H%M')
#ラベル表示されている体重と日時をCSVファイルに保存する。
weight_label = sender.superview['weight_label']
now_weight = weight_label.text
temp_data = [str_now, now_weight]
with open(datacsv, 'a') as f:
writer = csv.writer(f)
writer.writerow(temp_data)
#ラベルの体重からツイート文章を生成する
twi_str = twi_create(float(now_weight))
# twi_strをクリップボードに出力
clipboard.set(twi_str)
sender.background_color=('red')
#************* ui *****************
v = ui.View()
v.background_color = 'blue'
v.width = 390
v.height = 900
label1 = ui.Label()
label1.frame=(30, 150, 150, 60)
label1.name = 'weight_label'
label1.text = last_weight
label1.background_color=('white')
label1.scales_font = True
label1.alignment= 1
label1.font=("Helvetica", 30)
v.add_subview(label1)
plusbtn = ui.Button()
plusbtn.action = plus_minus
plusbtn.frame=(200, 150, 60, 60)
plusbtn.name = 'plus_btn'
plusbtn.title = '+'
plusbtn.background_color=('#adadad')
plusbtn.tint_color = ('white')
plusbtn.scales_font = True
plusbtn.alignment= 1
plusbtn.font=("Helvetica", 30)
v.add_subview(plusbtn)
minusbtn = ui.Button()
minusbtn.action = plus_minus
minusbtn.frame=(280, 150, 60, 60)
minusbtn.name = 'minus_btn'
minusbtn.title = '-'
minusbtn.background_color=('#adadad')
minusbtn.tint_color = ('white')
minusbtn.scales_font = True
minusbtn.alignment= 1
minusbtn.font=("Helvetica", 30)
v.add_subview(minusbtn)
xbtn = ui.Button()
xbtn.action = rec_x
xbtn.frame=(100, 250, 150, 60)
xbtn.name = 'rec_x_btn'
xbtn.title = 'Rec & X'
xbtn.background_color=('#adadad')
xbtn.tint_color = ('white')
xbtn.scales_font = False
xbtn.font=("Helvetica", 30)
v.add_subview(xbtn)
v.present('sheet')コードのざっとした説明
プログラムの構成
Tkinterなどでも同じようなものだと思いますが大雑把には以下のような構成になっています。
- 使うモジュールをimport(1行目~)
- 基準体重・目標体重の変数や保存ファイル名の変数(6行目~)
- 体重の保存CSVファイルを開いて初期値(直近の体重)を格納(12行目~)
- 部品的な関数を定義。(今回は測定した体重からXに投稿できる文章を作る関数)(26行目~)
- ボタンを押したときの挙動の関数(36行目~)
- ui画面の作成の表示(73行目~)
ちょっとした説明
f文字列(f-strings)
ツイート文字列を作成するのに「f文字列(f-strings)」を使っています。(32行目)
変数の値を{}かっこを使って文字列に組み込めます。数値は:で表示形式を調整できます。{now_weight:.1f}の「.1f」で少数点1位まで表示を指定し「64.0」とか「64.2」とか表示させています。
ui要素はpyuiファイルではなくコードに書いて実装
ui要素は「Script with UI」のpyuiファイルを使わず、コードでuiモジュールを使って作成しています。
ui要素の作成(ラベル)
まず、画面の元のViewを「v = ui.View()」で作って大きさや背景色を設定しています。
次に80行目からラベルを「label1 = ui.Label()」で生成して、そのあとの数行でラベルの名前やサイズ、初期表示テキストなどを設定していきます。
最後に「v.add_subview(label1)」として作ったラベルをViewに追加することでView上に表示させられます。
ui要素の作成(ボタン)
90行目から「plusbtn = ui.Button()」としてボタンを作成して、ラベルと同様にViewに追加します。
ボタンの場合は、91行目の「plusbtn.action = plus_minus」という「ボタン要素.action」でボタンが押されたときに発動する関数を指定しておきます。
これで、ボタンが押されたときに38行目からの「def plus_minus(sender):」に記載したコードが実行されます。
ボタンが押された時の関数
38行目からの「def plus_minus(sender):」と52行目からの「def rec_x(sender):」がボタンが押された時に実行される関数です。
引数の「sender」は自動で押されたボタンのui要素が格納されます。
例えば、39行目の「t = sender.name」では押されたボタンの名前をtという変数に格納しています。
また、46行目の「weight_label = sender.superview[‘weight_label’]」では、押されたボタンの親のViewにある「”weight_label'”」という名前の要素(今回では体重を表示するラベル)を指定して、それをweight_labelという変数に格納しています。
iphoneのクリップボードにテキストを格納する
69行目の「clipboard.set(twi_str)」で、clipboardモジュールを使ってiphoneのクリップボードにテキストを格納させています。
「clipboard」をimportして使っていますが、おそらくpythonita3に標準で入っているもので、pythonita3特有のものだと思います。
作ったコードをショートカットを設定してホーム画面から実行する
コードを作っただけでは、毎回pythonita3を起動して、該当のコードを開いて実行する必要があります。それは面倒なので、Iphoneの標準機能でショートカットが作成できるので、設定しておくと便利です。
やり方は以下のホームページが参考になります。

pythonista3でいろいろできそうです
今回は、シンプルな体重記録アプリを作ってみました。
もっといろいろ作って遊べそうです。アプリストアのものだとちょっと機能が多すぎてもっとシンプルなものが欲しいというときに特に役立ちそうです。
ほかにも出来たらアップしていきたいと思います。


コメント