【问题标题】:How to dismiss the Kivy pop-up via a Button?如何通过按钮关闭 Kivy 弹出窗口?
【发布时间】:2017-01-10 19:51:22
【问题描述】:

我有一个使用 Kivy 创建的弹出窗口,其中包含 2 个按钮。用户可以通过在弹出区域外按下(auto_dismiss = True)或单击“否”按钮来关闭弹出窗口。 选择“是”按钮,将退出整个应用程序。

请看相关代码:

class ExitApp(App):

def exit_confirmation(self):

    # popup can only have one Widget.  This can be fixed by adding a BoxLayout

    self.box_popup = BoxLayout(orientation = 'horizontal')

    self.box_popup.add_widget(Label(text = "Really exit?"))

    self.box_popup.add_widget(Button(
        text = "Yes",
        on_press = ExitApp.exit,
        size_hint = (0.215, 0.075)))

    self.box_popup.add_widget(Button(
        text = "No",
        on_press = self.popup_exit.dismiss,
        size_hint=(0.215, 0.075)))

    self.popup_exit = Popup(title = "Exit",
        content = self.box_popup,
        size_hint = (0.4, 0.4),
        auto_dismiss = True)

    self.popup_exit.open()

def exit(self):

    App.get_running_app().stop()

现在的问题在于按下“否”按钮。按下该按钮时,代码将退出并出现以下错误:

 on_press = self.popup_exit.dismiss,

AttributeError: 'Button' 对象没有属性 'popup_exit'

知道如何尽可能轻松地解决此问题吗?

【问题讨论】:

    标签: python button popup kivy dismiss


    【解决方案1】:

    你可以通过一个惰性函数来解决这个问题

    on_press = lambda *args: self.popup_exit.dismiss()
    

    这样,仅在按下按钮且 popup_exit 已就位时才会发生查找...

    【讨论】:

    • lambda 函数在这里没有帮助...请在没有 lambda 函数的情况下查看我的答案。知道在这个例子中如何使用 lambda 吗?
    • @ElFred 将我的答案中的那一行,而不是你答案中的那一行...如果它不起作用,请发布新错误...
    • 您的建议因以下错误而失败:“TypeError: () 不接受任何参数(给定 1 个)”
    • @ElFred - 添加 *args 以忽略按钮参数
    • 太棒了!那确实解决了 lambda 问题!非常感谢!
    【解决方案2】:

    on_press = self.popup_exit.dismiss更改为on_press = lambda: self.popup_exit.dismiss(),因为dismiss是一个函数,需要在按下按钮时调用。

    def exit_confirmation(self):
    
    
        # popup can only have one Widget.  This can be fixed by adding a BoxLayout
    
        self.box_popup = BoxLayout(orientation = 'horizontal')
    
        self.box_popup.add_widget(Label(text = "Really exit?"))
    
        self.box_popup.add_widget(Button(
            text = "Yes",
            on_press = ExitApp.exit,
            size_hint = (0.215, 0.075)))
    
        self.popup_exit = Popup(title = "Exit",
            content = self.box_popup,
            size_hint = (0.4, 0.4),
            auto_dismiss = True)
    
        self.box_popup.add_widget(Button(
        text = "No",
        on_press = lambda: self.popup_exit.dismiss() ,
        size_hint=(0.215, 0.075)))
    
        self.popup_exit.open()
    

    【讨论】:

    • 你不应该调用self.popup_exit.dismiss(),它会在评估时调用!不是按下按钮时,删除括号
    • 我想我必须删除答案:))。是的,我会再次编辑并考虑:) tnx
    • 感谢您的回复!但是,lambda 解决方案不起作用......我收到了这个错误:“TypeError: () 没有参数(1 个给定)”。但有什么帮助,是在按钮“add_widget”代码之前更改“self.popup_exit....”代码的位置,然后是“on_press = self.popup_exit.dismiss”
    • 这是解决方案,由 Yoav Glazner 在另一个答案中给出! on_press = lambda *args: self.popup_exit.dismiss()
    【解决方案3】:

    类似的东西在kivy 中会起作用吗?

    on_press : root.dismiss()
    

    【讨论】:

    【解决方案4】:

    试试这个:on_press = self.popup.dismiss() 替换 on_press = self.popup_exit.dismiss

    【讨论】:

    • 不正确,会在评估时调用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多