Kivy Popup Появляется после запуска функции, а не до - PullRequest
0 голосов
/ 10 марта 2020

Я хочу отобразить всплывающее окно или модальное сообщение, которое говорит что-то вроде «пожалуйста, будьте терпеливы во время обработки», пока приложение выполняет функцию в фоновом режиме. Однако всплывающее окно появляется после того, как фоновая функция уже произошла. Ниже приведен пример кода, который создает эту проблему.

import os
import time

from kivy.app import App
from kivy.uix.modalview import ModalView
from kivy.uix.popup import Popup
from kivy.uix.button import Button, Label


class Poppy(Popup):
    def __init__(self, **kwargs):
        super(Poppy, self).__init__(**kwargs)
        self.content = Label(text='working')
        self.open()
        print("Working...")

class TApp(App):
    def build(self):
        return Button(text="Click to run", on_press=self.modal_test)

    def modal_test(self, event):
        p = Poppy(size_hint=(0.5, 0.5))
        self.printer()

    def printer(self):
        print('Popup works')
        time.sleep(5)

TApp().run()

1 Ответ

0 голосов
/ 10 марта 2020

Не следует выполнять трудоемкую задачу в том же потоке GUI, так как он блокирует событие l oop, из-за которого GUI не работает правильно. В этих случаях вы должны запустить его в новом потоке.

import threading
# ...
class TApp(App):
    def build(self):
        return Button(text="Click to run", on_press=self.modal_test)

    def modal_test(self, event):
        p = Poppy(size_hint=(0.5, 0.5))
        threading.Thread(target=self.printer, daemon=True).start()

    def printer(self):
        print('before: Popup works')
        time.sleep(5)
        print('after: Popup works')
# ...

Желательно также проверить Работа с Python потоками внутри приложения Kivy

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