在Kivy中释放另一个按钮时添加一个新按钮

时间:2016-11-10 03:14:59

标签: python button kivy bind

我想要一个按钮,如果单击该按钮,它将插入一个新按钮。我无法获得绑定以返回新按钮。

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

1 个答案:

答案 0 :(得分:0)

您正在使用 FloatLayout btn2事件中创建layout = FloatLayout()的另一个实例,但该实例不是其他任何地方,而是在{{ 1}}方法 - 即你向btn2添加了Button,但是这个布局是不可见的,在函数结束后很可能甚至不存在,因为它被Python垃圾收集

如果您只需要一个布局,则可以使用partial来传递已存在的FloatLayout实例(您之前的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() 使用return layout变量(它不会),也不需要on_release