Kivy: Как обновить текст метки всплывающего окна, не закрывая всплывающее окно - PullRequest
1 голос
/ 29 мая 2020

Я хочу открыть всплывающее окно и через 3 секунды изменить текст метки всплывающего окна.

Я пробую этот код:

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

Builder.load_string('''
<SimpleButton>:
    on_press: self.fire_popup()
<SimplePopup>:
    id:pop
    size_hint: .4, .4
    auto_dismiss: True
    title: 'Hello world!!'
    Label:
        id: lbl_id
        text: 'Default Text'
''')


class SimplePopup(Popup):
    pass


class SimpleButton(Button):
    text = "Fire Popup !"

    def fire_popup(self):
        pop = SimplePopup()
        pop.open()

        time.sleep(3)
        pop.ids.lbl_id.text = "Changed Text"


class SampleApp(App):
    def build(self):
        return SimpleButton()


SampleApp().run()

Но ДО открытие всплывающего окна он спит 3 секунды, измените текст метки, а затем откроется всплывающее окно !!

В чем проблема?

1 Ответ

1 голос
/ 29 мая 2020

Ваш код:

time.sleep(3)

Останавливает основной поток, поэтому с GUI ничего не произойдет, пока этот код не завершится. Вы должны запланировать изменение текста, используя Clock.schedule_once(), например:

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.popup import Popup
from kivy.lang import Builder
from kivy.uix.button import Button

Builder.load_string('''
<SimpleButton>:
    on_press: self.fire_popup()
<SimplePopup>:
    id:pop
    size_hint: .4, .4
    auto_dismiss: True
    title: 'Hello world!!'
    Label:
        id: lbl_id
        text: 'Default Text'
''')


class SimplePopup(Popup):
    pass


class SimpleButton(Button):
    text = "Fire Popup !"

    def fire_popup(self):
        self.pop = SimplePopup()
        self.pop.open()
        Clock.schedule_once(self.change_text, 3)

    def change_text(self, dt):
        self.pop.ids.lbl_id.text = "Changed Text"


class SampleApp(App):
    def build(self):
        return SimpleButton()


SampleApp().run()
...