【问题标题】:Kivy button binding function with argument带参数的 Kivy 按钮绑定函数
【发布时间】:2016-02-08 18:35:17
【问题描述】:

我正在尝试学习如何在 Kivy 中创建应用程序,但在向函数发送参数时遇到问题。我想将文本从输入发送到函数并打印出来。谁能告诉我该怎么做?

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


class TutorialApp(App):
    def gratulation(self, *args):
        print args

    def build(self):
        boxLayout = BoxLayout(spacing=10,orientation='vertical')
        g = TextInput(text='Enter gratulation', 
                      multiline=False,
                      font_size=20,
                      height=100)
        button = Button(text='Send')
        button.bind(on_press=self.gratulation)  

        boxLayout.add_widget(g)
        boxLayout.add_widget(button)
        return boxLayout

if __name__ == "__main__":
    TutorialApp().run()

【问题讨论】:

    标签: python button arguments bind kivy


    【解决方案1】:

    你必须从“g”获取文本,然后将其发送到按钮回调,有两种方法可以做到这一点,通过 lambda 函数,或者调用你的类方法来应用它。

    Lambda 版本:

    from __future__ import print_function ##Need to import this for calling print inside lambda
    
    def build(self):
        boxLayout = BoxLayout(spacing=10,orientation='vertical')
        g = TextInput(text='Enter gratulation', 
                      multiline=False,
                      font_size=20,
                      height=100)
        button = Button(text='Send')
        buttoncallback = lambda:print(g.text)
        button.bind(on_press=buttoncallback)  
        ...
    

    部分版本:

    from functools import partial ##import partial, wich allows to apply arguments to functions returning a funtion with that arguments by default.
    def build(self):
        boxLayout = BoxLayout(spacing=10,orientation='vertical')
        g = TextInput(text='Enter gratulation', 
                      multiline=False,
                      font_size=20,
                      height=100)
        button = Button(text='Send')
        buttoncallback = partial(self.gratulation, g.text)
        button.bind(on_press=buttoncallback)  
        ...
    

    【讨论】:

    • 哪种解决方案更好(您或他的),为什么?
    • @AndrewScott 我会使用 lambda 版本,它们都可以,它们执行相同的操作。以防万一您想修改其他调用的打印行为并将该行为保留在按钮调用上,我将使用部分调用,因此您只需更改方法,它将保留在回调中。
    【解决方案2】:

    一种方法:

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.textinput import TextInput
    from kivy.uix.button import Button
    
    
    class TutorialApp(App):
    
        def gratulation(self, instance):
            print(self.g.text)
    
        def build(self):
            boxLayout = BoxLayout(spacing=10,orientation='vertical')
            self.g = TextInput(text='Enter gratulation',
                          multiline=False,
                          font_size=20,
                          height=100)
            button = Button(text='Send')
            button.bind(on_press=self.gratulation)
    
            boxLayout.add_widget(self.g)
            boxLayout.add_widget(button)
            return boxLayout
    
    if __name__ == "__main__":
        TutorialApp().run()
    

    希望对你有帮助!

    【讨论】:

    • 我只是初学者,但我什么时候说你在属性“g”之前添加自我并将其更改为公共属性?
    猜你喜欢
    • 2021-02-14
    • 2018-11-11
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-08-10
    相关资源
    最近更新 更多