Kivy,使用轮盘赌和旋转木马传递参数

时间:2014-10-02 20:46:57

标签: kivy

主:

# -*- coding: utf-8 -*-

import kivy
kivy.require('1.8.0')
'''
Check aida.kv for the ui design
'''


from kivy.app import App

from kivy.uix.boxlayout import BoxLayout
from kivy.properties import (ObjectProperty, ListProperty, StringProperty, NumericProperty)

class Controls(BoxLayout):   
    timer_value = NumericProperty()
    def __init__(self, **kwargs):
        super(Controls, self).__init__(**kwargs)

        self.roulette_time.bind(rolling_value=self.time_changed)  

    def time_changed(self, instance, value):
        self.timer_value = value

class WeatherRoot(BoxLayout):


    pass

class AidaApp(App):
    pass    

if __name__ == '__main__':
    AidaApp().run()



kv:

# -*- coding: cp1252 -*-
#:kivy 1.8.0

#:import CyclicRoulette kivy.garden.roulette.CyclicRoulette

WeatherRoot:


<WeatherRoot@BoxLayout>:

    carousel: carousel

    controls: controls


    BoxLayout:
        orientation: "vertical"

        Carousel:
            id: carousel
            Controls:
                id: controls

<Controls>:
    canvas.before:
        Color:
            rgba: 0.686, 0.635, 0.541, 0.5
        Rectangle:
            pos: self.pos
            size: self.size

    roulette_time: rlt_time

    BoxLayout:
        CyclicRoulette:
            cycle: 60
            density: 15
            zero_indexed: True
            selected_value: 5
            width: 50
            background_color: [0.686, 0.635, 0.541, 1]
            id: rlt_time
        Label:
            size_hint: (1, .8)
            text: format(root.timer_value)
            font_size: 50

我收到错误&#39;控件&#39;对象没有属性&#39; roulette_time 当我设置属性时,我会得到一些关于绑定等的不同错误 仅在kv控件设置为root时才有效,但我必须有一个不同的类作为根 请帮我解决这个问题,我被困了

2 个答案:

答案 0 :(得分:0)

您收到错误Controls'object has no attribute 'roulette_time',因为在您的Controls类中没有任何地方或任何地方,您是否定义了roulette_time变量。尝试在Controls类中设置roulette_time = NumericProperty(0)。

class Controls(BoxLayout):
    roulette_time = NumericProperty(0)

答案 1 :(得分:0)

不确定为什么不起作用,因为它应该。应自动创建ObjectProperty以保留对CyclicRoulette实例的引用。

但是 - 有一种更简单的方法可以做到这一点!您只是在Controls类上更新了具有该值的属性,因此您可以直接绑定它们。替换此行:

roulette_time: rlt_time

使用:

timer_value: rlt_time.rolling_value

每当CyclicRoulette rolling_value媒体资源发生变化时,您timer_value上的Controls都会自动更新。您无需创建time_changed方法或将其绑定到CyclicRoulette