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

Posted

技术标签:

【中文标题】在 Kivy 中释放另一个按钮时添加一个新按钮【英文标题】:Adding a new Button on release of another button in Kivy 【发布时间】:2017-03-23 23:57:25 【问题描述】:

我试图有一个按钮,如果单击它,它将插入一个新按钮。我无法绑定以返回新按钮。

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】:

您正在使用 layout = FloatLayout()btn2 事件中创建另一个 FloatLayout 实例,但是该实例不在其他任何地方,而是在 btn2 方法中 - 即您添加ButtonFloatLayout,但该布局是不可见的,并且在函数结束后它很可能甚至不存在,因为它是由 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_release 使用 layout 变量(它不会),也不需要 return layout

【讨论】:

以上是关于在 Kivy 中释放另一个按钮时添加一个新按钮的主要内容,如果未能解决你的问题,请参考以下文章

使用 ScreenManager 在按钮释放时以 kv 初始化屏幕

如何判断目标 c 中是不是释放了按钮?

如何释放内存?

Kivy - 通过引用根属性动态添加按钮

C# WPF: 在一个窗体上设置一个按钮,点击这个按钮时,打开新窗体并关闭原窗体?

调用removeFromSuperview后如何防止子视图释放自我?