Kivy Clock and Popup

岁酱吖の 提交于 2019-12-24 06:35:07

问题


How do I properly create active properties for switch_id and switch_id_popup so I can create a conditional statement inside of timer_loop with kivy clock?

I got great feedback on a similar question(thanks again eyllanesc), but I am unable to incorporate advice now that popup is involved.

Below is a sketch that illustrates my issue. I have identified all of the areas in question with arrows. Thank you in advance for any help.

from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock
import time
from kivy.uix.popup import Popup

theRoot = Builder.load_string('''

<CustomPopup1>:

    StackLayout:
        active2: switch_id_popup.active #<---- switch_id_popup declared here(active2)


        Switch:                         #<---- This switch (switch_id_popup)
            id: switch_id_popup
            size_hint: .5, .5
            active: switch_id_popup.active

        Button:
            text: 'Close'
            on_release: root.dismiss()
            size_hint: .5, .5



StackLayout:
    active1: switch_id.active           #<---- switch_id declared here(active1)
    orientation: 'lr-tb'
    padding: 10
    spacing: 5


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

    Switch:                             #<---- This switch (switch_id)
        id: switch_id
        size_hint: .25, .1
        active: switch_id.active


    Button:
        text: "Program 1"
        on_press: app.open_popup1()
        size_hint: .5,.1

''')


class CustomPopup1(Popup):
    pass

class theApp(App):


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


    def timer_loop(self, dt):  

        if theRoot.active1 and theRoot.active2: #<---- How do I make this work if switch_id_popup is within a popup?
            print("Do something")
        else:
            print("Do nothing")

    def open_popup1(self):
        the_popup = CustomPopup1()
        the_popup.open()


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

回答1:


As I mentioned in my previous solution, you should consider each class as a black box and expose properties that allow you to obtain and establish values. In the case of Popup, the active property must be part of the class and not the internal StackLayout. On the other hand in the open_popup method you are always creating a new Popup that will be deleted when you close it making the property is not accessible, so we deduce that there must be a Popup object with a larger scope for it must be created outside of theApp class or be a member of it. Lastly, active2 is not a property of theRoot.

Considering the above, the following solution is obtained:

from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock
import time
from kivy.uix.popup import Popup

theRoot = Builder.load_string('''
<CustomPopup>:
    active: switch_id_popup.active
    StackLayout:
        Switch:
            id: switch_id_popup
            size_hint: .5, .5
        Button:
            text: 'Close'
            on_release: root.dismiss()
            size_hint: .5, .5

StackLayout:
    active: switch_id.active
    orientation: 'lr-tb'
    padding: 10
    spacing: 5
    Label:
        text: "Zone 1 Valve"
        size_hint: .25, .1
    Switch:
        id: switch_id
        size_hint: .25, .1
    Button:
        text: "Program 1"
        on_press: app.open_popup()
        size_hint: .5,.1

''')

class CustomPopup(Popup):
    pass


class TheApp(App):
    def build(self):
        self.the_popup = CustomPopup()
        Clock.schedule_interval(self.timer_loop, 2)
        return theRoot

    def timer_loop(self, dt):  
        if self.root.active and self.the_popup.active:
            print("Do something")
        else:
            print("Do nothing")

    def open_popup(self):
        self.the_popup.open()


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


来源:https://stackoverflow.com/questions/52901880/kivy-clock-and-popup

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!