Проблема в том, что каждый раз, когда вы вызываете 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()