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

问题描述 投票:0回答:9

我对使用 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
python function button kivy
9个回答
13
投票

模式:
.kv

非常简单,

say_hello
属于
Launch
类,因此为了在
.kv
文件中使用它,你必须编写
root.say_hello
。请注意,
say_hello
是您要执行的函数,因此您不必忘记
()
--->
root.say_hello()

此外,如果

say_hello
App
类中,您应该使用
App.say_hello()
,因为它属于应用程序。 (注意:即使您的应用程序类是
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
?抱歉,不知道。但你在kivy指南中使用了它。


3
投票
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()

2
投票

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

on_press: root.say_hello()

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


2
投票

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

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

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


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"))

1
投票

如果您想向 Kivy 中的任何元素添加功能,只需使用像这里这样的逻辑。

在您的 .py 文件中:

class LoginButton(Button):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.text = "Login"

    def login(self):
        print("logged_in") 

然后在.kv文件中:

LoginButton:
            id: "login"
            on_press: self.login()
            size_hint: None, None
            size: 500, 50
            pos_hint: {"center_x": 0.5}

它对我有用:)


1
投票

kv 文件中以对象作为参数的函数

单位:

on_press: root.say_hello(self)

在py中:

def say_hello(self,obj):
    print(obj)

0
投票

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

on_press:
    root.say_hello()

应该可以工作


0
投票

从kivy.app导入App 从 kivy.uix.button 导入 Button

MyApp类(应用程序): def 构建(自身): return Button(text="你好,Kivy!", on_press=self.on_button_click)

def on_button_click(self, instance):
    instance.text = "Button Pressed!"

if name == 'main': MyApp().run()

© www.soinside.com 2019 - 2024. All rights reserved.