【问题标题】:Popup auto dismissal弹出自动关闭
【发布时间】:2019-05-13 12:55:17
【问题描述】:

环境:

我有一个主屏幕和两个弹出窗口。单击主屏幕上的按钮时,将弹出第一个弹出窗口。选择第一个弹出窗口中的选项并按下该弹出窗口的按钮应该关闭第一个弹出窗口并打开第二个弹出窗口。到此为止。

multiple_popup.py

import kivy
kivy.require('1.11.0')
import os
os.environ['KIVY_GL_BACKEND'] = 'gl'
import time
from kivy.app import App
from kivy.core.text import LabelBase
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock

class MainScreen(BoxLayout):
    
    sw_switch = 'none'  
    
    def process_1(self):

        print("The process will be running here")
        time.sleep(5)
        self.sw_switch = 'over' 
    
    
    def setName(self,*args):
        FirstPopup().open() 
        
        
    def setName1(self,*args):
        self.sw_switch = 'true1' 
        SecondPopup().open()    
        
#------------------------------------
class FirstPopup(Popup):
    
    def popup1_but(self):
        self.dismiss()
        
class SecondPopup(Popup):
    
    def popup2_but(self):
        self.dismiss()
    pass
#------------------------------------

class MultPopApp(App):
    def build(self):
        Clock.schedule_interval(lambda dt: self.update_time(), 1)
        return MainScreen()
    
    def update_time(self):
        if self.root.sw_switch == 'true':
            self.root.process_1()
            
        if self.root.sw_switch == 'over':
            x = SecondPopup()
            x.popup2_but()
            self.root.sw_switch = 'none'

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

multpop.kv

#: kivy 1.11.0

<MainScreen>:
    orientation: 'vertical'
    Button:
        text: 'Options'
        on_release: root.setName(*args)

<FirstPopup>:
    title: 'Options Window'
    size_hint: None, None
    size: 400,370
    BoxLayout:
        orientation : 'vertical'
        Label:  
            text : "Checkbox options listed here"
        Button:
            text: "OK"
            on_press: 
                app.root.setName1(*args)
                app.root.sw_switch = 'true'
                root.popup1_but()
                        

<SecondPopup>:
    title: 'Please wait..'
    size_hint: None, None
    size: 400,370
    BoxLayout:
        orientation : 'vertical'
        size_hint: 1.0,1.0
        
        Label:  
            text : "Process Initiated"
            size_hint: 1.0, 1.0

现在我需要第二个弹出窗口在与第二个弹出窗口一起启动的后台功能后自动关闭。这段代码中的解决方案是我在尝试了其他一些东西后得出的。非常感谢任何指导。谢谢。

python和kivy文件都贴出来了

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    第一个弹出窗口 - auto_dismiss: False

    默认情况下,auto_dismiss 设置为 True,即在弹出窗口之外的任何点击都会关闭/关闭它。如果不想这样,可以将auto_dismiss 设置为False

    片段 - kv

    <FirstPopup>:
        title: 'Options Window'
        auto_dismiss: False
    

    第二个弹出窗口 - auto_dismiss: True

    现在我需要第二个弹出窗口在背景后自动关闭 函数与第二个 pop 一起启动。

    解决方案

    为了能够访问第二个 Popup 小部件,请执行以下操作

    • 添加导入语句,from kivy.properties import ObjectProperty
    • 声明一个类属性,popup2,类型为ObjectProperty,并初始化为None
    • SecondPopup() 的实例化分配给self.popup2
    • 使用self.popup2.open()打开弹出窗口
    • 您可以使用self.popup2.dismiss() 自动关闭SecondPopup()。在后台功能启动、完成或使用Clock 安排回调时使用此选项。

    片段 - py

    from kivy.properties import ObjectProperty
    
    
    class MainScreen(BoxLayout):
        popup2 = ObjectProperty(None)
    
        ...
    
        def setName1(self, *args):
            self.sw_switch = 'true1'
            self.popup2 = SecondPopup()
            self.popup2.open()
            Clock.schedule_once(lambda dt: self.dismiss_popup2(), 5)
    
        def dismiss_popup2(self):
            print(f"\ndismiss_popup2: SecondPopup dismissed")
            self.popup2.dismiss()
    

    注意 » Kivy App - Avoid sleep() or infinite loops

    在 Kivy 应用程序中,您必须避免长/无限循环或 睡觉。

    while True:
        animate_something()
        time.sleep(.10)
    

    当你运行它时,程序永远不会退出你的循环,防止 Kivy 从做所有其他需要做的事情。因此, 您将看到的只是一个无法交互的黑色窗口 和。相反,您需要“安排”您的 animate_something() 要重复调用的函数。

    【讨论】:

    • 那是完美的。非常感谢。我已经通过这些对象属性仍然无法在我的代码中实现它。现在它就像魅力一样起作用,我更好地理解了 kivy 属性的工作原理。该程序实际上是控制一些继电器和硬件,大约需要 5 秒才能完成,因此在我的示例代码中我使用了睡眠功能。但是,是的,关于长循环的评论已被注意到。谢谢。
    • 您可能希望将sleep(5)self.sw_switch = 'over' 替换为Clock.schedule_once(lambda dt: self.set_sw_switch(), 5) 和实现方法def set_sw_switch(self): \ self.sw_switch = 'over'
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2018-02-13
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多