kivy データ受け渡し


今日から自分の備忘録を兼ねて更新。
kivy の class間のデータの受け渡しがうまくいかなくて調べまくったらエンコードが問題だった件
↓これが実際に出たエラー文
'str' object has no attribute 'text'

サンプルコードを書いて事例を紹介しながら記事を書きます。

環境

  • OS: windows10
  • python:3.7.2

kivy データ受け渡し

ボタンを押すと画面が遷移してTextInputに記入した値がLabelに表示されるサンプルコード

main.py
class FirstScreen(Screen):
    input_text_id = ObjectProperty(None)

class SecondScreen(Widget):
    label_text_id = ObjectProperty(None)

実際にkivyファイル側で設定

main.kv
<FirstScreen>
    name: "first"
    input_text_id: input_text_id #id
    TextInput:
        id: input_text_id
        text: u"text here" #このuでエンコード。これがないため自分はエラーになった。
    Button:
        text:u"pass"
        on_press: root.manager.get_screen("second").label_text_id.text = root.input_text_id.text 

<SecondScreen>
    name: "second"
    label_text_id = label_text_id
    Label:
        text: u"" 

サンプルコードの全文は下に載せてます。

ますはpythonファイルから

main.py
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import NumericProperty, ReferenceListProperty,\
    ObjectProperty

from kivy.lang import Builder#kvファイルを読み込むために必要

import os
from kivy import Config

os.environ ['KIVY_GL_BACKEND'] = 'angle_sdl2' #これらがないとうまく起動しませんでした。
Config.set('graphics', 'multisamples', '0')#参考記事がどこだったか忘れてしまった。
Config.set('modules','inspector','')

#Screenを管理するScreenManagerを準備する。
class WinManager(ScreenManager):
    pass
#Screen classで移動する画面を準備する。
class FirstScreen(Screen):
    input_text_id = ObjectProperty(None) #kv側でidとして使用

class SecondScreen(Screen):
    label_text_id = ObjectProperty(None)#kv側でidとして使用

#kvファイルの読み込み
kv = Builder.load_file("main.kv")

class MainApp(App):
    def build(self):
        return kv

if __name__ == '__main__':
    MainApp().run()

次にkvファイルですね。

main.kv
#: import FadeTransition kivy.uix.screenmanager.FadeTransition

WinManager:
    transition:FadeTransition()
    FirstScreen:
    SecondScreen:

<FirstScreen>
    name: "first"
    input_text_id: input_text_id
    BoxLayout:
        size: root.size
        pos: root.pos
        TextInput:
            id: input_text_id
            text: u"text here"
        Button:
            text:u"pass"
            on_press:
                root.manager.get_screen("second").label_text_id.text = root.input_text_id.text
                app.root.current = "second"

<SecondScreen>
    name: "second"
    label_text_id: label_text_id
    Label:
        id:label_text_id
        text: u""

ざっくりとこんな感じです。
間違えているところもあると思うのでもしアドバイスがあればよろしくお願いします!

実際に動いた感じ↓