Kivy:从另一个弹出窗口中关闭一个弹出窗口
Posted
技术标签:
【中文标题】Kivy:从另一个弹出窗口中关闭一个弹出窗口【英文标题】:Kivy: Dismiss One Popup From Another Popup 【发布时间】:2019-04-14 04:26:39 【问题描述】:我使用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】:问题是每次调用 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>
正如你所看到的,每次按下它都会得到一个新的 id,表明它是一个新对象。
所以一个可能的解决方案是保存由属性创建的对象的引用:
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()
【讨论】:
不错!那行得通,谢谢。我删除了first_popup: None
和if root.first_popup is not None:
的想法。它工作得很好。这些的目的是什么,如果我将它们排除在我的代码之外可以吗?
@PetarLuketina 任何人都可以编写一次可以运行的代码,但程序员必须编写始终可以运行的代码,因此第一点是验证未显式声明的对象是否存在。以上是关于Kivy:从另一个弹出窗口中关闭一个弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章
Selenium:在javascript代码中关闭棘手的javascript弹出窗口
如何在 Python / Selenium 中关闭麦克风/相机弹出窗口?