Search code examples
pythonkivykivy-language

Kivy Clock & Conditional Statements


I created the variable timer_loop to run continuously. I'd like to make conditional statements with other variables, but I am unable to do so. Below is an example, I am trying to "do something" every 30 minutes if the switch is activated. Any feedback would be greatly appreciated :)

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()

Solution

  • It is always advisable to see a class as a black box that we can establish input and obtain outputs and that in kivy can be done through properties, for example in this case you create the active property of StackLayout that reflects the active property of switch_id, and since theRoot is the StackLayout object that is visible from python we use it:

    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()
    

    As you realize it is not necessary to use switch_on1 since the main condition is the triggering of the timer.