Kivy:从另一个弹出窗口中删除一个弹出窗口

2024-10-01 19:15:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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()

Tags: totextimportnoneonfactorybuttonwindow
1条回答
网友
1楼 · 发布于 2024-10-01 19:15:04

问题是,每次调用F.Foo()时,都是在创建Foo类的一个新对象,因此在您的例子中,屏幕的F.FirstPopup().open()与{}second popup不同,换句话说,您关闭的是刚刚创建的弹出窗口而不是start。为了使其显而易见,您可以将代码更改为:

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

获得以下信息:

^{pr2}$

当你每次按下它时,你会得到一个新的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()

相关问题 更多 >

    热门问题