【问题标题】:Kivy switch launches popup multiple timesKivy 开关多次启动弹出窗口
【发布时间】:2019-12-27 23:21:53
【问题描述】:

我正在编写一段复杂的代码,但有一个我似乎无法解决的小错误。当用户切换开关时,我希望打开一个弹出窗口。弹出窗口关闭后,开关仍然打开(这是我想要的)。当用户关闭开关时,弹出窗口再次启动(这不是我想要的)。

我尝试创建一些方法来简单地关闭开关而不按下它。当我这样做时,弹出窗口仍然会启动。我一直在尝试制作一些条件语句,这些语句仅在开关的先前状态处于非活动状态时才启动弹出窗口。我对这种方法有一些逻辑问题。我觉得应该有一些开关设置,只有在打开时才会启动某些东西。我通过 Kivy API 搜索了高低,但没有找到答案。我通常会为此使用一个按钮,因为它可以完全避免这个问题,但是我被要求使用一个开关而不是一个按钮,所以我需要让它以某种方式工作。

我拼凑了一个快速应用程序来演示我遇到的问题。只需将代码放入 Python 中,它应该可以正常运行。

import kivy

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.boxlayout import BoxLayout

import os

Builder.load_string("""
<MyWidget>:
    id: my_widget
    Switch
        text: "open"
        on_active: my_widget.launch()
""")


class MyWidget(BoxLayout):

    def launch(self):
        popup_content = BoxLayout()
        example_popup = Popup(
            title='Leeeeeeeeeroyy Jenkins!', content=popup_content)
        popup_content.add_widget(Button(text='cancel', size_hint=(
            None, None), size=(400, 100), on_release=example_popup.dismiss))
        example_popup.open()


class MyApp(App):

    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()

当您运行代码时,切换开关会出现一个弹出窗口。这就是我要的。点击取消按钮,弹出窗口将关闭。您会注意到开关处于打开位置。这就是我要的。当您切换活动开关时,我希望它只是变为非活动状态,但您会注意到它会再次启动弹出窗口。

非常感谢任何帮助!

【问题讨论】:

    标签: python popup widget kivy


    【解决方案1】:

    您可以在on_active: 规则中检查Switchactive 属性,如果activeTrue,则仅创建Popup

    from kivy.app import App
    from kivy.uix.button import Button
    from kivy.lang import Builder
    from kivy.uix.popup import Popup
    from kivy.uix.boxlayout import BoxLayout
    
    Builder.load_string("""
    <MyWidget>:
        id: my_widget
        Switch
            text: "open"
            on_active: if self.active: my_widget.launch()
    """)
    
    
    class MyWidget(BoxLayout):
    
        def launch(self):
            popup_content = BoxLayout()
            example_popup = Popup(
                title='Leeeeeeeeeroyy Jenkins!', content=popup_content)
            popup_content.add_widget(Button(text='cancel', size_hint=(
                None, None), size=(400, 100), on_release=example_popup.dismiss))
            example_popup.open()
    
    
    class MyApp(App):
    
        def build(self):
            return MyWidget()
    
    if __name__ == '__main__':
        MyApp().run()
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多