Всплывающее окно автозаполнения - PullRequest
0 голосов
/ 13 мая 2019

Среда:

У меня есть главный экран и два всплывающих окна.При нажатии кнопки на главном экране появится всплывающее окно.Выбор параметров в первом всплывающем окне и нажатие кнопки этого всплывающего окна должны закрыть первое всплывающее окно и открыть второе всплывающее окно.До здесь достигнута.

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 голосов
/ 13 мая 2019

Первое всплывающее окно - auto_dismiss: False

По умолчанию для auto_dismiss установлено значение True, т. Е. Любой щелчок вне всплывающего окна будет отклонять / закрывать его. Если вы этого не хотите, вы можете установить auto_dismiss на False.

Сниппетс - кв

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

Второе всплывающее окно - auto_dismiss: True

Теперь мне нужно это второе всплывающее окно для автоматического закрытия после фона Функция запускается вместе с этим вторым поп.

Решение

Чтобы получить доступ ко второму всплывающему виджету, выполните следующие действия:

  • Добавить оператор импорта, from kivy.properties import ObjectProperty
  • Объявить атрибут класса, popup2 типа ObjectProperty и инициализироваться None
  • Назначьте экземпляр SecondPopup() на self.popup2
  • Открыть всплывающее окно, используя self.popup2.open()
  • Вы можете автоматически отклонить SecondPopup(), используя self.popup2.dismiss(). Используйте это либо когда фоновая функция инициирована, завершена, либо используйте Часы , чтобы запланировать обратный вызов.

Snippets - 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 - Избегайте сна () или бесконечных циклов

В приложениях Kivy вы должны избегать длинных / бесконечных циклов или спать.

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

Когда вы запустите это, программа никогда не выйдет из вашего цикла, предотвращая Kivy от выполнения всех других вещей, которые нужно делать. В следствии, все, что вы увидите, - это черное окно, с которым вы не сможете взаимодействовать с. Вместо этого вам нужно «запланировать» свой animate_something () функция должна вызываться повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...