Как сделать многопоточность в программе?
В приложении есть загрузочный экран:
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())
Источник: Stack Overflow на русском