2016-11-10 65 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