【问题标题】:Kivy: Dismiss One Popup From Another PopupKivy:从另一个弹出窗口中关闭一个弹出窗口
【发布时间】: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()

【问题讨论】:

    标签: python popup kivy


    【解决方案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: Noneif root.first_popup is not None: 的想法。它工作得很好。这些的目的是什么,如果我将它们排除在我的代码之外可以吗?
    • @PetarLuketina 任何人都可以编写一次可以运行的代码,但程序员必须编写始终可以运行的代码,因此第一点是验证未显式声明的对象是否存在。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多