2016-11-10 69 views
0

我想要一个按钮,如果它被点击,它会插入一个新按钮。我不能让绑定返回新的按钮。在基维发布另一个按钮时添加一个新按钮

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事件产生的FloatLayout另一个实例与layout = FloatLayout(),但该实例不是其他地方,但在btn2方法 - 即你添加一个ButtonFloatLayout,但布局ISN不可见,并且在函数结束后很可能甚至不存在,因为它是由Python进行垃圾回收的。

您可以使用partial传递的FloatLayout已经存在的情况下(在您以前Button是)这样的,如果你只需要一个布局:

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() 

在这两种情况下,你只需要找到合适的实例与合作,而不是再创建一个没有:从事件(调度该事件的窗口小部件的实例)参数甚至用过。如果您不希望on_releaselayout变量(它不会)一起使用,也不需要return layout