1

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

谢谢

4

1 回答 1

6

好吧,您遇到的实际错误是因为您有

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

然后稍后

               active: root.callback()

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

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

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

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

3) 作为类方法,callback() 自动接收类实例作为隐式的第一个参数,通常只调用 self。实例和值也被传递。您可以在属性文档中查看示例,搜索on_a. 所以你需要def callback(self, instance, value)让它工作。

于 2013-10-13T14:51:10.253 回答