![](/img/trans.png)
[英]How do I add buttons that are dynamically created in pure python to a kivy layout that is Written in Kivy Language?
[英]How to add mulitple buttons to a Kivy Layout
我正在尝试使用 Kivy 制作一个音乐播放器,它只有两个按钮; 一个用于播放,一个用于暂停。 当我尝试将 function 绑定到按钮时,当我按下按钮时,出现错误。 在搜索这个非常自己的网站后,有人建议使用functools
库中的partial
function。 但即使这样也没有用。 我的代码如下。
class Layout(FloatLayout):
def __init__(self, **kwargs):
super(Layout, self).__init__(**kwargs)
self.size = Window.size
self.play = Button(text="Play", size_hint=(0.25, 0.25), font_size=36, background_color=color,
pos=(self.size[0]*(3/8), self.size[1]*(4/10)) )
self.pause = Button(text="Pause", size_hint=(0.25, 0.25), font_size=36, background_color=color,
pos=(self.size[0]*(3/8), self.size[1]*(1/10)) )
self.play.bind(on_press=self.play)
self.pause.bind(on_press=self.pause)
self.add_widget(self.play)
self.add_widget(self.pause)
def play(self):
print("PLay")
def pause(self):
print("Pause")
这给出了这个错误
AssertionError: <kivy.uix.button.Button object at 0x000001D1D4792CF0> 不可调用
并通过使用部分 function
self.play.bind(on_press=partial(self.play))
self.pause.bind(on_press=partial(self.pause))
我得到了这个
TypeError:第一个参数必须是可调用的
您的代码中有两个错误。 第一个是您为事件处理程序和按钮指定了相同的名称。 所以改变其中之一。 其次,您需要事件处理程序的第二个参数,因为它使用参数调用。
这是您更正的代码:
class Layout(FloatLayout):
def __init__(self, **kwargs):
super(Layout, self).__init__(**kwargs)
self.size = Window.size
self.play = Button(text="Play", size_hint=(0.25, 0.25), font_size=36,
pos=(self.size[0]*(3/8), self.size[1]*(4/10)) )
self.pause = Button(text="Pause", size_hint=(0.25, 0.25), font_size=36,
pos=(self.size[0]*(3/8), self.size[1]*(1/10)) )
self.play.bind(on_press=self.play1)
self.pause.bind(on_press=self.pause1)
self.add_widget(self.play)
self.add_widget(self.pause)
def play1(self, instance):
print("PLay")
def pause1(self, instance):
print("Pause")
如果您不想添加参数,则可以使用 lambda function。 像这样的东西:
self.play.bind(on_press=lambda _:self.play1())
self.pause.bind(on_press=lambda _:self.pause1())
在这种情况下,您可以删除事件处理程序中的额外参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.