いろいろと試していると、もっとこうしたい、とアイデアが浮かびます。その一つとしてメモを作成した日付を記録したいと思いました。日付はメモ修正の度に更新されますから Labelで表示しようと思います。日付を自動取得してメモ表示画面に表示させましょう。
memo.kv <MemoView>:の追加・修正
on_memo_content: app.set_memo_content()の引数にself.memo_dateを追加します。
on_memo_title: app.set_memo_date(self. memo_index)を追加します。
on_memo_content: app.set_memo_date(self. memo_index)を追加します。
第2の TextInputの上にdate表示用の Labelを追加するとともに第1の BoxLayoutの背景色を canvasで決めておきます。
なお配色は適当です。
< Screen> : canvas: Color: rgb: .2, .2, .2 Rectangle: size: self.size < MemoView> : on_memo_content: app.set_memo_content(self.memo_index, self.memo_date, self.memo_content)on_memo_content: app.set_memo_date(self. memo_index) on_memo_title: app.set_memo_title(self.memo_index, self.memo_title)on_memo_title: app.set_memo_date(self. memo_index) BoxLayout: orientation: 'vertical' canvas: Color: rgb: .2,.2,.2 Rectangle: pos: self.pos size: self.size BoxLayout: orientation: 'horizontal' size_hint_y: None height: '48dp' padding: '2dp' canvas: Color: rgb: .2, .2, .2 Rectangle: pos: self.pos size: self.size Button: text: 'リスト' size_hint_x: None width: self.height on_release: app.go_memos() TextInput: id: text_box text: root.memo_title font_size: '16sp' multiline: False hint_text: 'タイトル' on_text: root.memo_title = self.text Button: text: '消去' size_hint_x: None width: self.height on_release: app.del_memo(root.memo_index) Label: id: today text: root.memo_date size_hint_x: None size_hint_y: None height: '30dp' TextInput: id: text_box_2 font_size: '16sp' multiline: True hint_text: 'メモ内容' text: root.memo_content on_text: root.memo_content = self.text < MemoListItem> : height: '48sp' size_hint_y: None canvas: Color: rgb: .3, .3, .3 Rectangle: pos: self.pos size: self.width, 1 BoxLayout: padding: '5dp' Label: text: root.memo_title Button: text: '内容' size_hint_x: None width: self.height on_release: app.edit_memo(root.memo_index) < AllMemoView> : BoxLayout: orientation: 'vertical' BoxLayout: orientation: 'horizontal' size_hint_y: None height: '48dp' padding: '5dp' canvas: Color: rgb: .3, .3, .3 # list表示画面上段の背景色 文字色は白 Rectangle: pos: self.pos size: self.size Image: source: 'data/icon.png' mipmap: True size_hint_x: None width: self.height Label: text: '全メモリスト' font_size: '16sp' Button: text: '追加' size_hint_x: None width: self.height on_release: app.add_memo() RecycleView: data: root.dataAllMemos viewclass: 'MemoListItem' RecycleBoxLayout: default_size: None, dp(56) default_size_hint: 1, None size_hint_y: None height: self.minimum_height orientation: 'vertical' spacing: dp(2)
main.pyの追加・修正
import datetimeを追加
MemoViewクラスにmemo_date = StringProperty()を追加します。
AllMemoViewクラスの get_data()メソッドに 'memo_date': item['date'],と追加します。
MemoAppクラスのadd_memo()メソッドとedit_memo()メソッドを同様に修正します。
MemoAppクラスのset_memo_content()メソッドの引数にmemo_dateを追加します。
MemoAppクラスにset_memo_date()メソッドと get_date()メソッドを追加します。
set_memo_date()メソッドでは、get_date()メソッドで得られた日付データをそのまま使うと JSONDecodeErrorと怒られるので、 str型に変換しています。
import json from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition from kivy.properties import ListProperty, AliasProperty, StringProperty, NumericProperty from kivy.uix.boxlayout import BoxLayoutimport datetime import urllib.request from kivy.core.text import LabelBase, DEFAULT_FONT from kivy.resources import resource_add_path resource_add_path("font") LabelBase.register(DEFAULT_FONT, "ipaexg.ttf") class MemoView(Screen): memo_index = NumericProperty() memo_title = StringProperty()memo_date = StringProperty() memo_content = StringProperty() class MemoListItem(BoxLayout): memo_content = StringProperty() memo_title = StringProperty() memo_index = NumericProperty() class AllMemoView(Screen): data = ListProperty() def get_data(self): return [{ 'memo_index': index,'memo_date': item['date'], 'memo_content': item['content'], 'memo_title': item['title']} for index, item in enumerate(self.data)] dataAllMemos = AliasProperty(get_data, bind=['data']) class MemoApp(App): FILENAME="data/memos.json" def build(self): self.memos = AllMemoView(name='memos') self.load_memos() self.transition = SlideTransition(duration=.35) root = ScreenManager(transition=self.transition) root.add_widget(self.memos) return root def load_memos(self): fd = open(self.FILENAME, mode='r') data = json.load(fd) fd.close() self.memos.data = data def save_memos(self): with open(self.FILENAME, 'w') as fd: json.dump(self.memos.data, fd) def add_memo(self):self.memos.data.append({'title': '', 'date': '', 'content': ''}) memo_index = len(self.memos.data) - 1 self.edit_memo(memo_index) def edit_memo(self, memo_index): memo = self.memos.data[memo_index] name = 'memo{}'.format(memo_index) if self.root.has_screen(name): self.root.remove_widget(self.root.get_screen(name)) view = MemoView( name=name, memo_index=memo_index, memo_title=memo.get('title'),memo_date=memo.get('date'), memo_content=memo.get('content')) self.root.add_widget(view) self.transition.direction = 'left' self.root.current = view.name def go_memos(self): self.transition.direction = 'right' self.root.current = 'memos' def del_memo(self, memo_index): del self.memos.data[memo_index] self.save_memos() self.refresh_memos() self.go_memos() def set_memo_title(self, memo_index, memo_title): self.memos.data[memo_index]['title'] = memo_title self.save_memos() self.refresh_memos()def set_memo_date(self, memo_index): memo_date = str(self.get_date()) # str型に変換しないとJSONDecodeErrorself.memos.data[memo_index]['date'] = memo_date self.save_memos() self.refresh_memos() def set_memo_content(self, memo_index, memo_date, memo_content): self.memos.data[memo_index]['content'] = memo_content data = self.memos.data self.memos.data = [] self.memos.data = data self.save_memos() self.refresh_memos() def refresh_memos(self): data = self.memos.data self.memos.data = [] self.memos.data = datadef get_date(self): return(datetime.date.today()) if __name__ == '__main__': MemoApp().run()
dataフォルダの memos.jsonファイルに []だけを記述して main.pyを起動しましょう。先ず左端の画像が表示されます。追加ボタンを押すとメモ入力画面に遷移します。日付は空欄ですがメモを入力してリストボタンを押すと、メモ表示画面に遷移して記入したメモのタイトルが表示されています。その内容ボタンを押すとメモ入力画面に遷移し、今度はメモを入力した日付が表示されています。メモ内容を修正すると、日付も修正した日に自動更新され、削除ボタンを押すとそのメモのタイトル、日付、メモ内容のすべてが削除されます。
Ubuntuの環境下、buildozerを使ってこのプログラムからandroidのapkファイルを作成し、スマホにインストールしてみました。アルファベット圏の言語なら問題なく使えますが、日本語でメモを作成しようとしてもスマホのIMEにひらがなが表示されず入力できません。解決法がわからないので、そのままにしています。どなたかお助け下さればありがたいです。
日付スタンプの背景色などお気に召さなければ、memo.kvを修正してお好きな配色に変更してくださいね。TextInputの背景に画像を表示させることもできますが、このシリーズはこれで終了とさせていただきます。Gの拙いコードですが、Python、Kivyを学ぶ方に少しでも参考になれば嬉しいです。