You've already forked MicroPythonOS
mirror of
https://github.com/m5stack/MicroPythonOS.git
synced 2026-05-20 11:51:27 -07:00
appstore: don't use class
This fixes the premature closes due to race condition.
This commit is contained in:
@@ -3,6 +3,12 @@ import json
|
||||
import urequests
|
||||
import gc
|
||||
|
||||
apps = []
|
||||
app_detail_screen = None
|
||||
install_button = None
|
||||
please_wait_label = None
|
||||
app_detail_screen = None
|
||||
|
||||
class App:
|
||||
def __init__(self, name, publisher, short_description, long_description, icon_url):
|
||||
self.name = name
|
||||
@@ -11,119 +17,120 @@ class App:
|
||||
self.long_description = long_description
|
||||
self.icon_url = icon_url
|
||||
|
||||
class AppStore:
|
||||
def __init__(self, subwindow, json_url):
|
||||
print("__init__")
|
||||
self.subwindow = subwindow
|
||||
self.json_url = json_url
|
||||
self.apps = []
|
||||
self.app_detail_screen = None
|
||||
self.install_button = None
|
||||
print("__init__")
|
||||
self.main_screen_init()
|
||||
def main_screen_init(self):
|
||||
self.please_wait_label = lv.label(self.subwindow)
|
||||
self.please_wait_label.set_text("Please wait...")
|
||||
self.please_wait_label.center()
|
||||
self.download_apps()
|
||||
def download_apps(self):
|
||||
try:
|
||||
response = urequests.get(self.json_url, timeout=10)
|
||||
print("download_apps")
|
||||
if response.status_code == 200:
|
||||
print(f"Got response text: {response.text}")
|
||||
self.apps = [App(**app) for app in json.loads(response.text)]
|
||||
response.close()
|
||||
self.please_wait_label.add_flag(lv.obj.FLAG.HIDDEN)
|
||||
self.create_apps_list()
|
||||
except Exception as e:
|
||||
print("Download failed:", e)
|
||||
def create_apps_list(self):
|
||||
print("create_apps_list")
|
||||
self.apps_list = lv.list(self.subwindow)
|
||||
self.apps_list.set_size(lv.pct(100), lv.pct(100))
|
||||
print("create_apps_list iterating")
|
||||
for app in self.apps:
|
||||
item = self.apps_list.add_button(None, "Test")
|
||||
item.add_flag(lv.obj.FLAG.CLICKABLE)
|
||||
item.add_event_cb(lambda e, a=app: self.show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
cont = lv.obj(item)
|
||||
cont.set_flex_flow(lv.FLEX_FLOW.ROW)
|
||||
cont.set_size(lv.pct(100), lv.SIZE_CONTENT)
|
||||
cont.add_event_cb(lambda e, a=app: self.show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
icon_spacer = lv.obj(cont)
|
||||
icon_spacer.set_size(40, 40)
|
||||
icon_spacer.add_event_cb(lambda e, a=app: self.show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
label_cont = lv.obj(cont)
|
||||
label_cont.set_flex_flow(lv.FLEX_FLOW.COLUMN)
|
||||
label_cont.set_size(lv.pct(100), lv.SIZE_CONTENT)
|
||||
label_cont.add_event_cb(lambda e, a=app: self.show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
name_label = lv.label(label_cont)
|
||||
name_label.set_text(app.name)
|
||||
name_label.set_style_text_font(lv.font_montserrat_16, 0)
|
||||
name_label.add_event_cb(lambda e, a=app: self.show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
desc_label = lv.label(label_cont)
|
||||
desc_label.set_text(app.short_description)
|
||||
desc_label.set_style_text_font(lv.font_montserrat_12, 0)
|
||||
desc_label.add_event_cb(lambda e, a=app: self.show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
print("create_apps_list app one done")
|
||||
print("create_apps_list app done")
|
||||
def show_app_detail(self, app):
|
||||
self.app_detail_screen = lv.obj()
|
||||
self.app_detail_screen.set_size(lv.pct(100), lv.pct(100))
|
||||
back_button = lv.button(self.app_detail_screen)
|
||||
back_button.set_size(30, 30)
|
||||
back_button.add_flag(lv.obj.FLAG.CLICKABLE)
|
||||
back_button.add_event_cb(self.back_to_main, lv.EVENT.CLICKED, None)
|
||||
back_label = lv.label(back_button)
|
||||
back_label.set_text(lv.SYMBOL.LEFT)
|
||||
back_label.center()
|
||||
cont = lv.obj(self.app_detail_screen)
|
||||
cont.set_size(lv.pct(100), lv.pct(100))
|
||||
cont.set_pos(0, 40)
|
||||
|
||||
def download_apps(json_url):
|
||||
global apps
|
||||
try:
|
||||
response = urequests.get(json_url, timeout=10)
|
||||
print("download_apps")
|
||||
if response.status_code == 200:
|
||||
print(f"Got response text: {response.text}")
|
||||
apps = [App(**app) for app in json.loads(response.text)]
|
||||
response.close()
|
||||
please_wait_label.add_flag(lv.obj.FLAG.HIDDEN)
|
||||
create_apps_list()
|
||||
except Exception as e:
|
||||
print("Download failed:", e)
|
||||
|
||||
|
||||
def create_apps_list():
|
||||
global apps
|
||||
print("create_apps_list")
|
||||
apps_list = lv.list(subwindow)
|
||||
apps_list.set_size(lv.pct(100), lv.pct(100))
|
||||
print("create_apps_list iterating")
|
||||
for app in apps:
|
||||
item = apps_list.add_button(None, "Test")
|
||||
item.add_flag(lv.obj.FLAG.CLICKABLE)
|
||||
item.add_event_cb(lambda e, a=app: show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
cont = lv.obj(item)
|
||||
cont.set_flex_flow(lv.FLEX_FLOW.ROW)
|
||||
cont.set_size(lv.pct(100), lv.SIZE_CONTENT)
|
||||
cont.add_event_cb(lambda e, a=app: show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
icon_spacer = lv.obj(cont)
|
||||
icon_spacer.set_size(60, 60)
|
||||
detail_cont = lv.obj(cont)
|
||||
detail_cont.set_flex_flow(lv.FLEX_FLOW.COLUMN)
|
||||
detail_cont.set_size(lv.pct(100), lv.SIZE_CONTENT)
|
||||
name_label = lv.label(detail_cont)
|
||||
icon_spacer.set_size(40, 40)
|
||||
icon_spacer.add_event_cb(lambda e, a=app: show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
label_cont = lv.obj(cont)
|
||||
label_cont.set_flex_flow(lv.FLEX_FLOW.COLUMN)
|
||||
label_cont.set_size(lv.pct(100), lv.SIZE_CONTENT)
|
||||
label_cont.add_event_cb(lambda e, a=app: show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
name_label = lv.label(label_cont)
|
||||
name_label.set_text(app.name)
|
||||
name_label.set_style_text_font(lv.font_montserrat_24, 0)
|
||||
publisher_label = lv.label(detail_cont)
|
||||
publisher_label.set_text(app.publisher)
|
||||
publisher_label.set_style_text_font(lv.font_montserrat_16, 0)
|
||||
self.install_button = lv.button(detail_cont)
|
||||
self.install_button.set_size(lv.pct(100), 40)
|
||||
self.install_button.add_flag(lv.obj.FLAG.CLICKABLE)
|
||||
self.install_button.add_event_cb(self.toggle_install, lv.EVENT.CLICKED, None)
|
||||
install_label = lv.label(self.install_button)
|
||||
install_label.set_text("Install")
|
||||
install_label.center()
|
||||
long_desc_label = lv.label(detail_cont)
|
||||
long_desc_label.set_text(app.long_description)
|
||||
long_desc_label.set_style_text_font(lv.font_montserrat_12, 0)
|
||||
long_desc_label.set_width(lv.pct(100))
|
||||
lv.screen_load(self.app_detail_screen)
|
||||
def toggle_install(self, event):
|
||||
label = self.install_button.get_child(0)
|
||||
if label.get_text() == "Install":
|
||||
label.set_text("Cancel")
|
||||
else:
|
||||
label.set_text("Install")
|
||||
def back_to_main(self, event):
|
||||
if self.app_detail_screen:
|
||||
#self.app_detail_screen.delete()
|
||||
#self.app_detail_screen = None
|
||||
lv.screen_load(appscreen)
|
||||
name_label.set_style_text_font(lv.font_montserrat_16, 0)
|
||||
name_label.add_event_cb(lambda e, a=app: show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
desc_label = lv.label(label_cont)
|
||||
desc_label.set_text(app.short_description)
|
||||
desc_label.set_style_text_font(lv.font_montserrat_12, 0)
|
||||
desc_label.add_event_cb(lambda e, a=app: show_app_detail(a), lv.EVENT.CLICKED, None)
|
||||
print("create_apps_list app one done")
|
||||
print("create_apps_list app done")
|
||||
|
||||
|
||||
# Example usage:
|
||||
app_store = AppStore(subwindow, "http://demo.lnpiggy.com:2121/apps.json")
|
||||
def show_app_detail(app):
|
||||
global app_detail_screen, install_button
|
||||
app_detail_screen = lv.obj()
|
||||
app_detail_screen.set_size(lv.pct(100), lv.pct(100))
|
||||
back_button = lv.button(app_detail_screen)
|
||||
back_button.set_size(30, 30)
|
||||
back_button.add_flag(lv.obj.FLAG.CLICKABLE)
|
||||
back_button.add_event_cb(back_to_main, lv.EVENT.CLICKED, None)
|
||||
back_label = lv.label(back_button)
|
||||
back_label.set_text(lv.SYMBOL.LEFT)
|
||||
back_label.center()
|
||||
cont = lv.obj(app_detail_screen)
|
||||
cont.set_size(lv.pct(100), lv.pct(100))
|
||||
cont.set_pos(0, 40)
|
||||
cont.set_flex_flow(lv.FLEX_FLOW.ROW)
|
||||
icon_spacer = lv.obj(cont)
|
||||
icon_spacer.set_size(60, 60)
|
||||
detail_cont = lv.obj(cont)
|
||||
detail_cont.set_flex_flow(lv.FLEX_FLOW.COLUMN)
|
||||
detail_cont.set_size(lv.pct(100), lv.SIZE_CONTENT)
|
||||
name_label = lv.label(detail_cont)
|
||||
name_label.set_text(app.name)
|
||||
name_label.set_style_text_font(lv.font_montserrat_24, 0)
|
||||
publisher_label = lv.label(detail_cont)
|
||||
publisher_label.set_text(app.publisher)
|
||||
publisher_label.set_style_text_font(lv.font_montserrat_16, 0)
|
||||
install_button = lv.button(detail_cont)
|
||||
install_button.set_size(lv.pct(100), 40)
|
||||
install_button.add_flag(lv.obj.FLAG.CLICKABLE)
|
||||
install_button.add_event_cb(toggle_install, lv.EVENT.CLICKED, None)
|
||||
install_label = lv.label(install_button)
|
||||
install_label.set_text("Install")
|
||||
install_label.center()
|
||||
long_desc_label = lv.label(detail_cont)
|
||||
long_desc_label.set_text(app.long_description)
|
||||
long_desc_label.set_style_text_font(lv.font_montserrat_12, 0)
|
||||
long_desc_label.set_width(lv.pct(100))
|
||||
lv.screen_load(app_detail_screen)
|
||||
|
||||
|
||||
def toggle_install(event):
|
||||
global install_button
|
||||
label = install_button.get_child(0)
|
||||
if label.get_text() == "Install":
|
||||
label.set_text("Cancel")
|
||||
else:
|
||||
label.set_text("Install")
|
||||
|
||||
|
||||
def back_to_main(event):
|
||||
if app_detail_screen:
|
||||
app_detail_screen.delete()
|
||||
app_detail_screen = None
|
||||
lv.screen_load(appscreen)
|
||||
|
||||
|
||||
print("appstore.py starting")
|
||||
please_wait_label = lv.label(subwindow)
|
||||
please_wait_label.set_text("Please wait...")
|
||||
please_wait_label.center()
|
||||
download_apps("http://demo.lnpiggy.com:2121/apps.json")
|
||||
|
||||
# Wait until the user stops the app
|
||||
import time
|
||||
while appscreen == lv.screen_active() or app_store.app_detail_screen == lv.screen_active():
|
||||
while appscreen == lv.screen_active() or app_detail_screen == lv.screen_active():
|
||||
time.sleep_ms(100)
|
||||
|
||||
print("reached end of appstore")
|
||||
|
||||
Reference in New Issue
Block a user