主:
# -*- 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时才有效,但我必须有一个不同的类作为根 请帮我解决这个问题,我被困了
答案 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
。