【问题标题】:How to add mulitple buttons to a Kivy Layout如何将多个按钮添加到 Kivy 布局
【发布时间】:2021-04-17 11:46:08
【问题描述】:

我正在尝试使用 Kivy 制作一个音乐播放器,它只有两个按钮;一个用于播放,一个用于暂停。当我尝试将功能绑定到按钮时,当我按下按钮时,会出现错误。在搜索这个非常自己的站点时,有人建议使用来自functools 库的partial 函数。但即使这样也没有用。我的代码如下。

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: 不可调用

通过使用偏函数

        self.play.bind(on_press=partial(self.play))
        self.pause.bind(on_press=partial(self.pause))

我得到了这个

TypeError:第一个参数必须是可调用的

【问题讨论】:

    标签: python python-3.x user-interface kivy


    【解决方案1】:

    您的代码中有两个错误。第一个是您为事件处理程序和按钮指定了相同的名称。所以改变其中之一。其次,当事件处理程序使用参数调用它时,您需要第二个参数。

    这是您更正后的代码:

    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 函数。 像这样的:

    self.play.bind(on_press=lambda _:self.play1())
    self.pause.bind(on_press=lambda _:self.pause1())
    

    在这种情况下,您可以删除事件处理程序中的额外参数。

    【讨论】:

    • 这成功了!现在我会记得为函数和变量保留不同的名称:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2020-08-04
    相关资源
    最近更新 更多