今日から自分の備忘録を兼ねて更新。
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""
ざっくりとこんな感じです。
間違えているところもあると思うのでもしアドバイスがあればよろしくお願いします!