【问题标题】:Callback to print state of kivy Switch Widget using .kv file使用 .kv 文件回调打印 kivy Switch Widget 的状态
【发布时间】:2013-10-13 13:16:30
【问题描述】:

正如标题所说,每次更改值时,我都会尝试打印出 Switch 小部件的值。我已经设法编写了回调本身,但我似乎无法弄清楚在我的 .kv 文件中传递回调的参数。

现在我收到错误消息:'callback() 恰好需要 2 个参数(给定 1 个)'

from kivy.config import Config
Config.set('graphics', 'width', '600')
Config.set('graphics', 'height', '300')
Config.set('graphics', 'resizable', 0)
from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.switch import Switch

Builder.load_file('hueLayout.kv')

class hueLayout(BoxLayout):
    pwr1_switch = ObjectProperty()


    def callback(instance, value):
        print 'instance: ', instance
        print 'value: ', value


    #pwr1_switch.bind(pwr1_switch, active=callback)

class HueController(App):
    def build(self):
        #self._app_window_size = 5, 20
        return hueLayout()

if __name__ == '__main__':

    Config.write()
    HueController().run()

<hueLayout>:
    #size_hint: .5, .5
    #pos_hint: {'center_x': .5, 'center_y': .5}
    #height: '200dp'
    #width: '100dp'
    pwr1_switch: pwr1_input

    TabbedPanel:
        do_default_tab: False

        TabbedPanelItem:
            text: 'Master'
            GridLayout:
                cols: 3

                Switch:
                    id: pwr1_input
                    active: root.callback()



        TabbedPanelItem:
            text: 'Light 1'
            BoxLayout:

        TabbedPanelItem:
            text: 'Light 2'

        TabbedPanelItem:
            text: 'Light 3'

谢谢

【问题讨论】:

    标签: python-2.7 callback kivy


    【解决方案1】:

    嗯,你的实际错误是因为你有

    def callback(instance, value):
        print 'instance: ', instance
        print 'value: ', value
    

    后来

                   active: root.callback()
    

    但是回调函数有两个参数(那些你调用实例和值),所以你自然会得到你没有提供足够的错误。

    您的问题看起来有 3 个组成部分:

    1) 说active: root.callback() 试图从回调的result设置 活动属性。这与您想要的相反,您希望在活动属性更改调用 callback()。您可以改为 on_active: root.callback() 在活动更改时调用该函数。

    2) 请记住,kv 语言中冒号右边的所有内容都只是 python。这意味着如果你调用一个函数,你必须给它正确的参数,没有什么是隐含的。在您的情况下,您调用 callback() 时没有参数,而它需要两个参数。 on_active 方法会自动接收我认为您真正想要的两个参数,在 kv 语言中,它们可以通过 in the documentation 中描述的 'args' 关键字访问。您可以通过on_active: root.callback(*args) 传递这些信息。

    3) 作为类方法,callback() 自动接收类实例作为隐式第一个参数,通常只调用 self。实例和值传递。您可以在properties documentation 中看到一个示例,搜索on_a。所以你需要def callback(self, instance, value) 才能工作。

    【讨论】:

    • 我故意让活动:root.callback() 为空,因为我不知道该放什么。但是谢谢,这完美地解决了我的问题。我不明白您可以将“on_”添加到属性以在更改时调用。
    猜你喜欢
    • 2018-02-18
    • 2015-07-24
    • 2021-02-16
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多