paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

PayPayの支払いデータを自分で集計したい4

年を跨いでしまいましたがタイトルのツールについて、PC環境ですがkivyで動くようになりました。
レイアウトとwindowサイズをいじってスマホ画面に近くしてます。

画面

トップページ

シンプルですがトップ画面です。

下画面のFile chooserでダウンロード済みの明細を選択して出力させると、

明細の出力とグラフ化

画面遷移して月次の明細と支払いTOP3のグラフが出ます。
一応詳細はマスクしておきます。

デザインはおいといて望む感じのものが出来ました。
合計額も上画面に出しておくか。

ここまでの道のり

グラフの出力に手間取って時間かかってしまいました。

kivyでグラフを出すサンプルの記事は沢山ありますが、私はグラフを別モジュールで作成するようにしたので描画どうすればいいのって感じで試行錯誤でした。
kivy側で作成するとかいろいろコード直しましたが、エラー内容を比較するとどちらで作っても同じで作成済みのデータをWidgetに渡すだけでよかった様です。

コードこの辺です。

main.py

class Main(Screen):

    def open(self, path, filename):
        with open(os.path.join(path, filename[0]), encoding='utf-8-sig') as f:
            csvfile = f.readlines()

        return csvfile

    def createdb(self, afile):
        con = sqlite3.connect(':memory:')
        cur = con.cursor()

        app.insertData(afile, cur)
        dates, contents, t = app.shapeingData(cur)

        res = ''
        for x in contents:
            res += f'{x[0]} {x[1]} {x[2]} {x[3]}\n'

        self.manager.get_screen('analize').ids.result.text = res

        p = app.createGraph(dates, cur)  # 別の自作モジュールでグラフ作成

        widget = FigureCanvasKivyAgg(p.gcf())

        self.manager.get_screen('analize').ids.plot.add_widget(widget) # 別画面のWidgetに渡す
        #ids.plot = p.show()
        con.close()

    pass

my.py

<Main>:
    name: 'main'
    id: main

    BoxLayout:
        (略)
        Button:
            text: '明細選択'
            on_release:
                main.createdb(main.open(fc.path, fc.selection))
                root.manager.current = 'analize' # これで別画面に遷移
            size_hint_y: 0.2
        FileChooserListView:
            id: fc
            path: '../ドキュメント/paypay/'
            filters: ['*.csv']


<Analized>:
    name: 'analize'

渡すのに失敗していたのはkivy gardenのバグの様で出力出来てなかっただけでした。
アップデートして無事に動きました。発見した人に感謝です。

そのページ(確かstack overflow)を探しているのですが見つからないので発見したら載せます。

バグ

出力したら戻って別の月の出力も続けて出来るようにしようと思ってますが2回目を選択するとグラフが混ざってしかも2つ表示されます。

グラフの変数をクリアしてないからだと思いますが今DBから取得してそのままグラフを作ってるので関数を分けないと難しそうだ。

これは後回しにして次はandroid用にビルドします。(すでに失敗してるが)


一応リポジトリはこちら

github.com