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

Вы создаете еще один экземпляр FloatLayout в btn2 случае с layout = FloatLayout(), однако этот экземпляр не в другом месте, но в методе btn2 - т.е. вы добавили Button к FloatLayout, но расположение ISN 't видно, и после завершения функции очень возможно, что даже не существует, потому что это мусор, собранный 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() 

в обоих случаях вам нужно только найти правильный экземпляр для работы, а не создать еще одно, что нет t даже используется. Также return layout не требуется, если вы не ожидаете, что on_release будет работать с переменной layout (которой она не будет).

 Смежные вопросы

  • Нет связанных вопросов^_^