Kivy: уволить одно всплывающее окно из другого всплывающее окно - PullRequest
0 голосов
/ 11 ноября 2018

Я использую kivy.factory.Factory, чтобы открыть всплывающие окна, но это не работает, когда я хочу закрыть их.

Код:

from kivy.app import App
from kivy.lang import Builder


x = Builder.load_string("""
#:import F kivy.factory.Factory
#:import Window kivy.core.window.Window

Screen:
    Button:
        text: 'Press to Open First Popup'
        on_press:
            F.FirstPopup().open()

<FirstPopup@Popup>:
    title: 'First Popup'
    size_hint: None, None
    width: Window.width / 1.4
    height: Window.width / 1.4

    Button:
        text: 'Press to Open Second Popup'
        on_press: F.SecondPopup().open()

<SecondPopup@Popup>:
    title: 'Second Popup'
    size_hint: None, None
    width: Window.width / 1.8
    height: Window.width / 1.8

    Button:
        text: 'Press to Close Both Popups'
        on_press:
            root.dismiss()
            F.FirstPopup().dismiss() # < DOSEN'T WORK
""")

class MyApp(App):

    def build(self):
        return x

MyApp().run()

1 Ответ

0 голосов
/ 11 ноября 2018

Проблема в том, что каждый раз, когда вы вызываете F.Foo(), вы создаете новый объект класса Foo, поэтому в вашем случае F.FirstPopup().open() экрана отличается от F.FirstPopup().dismiss() SecondPopup, другими словами, вы закрываете всплывающее окно, которое вы только что создали вместо начала. Чтобы сделать это очевидным, вы можете изменить свой код на:

# ...
Button:
    text: 'Press to Close Both Popups'
    on_press:
        print(F.FirstPopup())

Получение следующего:

<kivy.factory.FirstPopup object at 0x7f8f9a183e18>
<kivy.factory.FirstPopup object at 0x7f8f996fc118>
<kivy.factory.FirstPopup object at 0x7f8f996fc388>
<kivy.factory.FirstPopup object at 0x7f8f996fc5f8>
<kivy.factory.FirstPopup object at 0x7f8f996fc528>
<kivy.factory.FirstPopup object at 0x7f8f996fc2b8>
<kivy.factory.FirstPopup object at 0x7f8f996fc048>

И, как вы видите, каждый раз, когда вы нажимаете его, вы получаете новый идентификатор, указывающий, что это новый объект.

Таким образом, возможное решение - сохранить ссылку на объект, созданный свойством:

from kivy.app import App
from kivy.lang import Builder

x = Builder.load_string("""
#:import F kivy.factory.Factory
#:import Window kivy.core.window.Window

Screen:
    Button:
        text: 'Press to Open First Popup'
        on_press:
            F.FirstPopup().open()

<FirstPopup@Popup>:
    title: 'First Popup'
    size_hint: None, None
    width: Window.width / 1.4
    height: Window.width / 1.4
    Button:
        text: 'Press to Open Second Popup'
        on_press: 
            second_popup = F.SecondPopup()
            second_popup.first_popup = root
            second_popup.open()

<SecondPopup@Popup>:
    title: 'Second Popup'
    size_hint: None, None
    width: Window.width / 1.8
    height: Window.width / 1.8
    first_popup: None
    Button:
        text: 'Press to Close Both Popups'
        on_press:
            root.dismiss()
            if root.first_popup is not None: root.first_popup.dismiss()
""")

class MyApp(App):
    def build(self):
        return x

MyApp().run()
...