見出し画像

PythonのGUIモジュール Kivyメモ

自分のiphone用にアプリ製作していてハマったことなどのメモです。

まだアプリは制作中で、
あくまで自分が見返す用のめちゃくちゃなノートなので
参考にはならないと思います。

まだ理解できていないことが理解できていないまま書いてあります。

いろいろ

iOSやアンドロイド、macなどいろいろなプラットフォームで使えるものが書けるらしい。iosに入れられる物を作るのが目標。

pyhtonの.pyファイルの他に.kvファイルという、kivy専用言語の別ファイルを使うことがみんな多いらしい。同じディレクトリに入れとく。
これは使わなくても良いが、使うと.pyファイルがhtmlファイル、.kvがcssみたいな関係でデザインをしやすいらしい。でも.kvはデザインだけじゃないのでちょっと違うらしい。

ウィンドウサイズ

pyファイルに書く。

from kivy.config import Config

Config.set('graphics', 'width', '375')
Config.set('graphics', 'height', '667')

デザインの構造

スライドして画面を切り替えたいのでScreenManagementというのに入れる。

<画面の名前>

そのなかにBoxLayout入れてさらにボタンやらラベルやらを入れる。

ボタンを押した時のコマンド

pyファイル

class ScreenManagement(ScreenManager):
   pass

kv

ScreenManagement:
   id: screen_manager
   transition: SlideTransition()
   #transition: FadeTransition()
   TradeScreen:
       id: trade_screen
       name: 'trade'
       manager: 'screen_manager'

   SettingScreen:
       id: setting_screen
       name: 'setting'
       manager: 'screen_manager'
   MenuScreen:
       id: menu_screen
       name: 'menu'
       manager: 'screen_manager'
#############################################
<MenuScreen>:
   BoxLayout:
       orientation: 'vertical'
       Label:
           text: 'Zawagiri ver.01'
           #font_size: 20
       Button:
           text: 'トレード画面へ'
           #font_size: 30
           on_release:
               app.root.transition = SlideTransition(direction="left")
               app.root.current = 'trade'
       Button:
           text: '設定'
           #font_size: 30
           on_release:
               app.root.transition = SlideTransition(direction="up")
               app.root.current = 'setting'

背景色とかテキストカラーとかのとこがまだわからない。書き方がいろいろあるのか?。

back_ground_cl = "#ffffff"#white
header_L_cl= "#00a7db"#blue
header_R_cl= "#6cbb5a"#green
###########################################################
Label:
    text: "xxx"
    size_hint_y: 0.7
    id: pos_average
    color: root.text_color
    canvas.before:
        Color:
            rgba: rgba(root.account_cl)
        Rectangle:
            pos: self.pos
            size: self.size

変数をpyからkvに渡すのがめんどい

from kivy.properties import StringProperty, ListProperty
###########################################################
text       = StringProperty()
menu_button_cl  = ListProperty([0.5,0.5,0.5,1])#green
###########################################################
canvas.before:
                   Color:
                       rgba: rgba(root.header_L_cl)
                   Rectangle:
                       pos: self.pos
                       size: self.size


画面の切り替えでスライド方向をいじれるやつ 使えるSlideTransition

これを.pyファイルに入れとく
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition

class ScreenManagement(ScreenManager):
   pass
###########################################################
これを.kvファイルに入れとく。#も書くのが慣れなくて、わからなかった。
#:import SlideTransition kivy.uix.screenmanager.SlideTransition
ScreenManagement:
   id: screen_manager
   transition: SlideTransition()
   TradeScreen:
       id: trade_screen
       name: 'trade'
       manager: 'screen_manager'

   SettingScreen:
       id: setting_screen
       name: 'setting'
       manager: 'screen_manager'
   MenuScreen:
       id: menu_screen
       name: 'menu'
       manager: 'screen_manager'
###########################################################
Button:
           text: '設定'
           #font_size: 30
           on_release:
               app.root.transition = SlideTransition(direction="up")
#directionはup,down,right,leftができる。
               app.root.current = 'setting'


チェックボックス、というかラジオボックス 使える

常にどれかにチェックするようにしたい。が、やり方がわからない

       BoxLayout:#チェックボックス
           orientation: 'horizontal'
           CheckBox:
               group: "gp01"#グループをそろえるとその内一つだけオンになる。
               id: check_AAA
               on_active:#チェックした時発動
                   root.test_switch()
           Label:
               #size: self.texture_size
               size_hint_x: 0.7
               text: 'AAA'
               halign: 'left'
               color: root.black
     
       #------------------------------------------
       BoxLayout:
           orientation: 'horizontal'
           CheckBox:
               group: "gp01"#グループをそろえるとその内一つだけオンになる。
               id: check_BBB
               active: 1 #これ入れとくとデフォルトでオンになる
           Label:
               #size: self.texture_size
               text: 'BBB'

          

BoxLayoutの背景色

canvas.before:を使うといけた。ルートウィジェットの後ろにそのサイズの長方形を描く。それに色をつけるということらしい。
rgbaはRGBに透明度(アルファチャンネル)を追加したもの。全ての色表現が可能。

BoxLayout:
       orientation: 'vertical'
       size: root.size
       padding:[0,0,0,0]
       canvas.before:#この辺がひつようらしい。
           Color:
               rgba: rgba( "#ffffff")
           Rectangle:
               pos: self.pos
               size: self.size
       Label:#コメント用
           size_hint_y: 0.05
           text: '設定'
           color: root.text_color
           canvas.before:
               Color:
                   rgba: rgba( "#ffffff")
               Rectangle:
                   pos: self.pos
                   size: self.size

パスワードを隠して入力 使える

TextInput:
    password:True
    text: 'ここにパス入れる'

パスワードとかAPIとかを保存 使えてる

参考

py

from kivy.storage.jsonstore import JsonStore
from os.path import join

class SettingScreen(Screen):
   data_dir = App().user_data_dir#よくわからない
   store    = JsonStore(join(data_dir, 'storage.json'))
   #storeっていうファイルができる?storage.json?

  
   ###ここから 必要みたい、なぜかはわからない。
   try:
       store.get('all_api')['api_real']
   except KeyError:
       api_real = ""
   else:
       api_real = store.get('all_api')['api_real']
  ###ここまで

   def get_api(self):
       try:
           store.get('all_api')['api_real']
           #storeのall_apiのapi_realを取り出す。
       except KeyError:
           api_real = ""
       else:
           api_real = store.get('all_api')['api_real']
           #************************************************


   def on_save_api(self):
       api_real = self.ids.api_real.text 
                 #api_realはkvのid.idsはモジュールのやつだから必要。
       SettingScreen.store.put('all_api', api_real=api_real)

kv

       Label:
               text: 'リアル口座のAPI'
           TextInput:
               password:True #書き込んだ時にパスワードみたいに隠すやつ
               text: root.api_real
               id: api_real #後から取り出す時にこのidを指定する

           Button:#保存ボタン
               text: '保存'
               on_release:#クリックして離すと発動
                   root.on_save_api()#保存される。pyファイルにdefで内容書いてある。

保存したパスワードを暗号化したい。

コーヒー飲みます。ありがとうございます。