2016-11-10 5 views
0

私はボタンをクリックしようとしていますが、クリックすると新しいボタンが挿入されます。新しいボタンを返すバインドを取得できません。Kivyの別のボタンのリリース時に新しいボタンを追加する

from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.floatlayout import FloatLayout 
from kivy.app import App 
from kivy.uix.label import Label 
from kivy.uix.widget import Widget 
from kivy.uix.scatter import Scatter 
from kivy.uix.button import Button 


class app(App): 
    def build(self): 
     layout = FloatLayout() 
     button1 =Button(text="test",pos=(385,450),size_hint=(.1,.1)) 
     button1.bind(on_release=self.btn2) 
     layout.add_widget(button1) 
     return layout 

    def btn2(self, event): 
     print "worked" 
     layout = FloatLayout() 
     btn3 = Button(text="worked",size=(.1,.1),pos=(380,400)) 
     layout.add_widget(btn3) 
     return layout 

app().run() 

答えて

0

あなたはしかし、そのインスタンスはどこにもありませんが、btn2方法では、layout = FloatLayout()btn2イベントにFloatLayoutの別のインスタンスを作成している - あなたはFloatLayoutButtonを追加しました。すなわち、それレイアウトISN Pythonでガベージコレクションされているため、関数が終了した後でも存在しない可能性が高いです。あなたが唯一の1つのレイアウトが必要な場合は

あなたはどちらか、このように(以前のButtonがどこにあるか)FloatLayoutの既存のインスタンスを渡すためにpartialを使用することができます。

from kivy.uix.button import Button 
from kivy.uix.floatlayout import FloatLayout 
from kivy.app import App 

from functools import partial 

class app(App): 
    def build(self): 
     layout = FloatLayout() 
     button1 =Button(text="test",pos=(385,450),size_hint=(.1,.1)) 
     button1.bind(on_release=partial(self.btn2, layout)) 
     layout.add_widget(button1) 
     return layout 

    def btn2(self, layout, *args): 
     print "worked" 
     btn3 = Button(text="worked",size=(.1,.1),pos=(380,400)) 
     layout.add_widget(btn3) 

app().run() 

それとも、メソッドに渡されたインスタンスを使用することができますイベント(イベントを送出したウィジェットのインスタンス)から引数:あなただけで動作するように右のインスタンスを見つける必要があり、両方のケースで

from kivy.uix.button import Button 
from kivy.uix.floatlayout import FloatLayout 
from kivy.app import App 

class app(App): 
    def build(self): 
     layout = FloatLayout() 
     button1 =Button(text="test",pos=(385,450),size_hint=(.1,.1)) 
     button1.bind(on_release=self.btn2) 
     layout.add_widget(button1) 
     return layout 

    def btn2(self, button): 
     layout = button.parent # parent of the button is the "layout" from build() 
     btn3 = Button(text="worked",size=(.1,.1),pos=(380,400)) 
     layout.add_widget(btn3) 

app().run() 

は、ノーだ別のものを作成しません使用さえできません。またがlayout変数で動作するとは思わない場合は、return layoutは必要ありません。

関連する問題