def event_cb(e): code = e.get_code() obj = e.get_target() if code == lv.EVENT.DRAW_PART_BEGIN: dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) # Change the draw descriptor the 2nd button if dsc.id == 1: dsc.rect_dsc.radius = 0 if obj.get_selected_btn() == dsc.id: dsc.rect_dsc.bg_color = lv.palette_darken(lv.PALETTE.GREY, 3) else: dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.BLUE) dsc.rect_dsc.shadow_width = 6 dsc.rect_dsc.shadow_ofs_x = 3 dsc.rect_dsc.shadow_ofs_y = 3 dsc.label_dsc.color = lv.color_white() # Change the draw descriptor the 3rd button elif dsc.id == 2: dsc.rect_dsc.radius = lv.RADIUS.CIRCLE if obj.get_selected_btn() == dsc.id: dsc.rect_dsc.bg_color = lv.palette_darken(lv.PALETTE.RED, 3) else: dsc.rect_dsc.bg_color = lv.palette_main(lv.PALETTE.RED) dsc.label_dsc.color = lv.color_white() elif dsc.id == 3: dsc.label_dsc.opa = lv.OPA.TRANSP # Hide the text if any if code == lv.EVENT.DRAW_PART_END: dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param()) # Add custom content to the 4th button when the button itself was drawn if dsc.id == 3: # LV_IMG_DECLARE(img_star); header = lv.img_header_t() res = lv.img.decoder_get_info(img_star_argb, header) if res != lv.RES.OK: print("error when getting image header") return else: a = lv.area_t() a.x1 = dsc.draw_area.x1 + (dsc.draw_area.get_width() - header.w) // 2 a.x2 = a.x1 + header.w - 1 a.y1 = dsc.draw_area.y1 + (dsc.draw_area.get_height() - header.h) // 2 a.y2 = a.y1 + header.h - 1 img_draw_dsc = lv.draw_img_dsc_t() img_draw_dsc.init() img_draw_dsc.recolor = lv.color_black() if obj.get_selected_btn() == dsc.id: img_draw_dsc.recolor_opa = lv.OPA._30 lv.draw_img(a, dsc.clip_area, img_star_argb, img_draw_dsc)
def __init__(self): super().__init__() # Initialize the styles self.style_btn = lv.style_t() self.style_btn.init() self.style_btn.set_bg_color(lv.palette_main(lv.PALETTE.GREEN)) self.style_btn.set_border_color(lv.palette_darken(lv.PALETTE.GREEN, 3)) self.style_btn.set_border_width(3) # This theme is based on active theme th_act = lv.theme_get_from_obj(lv.scr_act()) # This theme will be applied only after base theme is applied self.set_parent(th_act)
chart.set_range(lv.chart.AXIS.SECONDARY_Y, 0, 400) chart.set_point_count(12) chart.add_event_cb(draw_event_cb, lv.EVENT.DRAW_PART_BEGIN, None) # Add ticks and label to every axis chart.set_axis_tick(lv.chart.AXIS.PRIMARY_X, 10, 5, 12, 3, True, 40) chart.set_axis_tick(lv.chart.AXIS.PRIMARY_Y, 10, 5, 6, 2, True, 50) chart.set_axis_tick(lv.chart.AXIS.SECONDARY_Y, 10, 5, 3, 4, True, 50) # Zoom in a little in X chart.set_zoom_x(800) # Add two data series ser1 = lv.chart.add_series(chart, lv.palette_lighten(lv.PALETTE.GREEN, 2), lv.chart.AXIS.PRIMARY_Y) ser2 = lv.chart.add_series(chart, lv.palette_darken(lv.PALETTE.GREEN, 2), lv.chart.AXIS.SECONDARY_Y) # Set the next points on 'ser1' chart.set_next_value(ser1, 31) chart.set_next_value(ser1, 66) chart.set_next_value(ser1, 10) chart.set_next_value(ser1, 89) chart.set_next_value(ser1, 63) chart.set_next_value(ser1, 56) chart.set_next_value(ser1, 32) chart.set_next_value(ser1, 35) chart.set_next_value(ser1, 57) chart.set_next_value(ser1, 85) chart.set_next_value(ser1, 22) chart.set_next_value(ser1, 58)
#!/opt/bin/lv_micropython -i import lvgl as lv import display_driver bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) qr = lv.qrcode(lv.scr_act(), 150, fg_color, bg_color) # Set data data = "https://lvgl.io" qr.update(data, len(data)) qr.center() # Add a border with bg_color qr.set_style_border_color(bg_color, 0) qr.set_style_border_width(5, 0)
# Create a transition the animate the some properties on state change props = [lv.STYLE.BG_OPA, lv.STYLE.WIDTH, 0] trans = lv.style_transition_dsc_t() trans.init(props, lv.anim_t.path_linear, 200, 0, None) # Create a style for the scrollbars style = lv.style_t() style.init() style.set_width(4) # Width of the scrollbar style.set_pad_right(5) # Space from the parallel side style.set_pad_top(5) # Space from the perpendicular side style.set_radius(2) style.set_bg_opa(lv.OPA._70) style.set_bg_color(lv.palette_main(lv.PALETTE.BLUE)) style.set_border_color(lv.palette_darken(lv.PALETTE.BLUE, 3)) style.set_border_width(2) style.set_shadow_width(8) style.set_shadow_spread(2) style.set_shadow_color(lv.palette_darken(lv.PALETTE.BLUE, 1)) style.set_transition(trans) # Make the scrollbars wider and use 100% opacity when scrolled style_scrolled = lv.style_t() style_scrolled.init() style_scrolled.set_width(8) style_scrolled.set_bg_opa(lv.OPA.COVER) obj.add_style(style, lv.PART.SCROLLBAR) obj.add_style(style_scrolled, lv.PART.SCROLLBAR | lv.STATE.SCROLLED)
style_btn.set_border_color(lv.color_white()) style_btn.set_border_opa(lv.OPA._70) style_btn.set_border_width(2) # Set the text style style_btn.set_text_color(lv.color_white()) # Create a red style. Change only some colors. style_btn_red.init() style_btn_red.set_bg_color(lv.palette_main(lv.PALETTE.RED)) style_btn_red.set_bg_grad_color(lv.palette_lighten(lv.PALETTE.RED, 2)) # Create a style for the pressed state. style_btn_pressed.init() style_btn_pressed.set_bg_color(lv.palette_main(lv.PALETTE.BLUE)) style_btn_pressed.set_bg_grad_color(lv.palette_darken(lv.PALETTE.RED, 3)) # Create a button and use the new styles btn = lv.btn(lv.scr_act()) # Add a button the current screen # Remove the styles coming from the theme # Note that size and position are also stored as style properties # so lv_obj_remove_style_all will remove the set size and position too btn.remove_style_all() # Remove the styles coming from the theme btn.set_pos(10, 10) # Set its position btn.set_size(120, 50) # Set its size btn.add_style(style_btn, 0) btn.add_style(style_btn_pressed, lv.STATE.PRESSED) label = lv.label(btn) # Add a label to the button label.set_text("Button") # Set the labels text label.center()
def scroll_begin_event(e): #Disable the scroll animations. Triggered when a tab button is clicked */ if e.get_code() == lv.EVENT.SCROLL_BEGIN: a = lv.anim_t.__cast__(e.get_param()) if a: a.time = 0 # Create a Tab view object tabview = lv.tabview(lv.scr_act(), lv.DIR.LEFT, 80) tabview.get_content().add_event_cb(scroll_begin_event, lv.EVENT.SCROLL_BEGIN, None) tabview.set_style_bg_color(lv.palette_lighten(lv.PALETTE.RED, 2), 0) tab_btns = tabview.get_tab_btns() tab_btns.set_style_bg_color(lv.palette_darken(lv.PALETTE.GREY, 3), 0) tab_btns.set_style_text_color(lv.palette_lighten(lv.PALETTE.GREY, 5), 0) tab_btns.set_style_border_side(lv.BORDER_SIDE.RIGHT, lv.PART.ITEMS | lv.STATE.CHECKED) # Add 3 tabs (the tabs are page (lv_page) and can be scrolled tab1 = tabview.add_tab("Tab 1") tab2 = tabview.add_tab("Tab 2") tab3 = tabview.add_tab("Tab 3") tab4 = tabview.add_tab("Tab 4") tab5 = tabview.add_tab("Tab 5") tab2.set_style_bg_color(lv.palette_lighten(lv.PALETTE.AMBER, 3), 0) tab2.set_style_bg_opa(lv.OPA.COVER, 0) # Add content to the tabs
# A default transition # Make it fast (100ms) and start with some delay (200 ms) trans_def = lv.style_transition_dsc_t() trans_def.init(props, lv.anim_t.path_linear, 100, 200, None) # A special transition when going to pressed state # Make it slow (500 ms) but start without delay trans_pr = lv.style_transition_dsc_t() trans_pr.init(props, lv.anim_t.path_linear, 500, 0, None) style_def = lv.style_t() style_def.init() style_def.set_transition(trans_def) style_pr = lv.style_t() style_pr.init() style_pr.set_bg_color(lv.palette_main(lv.PALETTE.RED)) style_pr.set_border_width(6) style_pr.set_border_color(lv.palette_darken(lv.PALETTE.RED, 3)) style_pr.set_transition(trans_pr) # Create an object with the new style_pr obj = lv.obj(lv.scr_act()) obj.add_style(style_def, 0) obj.add_style(style_pr, lv.STATE.PRESSED) obj.center()
#!//opt/bin/lv_micropython -i import time import lvgl as lv import display_driver # # Using multiple styles # # A base style style_base = lv.style_t() style_base.init() style_base.set_bg_color(lv.palette_main(lv.PALETTE.LIGHT_BLUE)) style_base.set_border_color(lv.palette_darken(lv.PALETTE.LIGHT_BLUE, 3)) style_base.set_border_width(2) style_base.set_radius(10) style_base.set_shadow_width(10) style_base.set_shadow_ofs_y(5) style_base.set_shadow_opa(lv.OPA._50) style_base.set_text_color(lv.color_white()) style_base.set_width(100) style_base.set_height(lv.SIZE.CONTENT) # Set only the properties that should be different style_warning = lv.style_t() style_warning.init() style_warning.set_bg_color(lv.palette_main(lv.PALETTE.YELLOW)) style_warning.set_border_color(lv.palette_darken(lv.PALETTE.YELLOW, 3)) style_warning.set_text_color(lv.palette_darken(lv.PALETTE.YELLOW, 4)) # Create an object with the base style only
display_driver.getdisplay_landscape() # # Style a button from scratch # # Init the style for the default state style = lv.style_t() style.init() style.set_radius(3) style.set_bg_opa(lv.OPA.COVER) style.set_bg_color(lv.palette_main(lv.PALETTE.BLUE)) style.set_bg_grad_color(lv.palette_darken(lv.PALETTE.BLUE, 2)) style.set_bg_grad_dir(lv.GRAD_DIR.VER) style.set_border_opa(lv.OPA._40) style.set_border_width(2) style.set_border_color(lv.palette_main(lv.PALETTE.GREY)) style.set_shadow_width(8) style.set_shadow_color(lv.palette_main(lv.PALETTE.GREY)) style.set_shadow_ofs_y(8) style.set_outline_opa(lv.OPA.COVER) style.set_outline_color(lv.palette_main(lv.PALETTE.BLUE)) style.set_text_color(lv.color_white()) style.set_pad_all(10)
style_main.init() style_main.set_bg_opa(lv.OPA.COVER) style_main.set_bg_color(lv.color_hex3(0xbbb)) style_main.set_radius(lv.RADIUS.CIRCLE) style_main.set_pad_ver(-2) # Makes the indicator larger style_indicator.init() style_indicator.set_bg_opa(lv.OPA.COVER) style_indicator.set_bg_color(lv.palette_main(lv.PALETTE.CYAN)) style_indicator.set_radius(lv.RADIUS.CIRCLE) style_indicator.set_transition(transition_dsc) style_knob.init() style_knob.set_bg_opa(lv.OPA.COVER) style_knob.set_bg_color(lv.palette_main(lv.PALETTE.CYAN)) style_knob.set_border_color(lv.palette_darken(lv.PALETTE.CYAN, 3)) style_knob.set_border_width(2) style_knob.set_radius(lv.RADIUS.CIRCLE) style_knob.set_pad_all(6) # Makes the knob larger style_knob.set_transition(transition_dsc) style_pressed_color.init() style_pressed_color.set_bg_color(lv.palette_darken(lv.PALETTE.CYAN, 2)) # Create a slider and add the style slider = lv.slider(lv.scr_act()) slider.remove_style_all() # Remove the styles coming from the theme slider.add_style(style_main, lv.PART.MAIN) slider.add_style(style_indicator, lv.PART.INDICATOR) slider.add_style(style_pressed_color, lv.PART.INDICATOR | lv.STATE.PRESSED)