弹出式自动解雇

时间:2019-05-13 12:55:17

标签: python kivy

环境:

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

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文件

1 个答案:

答案 0 :(得分:0)

第一个弹出窗口-auto_dismiss: False

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

摘要-kv

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

第二个弹出窗口-auto_dismiss: True

  

现在,我需要第二个弹出窗口来在背景后自动关闭   功能在第二个弹出窗口旁边启动。

解决方案

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

  • 添加导入语句from kivy.properties import ObjectProperty
  • 声明类型为ObjectProperty的类popup2并初始化为None
  • SecondPopup()的实例化分配给self.popup2
  • 使用self.popup2.open()
  • 打开弹出窗口
  • 您可以使用SecondPopup()自动关闭self.popup2.dismiss()。在启动,完成后台功能或使用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)
     

运行此命令时,程序将永远不会退出循环,从而防止   完成所有需要做的其他事情的奇异果。结果是,   您会看到一个黑色的窗口,您将无法进行交互   用。相反,您需要“安排”您的animate_something()   函数被反复调用。