Kivy Clock and Popup - PullRequest
       29

Kivy Clock and Popup

0 голосов
/ 20 октября 2018

Как правильно создать активные свойства для switch_id и switch_id_popup, чтобы я мог создать условный оператор внутри timer_loop с kivy clock?

Я получил отличную обратную связь по аналогичному вопросу (еще раз спасибо eyllanesc), но яя не могу включить совет сейчас, когда всплывающее окно участвует.

Ниже приведен эскиз, иллюстрирующий мою проблему.Я обозначил все рассматриваемые области стрелками.Спасибо заранее за любую помощь.

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 Ответ

0 голосов
/ 20 октября 2018

Как я уже упоминал в моем предыдущем решении , вы должны рассматривать каждый класс как черный ящик и предоставлять свойства, которые позволяют вам получать и устанавливать значения.В случае Popup активное свойство должно быть частью класса, а не внутренним StackLayout.С другой стороны, в методе open_popup вы всегда создаете новое всплывающее окно, которое будет удалено при закрытии, что делает свойство недоступным, поэтому мы заключаем, что должен быть объект Popup с большей областью действия, поскольку он должен быть создан внеиз класса приложения или быть его членом.Наконец, active2 не является свойством theRoot.

Учитывая вышеизложенное, получается следующее решение:

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