質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • Python

    6337questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    4822questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1168questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Kivy add_widgetしたウィジェットのイベント操作

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 290

  
  
--2017 12/23 13:35 わかりやすくするために変更しました。--
  
  
  
実行可能な具体的なコードと一緒に質問を編集しました。

下記のコードですが、
私の目標はadd_widgetしたウィジェットに対し変更を加えることです。

変更するウィジェットはNumberであり、プロパティは

  1. text
  2. cooooop

です。

下記を実行すると二つのボタンがあり、
Addを押してadd_widget()し、
changeを押してWrapper内のcopを変更します。

ですが、追加されたウィジェットは何も変化しません。

これを追加されたウィジェットに変更を加えるにはどうすれば良いのでしょうか?

知恵を貸してください。

よろしくお願いします。
  
  
  

from kivy.app             import App
from kivy.uix.behaviors   import ButtonBehavior
from kivy.uix.label       import Label
from kivy.uix.gridlayout  import GridLayout
from kivy.properties      import ObjectProperty

class Number(Label):
    pass

class Wrapper(GridLayout):
    pass

class Adder(ButtonBehavior, Label):
    rooting = ObjectProperty(None)
    def on_release(self):
        self.rooting.add_widget(Number(
            rooting = self.rooting,
            cooooop = self.rooting.cop,
            text    = self.rooting.cop,
        ))

class Changer(ButtonBehavior, Label):
    rooting = ObjectProperty(None)
    def on_release(self):
        self.rooting.cop = 'Thank you'

class TestApp(App):
    def build(self):
        pass

TestApp().run()
#kvfile
<Number>:
    font_size: sp(15)
    halign: 'center'
    markup: True
    valign: 'top'
    size_hint_y: None
    text_size: self.width, sp(50)
    height: sp(30)
    multiline: False

<Adder>:
    text: "Add"
    font_size: sp(15)
    halign: 'center'
    markup: True
    valign: 'middle'
    size_hint_y: None
    text_size: self.width, sp(50)
    height: sp(30)
    multiline: False
    col: 1.000 ,0.5843 ,0.000, 1
    on_release: self.col = 1.000 ,0.5843 ,0.000, 1
    on_press:   self.col = 1.000 ,0.5843 ,0.000, .5
    canvas.before:
        Color:
            rgba: self.col
        RoundedRectangle:
            pos: self.pos
            size: self.size
            radius: [sp(12)]

<Changer>:
    text: "Change"
    font_size: sp(15)
    halign: 'center'
    markup: True
    valign: 'middle'
    size_hint_y: None
    text_size: self.width, sp(50)
    height: sp(30)
    multiline: False
    col: 0.000  ,0.4784  ,1.000, 1
    on_release: self.col = 0.000  ,0.4784  ,1.000, 1
    on_press:   self.col = 0.000  ,0.4784  ,1.000, .5
    canvas.before:
        Color:
            rgba: self.col
        RoundedRectangle:
            pos: self.pos
            size: self.size
            radius: [sp(12)]

Wrapper:
    padding: 0, 300, 0, 0
    pos_hint: {'top': 1, 'center_x': .5}
    cols: 1
    size_hint: .3, None
    id: rooting
    height: self.minimum_height
    cop: 'Change me'
    spacing: 0, 50
    Adder:
        rooting: rooting
    Changer:
        rooting: rooting
    Label:
        size_hint_y: None
        height: sp(40)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

記事のTagに 'Python 3.x' と 'Python 2.7' がありますが、'Python 3.x' は使ってないですよね、おそらく。

追加されたウィジェットが変化しない原因ですが、Propertyのbindがされていないからです。

    def on_release(self):
        self.rooting.add_widget(Number(
            rooting = self.rooting,
            cooooop = self.rooting.cop,
            text    = self.rooting.cop,
        ))

に於いてNumberのtextはこの瞬間のself.rooting.copで初期化されているだけであって、bindは行われていません。なのでその後self.rooting.copが変化したとしてもそれに追従してNumberのtextは変わったりしません。そうする為には

    def on_release(self):
        number = Number(text=self.rooting.cop)
        self.rooting.bind(cop=number.setter('text'))
        self.rooting.add_widget(number)

と手動でbindしてあげます。(Numberはrooting,cooooopというPropertyは持っていないため、その部分は消しました。)

自動的にbindしてくれるのはKv言語で書いた部分だけなので気を付けて。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/25 00:17

    回答ありがとうございます。
    できました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    kivyのテキスト1行入力ボックスを作るコード

    kivyを勉強中なのですが、tkinterのEntryのようにテキスト1行入力ボックスを作りたくて、公式サイトをみると一応作れるようにはなっているみたいなのですが、よくわかりません

  • 解決済

    [kivy][python]kivyファイルを複数使いたい

    前提・実現したいこと 今、kivyファイルを1枚で作ってます。 ScreenManagerで画面切り替えをできるようにしています。 test.kvの中身が増えてきて、ごちゃごちゃし

  • 解決済

    (kivy)画面遷移後にテーブルを作成したい

    前提・実現したいこと kivyを使用してGUIの作成をしています。 アプリ起動後、ログインページを経由した後、テーブルを作成・表示したいのですが難航しています。 該当のソースコ

  • 解決済

    [python2.7][kivy] 別ディレクトリから画像を呼び出し&並べて表示

    前提・実現したいこと 現在、別ディレクトリにある画像の表示を全て手入力で行なっています。(図1) Buttonにしているのは仕様です。 見た目はこのままで、自動化させて行きたいです

  • 解決済

    Kivy 複数のScrollViewのスクロール量を同期させたい。

    KivyのScrollViewが複数あったとして、それらのスクロール量を同期させるためのコードを書いているのですが、リアルタイムで同期するにはどのようなコードを書けば良いですか?

  • 解決済

    Python Kivy の起動が遅い

    タイトル通りなのですが、kivyの起動が遅いと感じています。 改善する方法はないものでしょうか? どんなに短いコードであったとしても、平均4秒はかかります。 遅いときは10秒かかる

  • 解決済

    Kivyのボタン入力と表示に関して。

    Kivy入門サイトを参考に、ボタンで入力された数字キーを表示するディスプレイを作ろうとしています。 0ボタンが押されたときにフレーム上段のディスプレイに0と表示させたいのですが、何

  • 解決済

    (kivy)RecycleViewに組み込んだCheckBoxの状態の取得方法について

    やりたいこと kivyを使用して,ID管理アプリを作成しようとしています. 何かしらの手段によって,現在登録されているIDの一覧を取得・表示し,管理したいと考えています. 現状

同じタグがついた質問を見る

  • Python

    6337questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    4822questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1168questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。