使用.kv文件回调打印kivy Switch Widget的状态

时间:2013-10-13 13:16:30

标签: python-2.7 callback kivy

正如标题所说,每次更改值时,我都会尝试打印出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'

由于

1 个答案:

答案 0 :(得分:6)

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

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

之后

               active: root.callback()

但是回调函数有两个参数(你称之为实例和值的参数),所以很自然地会得到你没有提供的错误。

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

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

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

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