首页 > 解决方案 > Kivy 时钟和条件语句

问题描述

我创建了变量 timer_loop 来连续运行。我想用其他变量做条件语句,但我做不到。下面是一个例子,如果开关被激活,我会尝试每 30 分钟“做一些事情”。任何反馈将不胜感激:)

from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock
import datetime
import time

theRoot = Builder.load_string('''

StackLayout:
    orientation: 'lr-tb'
    padding: 10
    spacing: 5

    Label:
        text: "Zone 1 Valve"
        size_hint: .5, .1

    Switch:
        id: switch_id
        on_active: app.switch_on1(self, self.active)
        size_hint: .5, .1
''')

class theApp(App):

    def build(self):
        Clock.schedule_interval(self.timer_loop, 2)
        return theRoot

    def timer_loop(self, dt):  
        now_minute = int(time.strftime("%M"))

        if switch_on1.active & now.minute ==30 : # how do I use the varible switch_on1 in this loop for conditonal statements???
            print("Do something")
        else:
            print("Do nothing")

    def switch_on1(self, instance, value):
        if value is True:
            print("Switch 1 On")
        else:
            print("Switch 1 Off")

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

标签: pythonkivykivy-language

解决方案


总是建议将一个类视为一个黑盒,我们可以建立输入并获得输出,并且在 kivy 中可以通过属性来完成,例如在这种情况下,您创建StackLayout反映 switch_id 的 active 属性的 active 属性,并且因为theRootStackLayout从 python 中可见的对象,所以我们使用它:

from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock
import time

theRoot = Builder.load_string('''
StackLayout:
    active: switch_id.active # <---
    orientation: 'lr-tb'
    padding: 10
    spacing: 5

    Label:
        text: "Zone 1 Valve"
        size_hint: .5, .1

    Switch:
        id: switch_id
        size_hint: .5, .1
''')

class theApp(App):
    def build(self):
        Clock.schedule_interval(self.timer_loop, 2)
        return theRoot

    def timer_loop(self, dt):  
        now_minute = int(time.strftime("%M"))
        if theRoot.active and now_minute == 30: # <---
            print("Do something")
        else:
            print("Do nothing")


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

正如您意识到的那样,没有必要使用switch_on1,因为主要条件是触发计时器。


推荐阅读