Как сделать многопоточность в программе?

Рейтинг: 0Ответов: 0Опубликовано: 21.05.2023

В приложении есть загрузочный экран:

class SplashScreen(FloatLayout):
    def __init__(self, **kwargs):
        super(SplashScreen, self).__init__(**kwargs)
        self.background = Image(source='image/Loading.png', allow_stretch=True)
        self.add_widget(self.background)

        # Используем Clock.schedule_once для вызова функции go_to_main после 2 секунд
        Clock.schedule_once(self.go_to_main, 2)

    def go_to_main(self, dt):
        app = App.get_running_app()
        app.root.clear_widgets()
        app.root.add_widget(FinanceApp())

Также присутствует "другой экран":

class CalendarScreen(FloatLayout):
    def __init__(self, **kwargs):
        super(CalendarScreen, self).__init__(**kwargs)

        self.background = Image(source='image/***.jpg', allow_stretch=True)
        self.background.size_hint = (1, 1)
        self.add_widget(self.background)

        self.open_table()

        button = Button(
            text="Назад",
            size_hint=(None, None),
            size=('100dp', '40dp'),
            pos_hint={'x': 0, 'y': 0},
            pos=(0, 0)
        )
        button.bind(on_release=self.go_to_start)
        self.add_widget(button)

    def open_table(self):
        calendar_table = CalendarTable(data=self.get_news_data())
        self.add_widget(calendar_table)

    def get_news_data(self):
       ***

    def go_to_start(self, instance):
        app = App.get_running_app()
        app.root.clear_widgets()
        app.root.add_widget(FinanceApp())

Нужно, чтобы функция get_news_data выполнялась во время загрузочного экрана, чтобы избежать задержки при выполнении этой функции

Изменённый SplashScreen:

    def __init__(self, **kwargs):
        super(SplashScreen, self).__init__(**kwargs)
        self.background = Image(source='image/Loading.png', allow_stretch=True)
        self.add_widget(self.background)

        # Используем Clock.schedule_once для вызова функции load_table_data после 2 секунд
        Clock.schedule_once(self.load_table_data, 2)

    def load_table_data(self, dt):
        app = App.get_running_app()
        finance_app = FinanceApp()
        threading.Thread(target=self.load_data, args=(finance_app,)).start()
        app.root.clear_widgets()
        app.root.add_widget(finance_app)

    def load_data(self, finance_app):
        data = self.get_table_data()
        finance_app.open_table_with_data(data)
    def get_table_data(self):
    ***
    # Здесь происходит загрузка данных

Изменённый CalendarScreen:

class CalendarScreen(FloatLayout):
    def __init__(self, **kwargs):
        super(CalendarScreen, self).__init__(**kwargs)
        self.background = Image(source='image/bitkoin.jpg', allow_stretch=True)
        self.background.size_hint = (1, 1)
        self.add_widget(self.background)

        self.open_table()

        button = Button(
            text="Назад",
            size_hint=(None, None),
            size=('100dp', '40dp'),
            pos_hint={'x': 0, 'y': 0},
            pos=(0, 0)
        )
        button.bind(on_release=self.go_to_start)
        self.add_widget(button)

    def open_table(self):
        calendar_table = CalendarTable()
        threading.Thread(target=self.load_data, args=(calendar_table,)).start()
        self.add_widget(calendar_table)

    def load_data(self, calendar_table):
        data = self.get_table_data()
        self.update_table_data(data, calendar_table)

    def update_table_data(self, data, calendar_table):
        calendar_table.update_data(data)
    def get_news_data(self):
    ***
    #Здесь происходит загрузка данных 
  
    def go_to_start(self, instance):
        app = App.get_running_app()
        app.root.clear_widgets()
        app.root.add_widget(FinanceApp())

Ответы

Ответов пока нет.