在 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
方法中 - 即您添加Button
到 FloatLayout
,但该布局是不可见的,并且在函数结束后它很可能甚至不存在,因为它是由 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 初始化屏幕