Python Kivy:如何在按钮点击时调用函数?

时间:2017-09-21 19:40:17

标签: python function button kivy

我非常擅长使用kivy库。

我有一个app.py文件和一个app.kv文件,我的问题是我无法在按下按钮时调用一个函数。

app.py:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class Launch(BoxLayout):
    def __init__(self, **kwargs):
        super(Launch, self).__init__(**kwargs)

    def say_hello(self):
        print "hello"


class App(App):
    def build(self):
        return Launch()


if __name__ == '__main__':
    App().run()

app.kv:

#:kivy 1.9.1

<Launch>:
    BoxLayout:
        Button:
            size:(80,80)
            size_hint:(None,None)
            text:"Click me"
            on_press: say_hello

6 个答案:

答案 0 :(得分:3)

模式:.kv

这很简单,say_hello属于Launch类,因此要在.kv文件中使用它,您必须编写root.say_hello。请注意,say_hello是您要执行的功能,因此您不必忘记() ---&gt; root.say_hello()

此外,如果say_helloApp课程中,您应该使用App.say_hello(),因为它属于该应用。 (注意:即使您的App类为class MyFantasicApp(App):,它仍然是App.say_hello()app.say_hello()我不记得了,抱歉。

#:kivy 1.9.1

<Launch>:
    BoxLayout:
        Button:
            size:(80,80)
            size_hint:(None,None)
            text:"Click me"
            on_press: root.say_hello()

模式:.py

你可以bind这个功能。

from kivy.uix.button import Button # You would need futhermore this
class Launch(BoxLayout):
    def __init__(self, **kwargs):
        super(Launch, self).__init__(**kwargs)
        mybutton = Button(
                            text = 'Click me',
                            size = (80,80),
                            size_hint = (None,None)
                          )
        mybutton.bind(on_press = self.say_hello) # Note: here say_hello doesn't have brackets.
        Launch.add_widget(mybutton)

    def say_hello(self):
        print "hello"

为什么要使用bind?对不起,不知道。但是你在the kivy guide中使用它。

答案 1 :(得分:1)

say_hello是Launch类的一种方法。在您的kv规则中,Launch类是根小部件,因此可以使用root关键字访问它:

on_press: root.say_hello()

另请注意,您必须实际调用该函数,而不仅仅是编写其名称 - 冒号右侧的所有内容都是普通的Python代码。

答案 2 :(得分:1)

我相信利用bind函数(由Ender Look提供)的解决方案将导致以下错误:

TypeError: pressed() takes 1 positional argument but 2 were given

要解决此问题,您必须允许say_hello()模块也接受触摸输入,尽管这不是必需的。

答案 3 :(得分:1)

对于任何正在寻找纯 Python 方法的人,这里是一个通用示例。

调用不带参数的函数:

def my_function(instance):
   ...

my_button.bind(on_press=my_function)

调用带参数的函数:

from functools import partial

def my_function(instance, myarg):
   ...

my_button.bind(on_press=partial(my_function,"a string"))

答案 4 :(得分:0)

from kivy.app import App

from kivy.uix.button import Button

from kivy.uix.label import Label

class Test(App):

def press(self,instance):
    print("Pressed")
def build(self):
    butt=Button(text="Click")
    butt.bind(on_press=self.press) #dont use brackets while calling function
    return butt

Test().run()

答案 5 :(得分:0)

您刚刚在say_hello()函数之前添加了root。 像这样

on_press:
    root.say_hello()

它应该工作