2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

kivy データ受け渡し

Last updated at Posted at 2019-10-14

今日から自分の備忘録を兼ねて更新。
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""

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

実際に動いた感じ↓
スクリーンショット (19).png

スクリーンショット (20).png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?