def _set_custom_style(self): style = lv.style_t() lv.style_copy(style, self.lv_obj.get_style(lv.cont.STYLE.MAIN)) style.body.main_color = lv.color_make(0xC0, 0xC0, 0xC0) style.body.grad_color = lv.color_make(0x4F, 0x52, 0x57) style.body.radius = 0 self.lv_obj.set_style(lv.cont.STYLE.MAIN, style)
def __init__(self): scr = lv.obj() # Create style for the Arcs - Hour styleHour = lv.style_t() lv.style_copy(styleHour, lv.style_plain) styleHour.line.color = lv.color_make(119,158,203) # Arc color styleHour.line.width = 8 # Arc width # Create an Arc - Hour arcHour = lv.arc(scr) arcHour.set_style(lv.arc.STYLE.MAIN, styleHour) # Use the new style arcHour.set_angles(45, 0) arcHour.set_size(300, 300) arcHour.align(None, lv.ALIGN.CENTER, 0, 0) # Create style for the Arcs - Minute styleMin = lv.style_t() lv.style_copy(styleMin, lv.style_plain) styleMin.line.color = lv.color_make(124,252,0) # Arc color styleMin.line.width = 8 # Arc width # Create an Arc - Minute arcMin = lv.arc(scr) arcMin.set_style(lv.arc.STYLE.MAIN, styleMin) # Use the new style arcMin.set_angles(45, 0) arcMin.set_size(380, 380) arcMin.align(None, lv.ALIGN.CENTER, 0, 0) # Create style for the Arcs - Second styleSecond = lv.style_t() lv.style_copy(styleSecond, lv.style_plain) styleSecond.line.color = lv.color_make(250,128,114) # Arc color styleSecond.line.width = 8 # Arc width # Create an Arc - Minute arcSecond = lv.arc(scr) arcSecond.set_style(lv.arc.STYLE.MAIN, styleSecond) # Use the new style arcSecond.set_angles(45, 0) arcSecond.set_size(220, 220) arcSecond.align(None, lv.ALIGN.CENTER, 0, 0) def event_handler(obj, event): lv.obj_del(scr) from secondScreen import secondScreen btn1 = lv.btn(scr) btn1.set_event_cb(event_handler) btn1.align(None, lv.ALIGN.CENTER, 0, 0) label = lv.label(btn1) label.set_text("Button") lv.scr_load(scr)
def popup_confirm_stop(self): modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) modal_style.body.main_color = modal_style.body.grad_color = lv.color_make( 0, 0, 0) modal_style.body.opa = lv.OPA._50 bg = lv.obj(self.main_scr) bg.set_style(modal_style) bg.set_pos(0, 0) bg.set_size(self.main_scr.get_width(), self.main_scr.get_height()) bg.set_opa_scale_enable(True) popup_stop = lv.mbox(bg) popup_stop.set_text( 'Do you really want to stop the soldering process?') btns = ['OK', 'Cancel', ''] popup_stop.add_btns(btns) this = self def event_handler(obj, event): if event == lv.EVENT.VALUE_CHANGED: if popup_stop.get_active_btn() == 0: this.set_reflow_process_on(False) else: pass bg.del_async() popup_stop.start_auto_close(5) popup_stop.set_event_cb(event_handler) popup_stop.align(None, lv.ALIGN.CENTER, 0, 0)
def create_style(self, colour=(0x00, 0x3b, 0x75), width=3, rounded=1): style_line = lv.style_t() lv.style_copy(style_line, lv.style_plain) style_line.line.color = lv.color_make(colour[0], colour[1], colour[2]) style_line.line.width = width style_line.line.rounded = rounded return style_line
def slider_event_cb(e): # Recolor the image based on the sliders' values color = lv.color_make(red_slider.get_value(), green_slider.get_value(), blue_slider.get_value()) intense = intense_slider.get_value() img1.set_style_img_recolor_opa(intense, 0) img1.set_style_img_recolor(color, 0)
def slider_event_cb(slider,event): if event == lv.EVENT.VALUE_CHANGED: # Recolor the image based on the sliders' values color = lv.color_make(red_slider.get_value(), green_slider.get_value(), blue_slider.get_value()) intense = intense_slider.get_value() img1.set_style_local_image_recolor_opa(lv.img.PART.MAIN, lv.STATE.DEFAULT, intense) img1.set_style_local_image_recolor(lv.img.PART.MAIN, lv.STATE.DEFAULT, color)
def led_init(self): """ Initialize the LED on the screen """ style_led = lv.style_t() lv.style_copy(style_led, lv.style_pretty_color) style_led.body.radius = 800 # large enough to draw a circle style_led.body.main_color = lv.color_make(0xb5, 0x0f, 0x04) style_led.body.grad_color = lv.color_make(0x50, 0x07, 0x02) style_led.body.border.color = lv.color_make(0xfa, 0x0f, 0x00) style_led.body.border.width = 3 style_led.body.border.opa = lv.OPA._30 style_led.body.shadow.color = lv.color_make(0xb5, 0x0f, 0x04) style_led.body.shadow.width = 5 led = lv.led(self.main_scr) led.set_style(lv.led.STYLE.MAIN, style_led) led.align(lv.scr_act(), lv.ALIGN.IN_TOP_RIGHT, -10, 5) led.off() return led
def popup_calibration(self): modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) modal_style.body.main_color = modal_style.body.grad_color = lv.color_make( 0, 0, 0) modal_style.body.opa = lv.OPA._50 bg = lv.obj(self.main_scr) bg.set_style(modal_style) bg.set_pos(0, 0) bg.set_size(self.main_scr.get_width(), self.main_scr.get_height()) bg.set_opa_scale_enable(True) popup_cali = lv.mbox(bg) popup_cali.set_text('What would you like to calibrate?') btns = ['Temp Sensor', '\n', 'Touch Screen', '\n', 'Cancel', ''] popup_cali.add_btns(btns) lv.cont.set_fit(popup_cali, lv.FIT.NONE) mbox_style = popup_cali.get_style(popup_cali.STYLE.BTN_REL) popup_cali_style = lv.style_t() lv.style_copy(popup_cali_style, mbox_style) popup_cali_style.body.padding.bottom = 96 popup_cali.set_style(popup_cali.STYLE.BTN_REL, popup_cali_style) popup_cali.set_height(186) this = self def event_handler(obj, event): if event == lv.EVENT.VALUE_CHANGED: active_btn_text = popup_cali.get_active_btn_text() tim = machine.Timer(-1) if active_btn_text == 'Temp Sensor': this.config['has_calibrated'] = False with open('config.json', 'w') as f: ujson.dump(this.config, f) tim.init(period=500, mode=machine.Timer.ONE_SHOT, callback=lambda t: machine.reset()) elif active_btn_text == 'Touch Screen': uos.remove(this.config.get('touch_cali_file')) tim.init(period=500, mode=machine.Timer.ONE_SHOT, callback=lambda t: machine.reset()) else: tim.deinit() bg.del_async() popup_cali.start_auto_close(5) popup_cali.set_event_cb(event_handler) popup_cali.align(None, lv.ALIGN.CENTER, 0, 0) self.popup_cali = popup_cali return self.popup_cali
def popup_settings(self): modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) modal_style.body.main_color = modal_style.body.grad_color = lv.color_make( 0, 0, 0) modal_style.body.opa = lv.OPA._50 bg = lv.obj(self.main_scr) bg.set_style(modal_style) bg.set_pos(0, 0) bg.set_size(self.main_scr.get_width(), self.main_scr.get_height()) bg.set_opa_scale_enable(True) popup_settings = lv.mbox(bg) popup_settings.set_text('Settings') btns = ['Set PID Params', '\n', 'Calibrate Touch', '\n', 'Close', ''] popup_settings.add_btns(btns) lv.cont.set_fit(popup_settings, lv.FIT.NONE) mbox_style = popup_settings.get_style(popup_settings.STYLE.BTN_REL) popup_cali_style = lv.style_t() lv.style_copy(popup_cali_style, mbox_style) popup_cali_style.body.padding.bottom = 115 popup_settings.set_style(popup_settings.STYLE.BTN_REL, popup_cali_style) popup_settings.set_height(186) def event_handler(obj, event): if event == lv.EVENT.VALUE_CHANGED: active_btn_text = popup_settings.get_active_btn_text() tim = machine.Timer(-1) # Note: With PID, temp calibration no longer needed # if active_btn_text == 'Temp Sensor': # this.config['has_calibrated'] = False # with open('config.json', 'w') as f: # ujson.dump(this.config, f) # tim.init(period=500, mode=machine.Timer.ONE_SHOT, callback=lambda t:machine.reset()) # elif active_btn_text == 'Touch Screen': if active_btn_text == 'Calibrate Touch': uos.remove(self.config.get('touch_cali_file')) tim.init(period=500, mode=machine.Timer.ONE_SHOT, callback=lambda t: machine.reset()) elif active_btn_text == 'Set PID Params': tim.init(period=50, mode=machine.Timer.ONE_SHOT, callback=lambda t: self.popup_pid_params()) else: tim.deinit() bg.del_async() popup_settings.start_auto_close(5) popup_settings.set_event_cb(event_handler) popup_settings.align(None, lv.ALIGN.CENTER, 0, 0)
def chart_init(self): """ Initialize the temp chart on the screen """ chart = lv.chart(self.main_scr) chart.set_size(GUI.CHART_WIDTH, GUI.CHART_HEIGHT) # width, height pixel of the chart chart.align(lv.scr_act(), lv.ALIGN.IN_BOTTOM_MID, 0, 0) chart.set_type(lv.chart.TYPE.LINE) chart.set_style(lv.chart.STYLE.MAIN, lv.style_plain) chart.set_series_opa(lv.OPA.COVER) chart.set_series_width(3) chart_series = chart.add_series(lv.color_make(0xFF, 0, 0)) return chart, chart_series
def set_text(self, text="Text"): self._text = text qr = qrcode.encode_to_string(text) size = int(math.sqrt(len(qr))) width = self.get_width() scale = width // size sizes = range(1, 10) fontsize = [s for s in sizes if s < scale or s == 1][-1] font = getattr(lv, "square%d" % fontsize) style = lv.style_t() lv.style_copy(style, lv.style_plain) style.body.main_color = lv.color_make(0xFF, 0xFF, 0xFF) style.body.grad_color = lv.color_make(0xFF, 0xFF, 0xFF) style.body.opa = 255 style.text.font = font style.text.line_space = 0 style.text.letter_space = 0 self.set_style(0, style) # self.set_body_draw(True) super().set_text(qr) del qr gc.collect()
def draw_profile_line(self, points): """ Draw reflow temp profile over the chart per selection """ style_line = lv.style_t() lv.style_copy(style_line, lv.style_transp) style_line.line.color = lv.color_make(0, 0x80, 0) style_line.line.width = 3 style_line.line.rounded = 1 style_line.line.opa = lv.OPA._40 line = lv.line(self.chart) line.set_points(points, len(points)) # Set the points line.set_style(lv.line.STYLE.MAIN, style_line) line.align(self.chart, lv.ALIGN.IN_BOTTOM_MID, 0, 0) line.set_y_invert(True) return line
def __init__(self, parent, *args, **kwargs): # Create a base object for the modal background super().__init__(parent, *args, **kwargs) # Create a full-screen background modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) # Set the background's style modal_style.body.main_color = modal_style.body.grad_color = lv.color_make( 0, 0, 0) modal_style.body.opa = lv.OPA._50 self.set_style(modal_style) self.set_pos(0, 0) self.set_size(parent.get_width(), parent.get_height()) self.mbox = lv.mbox(self) self.mbox.set_width(400) self.mbox.align(None, lv.ALIGN.IN_TOP_MID, 0, 200)
def createItem(self, parent, iconPath, value, unityPath, tips): col_dsc = [ lv.GRID.CONTENT, 5, lv.GRID.CONTENT, lv.GRID.CONTENT, lv.GRID_TEMPLATE.LAST ] row_dsc = [lv.GRID.CONTENT, lv.GRID.CONTENT, lv.GRID_TEMPLATE.LAST] cont = lv.obj(parent) cont.set_style_bg_opa(0, 0) cont.set_style_border_opa(0, 0) cont.set_style_pad_all(0, 0) cont.set_size(lv.SIZE.CONTENT, lv.SIZE.CONTENT) cont.set_style_grid_column_dsc_array(col_dsc, 0) cont.set_style_grid_row_dsc_array(row_dsc, 0) cont.set_layout(lv.LAYOUT_GRID.value) img = lv.img(cont) img.set_src(iconPath) img.set_grid_cell(lv.GRID_ALIGN.START, 0, 1, lv.GRID_ALIGN.CENTER, 0, 2) label = lv.label(cont) label.set_text(value) label.set_style_text_color(lv.color_white(), 0) label.set_style_text_font(lv.font_montserrat_48, 0) label.set_style_pad_all(0, 0) label.set_grid_cell(lv.GRID_ALIGN.START, 2, 1, lv.GRID_ALIGN.CENTER, 0, 1) if (unityPath.strip()): iconImg = lv.img(cont) iconImg.set_src(unityPath) iconImg.set_zoom(205) iconImg.set_style_pad_bottom(0, 0) iconImg.set_grid_cell(lv.GRID_ALIGN.START, 3, 1, lv.GRID_ALIGN.CENTER, 0, 1) tip = lv.label(cont) tip.set_text(tips) tip.set_style_text_color(lv.color_make(0xCC, 0xCC, 0xCC), 0) tip.set_grid_cell(lv.GRID_ALIGN.START, 2, 2, lv.GRID_ALIGN.START, 1, 1)
def confirm_exit(self): mnemonic = self.table.get_mnemonic() if len(mnemonic) == 0: self.set_value(None) return modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) # Set the background's style modal_style.body.main_color = lv.color_make(0, 0, 0) modal_style.body.grad_color = modal_style.body.main_color modal_style.body.opa = lv.OPA._50 # Create a base object for the modal background bg = lv.obj(self) bg.set_style(modal_style) bg.set_pos(0, 0) bg.set_size(self.get_width(), self.get_height()) # Enable opacity scaling for the animation bg.set_opa_scale_enable(True) btns = ["No, stay here", "Yes, leave", ""] def event_handler(obj, event): if event == lv.EVENT.VALUE_CHANGED: if lv.mbox.get_active_btn_text(obj) == btns[1]: self.set_value(None) else: obj.del_async() bg.del_async() mbox = lv.mbox(self) mbox.set_text( "\nAre you sure you want to exit?\n\n" "Everything you entered will be forgotten!\n\n" ) mbox.add_btns(btns) mbox.set_width(400) mbox.set_event_cb(event_handler) mbox.align(None, lv.ALIGN.CENTER, 0, 0)
def draw_melting_dash_line(self, y_point, melting_temp): """ Draw melting temp with dashed line over the chart """ # Container for dashed line style_cont = lv.style_t() lv.style_copy(style_cont, lv.style_transp) dashed_segments = 10 dashed_cont = lv.cont(self.chart) dashed_cont.set_style(lv.line.STYLE.MAIN, style_cont) dashed_cont.set_width(GUI.CHART_WIDTH) # Draw dashed line style_dash_line = lv.style_t() lv.style_copy(style_dash_line, lv.style_transp) style_dash_line.line.color = lv.color_make(0xFF, 0x68, 0x33) style_dash_line.line.width = 3 dash_width = int(GUI.CHART_WIDTH / (dashed_segments * 2 - 1)) dashed_points = [ {'x': 0, 'y': 0}, {'x': dash_width, 'y': 0} ] dashed_line0 = lv.line(dashed_cont) dashed_line0.set_points(dashed_points, len(dashed_points)) dashed_line0.set_style(lv.line.STYLE.MAIN, style_dash_line) dashed_line0.align(None, lv.ALIGN.IN_LEFT_MID, 0, 0) for i in range(dashed_segments - 1): dl_name = 'dashed_line' + str(i+1) parent_name = 'dashed_line' + str(i) locals()[dl_name] = lv.line(dashed_cont, dashed_line0) locals()[dl_name].align(None, lv.ALIGN.IN_LEFT_MID, dash_width * (i+1) * 2, 0) # Melting temp melt_label = lv.label(dashed_cont) melt_label.set_recolor(True) melt_label.set_text('#FF6833 ' + str(melting_temp) + '#') # Put above elements in place dashed_cont.align_origo(self.chart, lv.ALIGN.IN_BOTTOM_MID, 0, -y_point) melt_label.align(dashed_cont, lv.ALIGN.IN_TOP_LEFT, 8, 12) return dashed_cont
def next_color(self): index = self.color_state[0] level = self.color_state[1] if index == 0: color = lv.color_make(255, level, 0) elif index == 1: color = lv.color_make(255-level, 255, 0) elif index == 2: color = lv.color_make(0, 255, level) elif index == 3: color = lv.color_make(0, 255-level, 255) elif index == 4: color = lv.color_make(level, 0, 255) else: color = lv.color_make(255, 0, 255-level) level = level + 6 if level >= 256: level -= 256 index = index + 1 if index == 6: index = 0 self.color_state = (index, level) return color
#!/opt/bin/lv_micropython -i import lvgl as lv import display_driver import time # Create a normal cell style style_cell1 = lv.style_t() style_cell1.init() style_cell1.set_border_width(lv.STATE.DEFAULT, 1) style_cell1.set_border_color(lv.STATE.DEFAULT, lv.color_make(0, 0, 0)) # Create a header cell style style_cell2 = lv.style_t() style_cell2.init() style_cell2.set_border_width(lv.STATE.DEFAULT, 1) style_cell2.set_border_color(lv.STATE.DEFAULT, lv.color_make(0, 0, 0)) style_cell2.set_bg_color(lv.STATE.DEFAULT, lv.color_make(0xC0, 0xC0, 0xC0)) style_cell2.set_bg_grad_color(lv.STATE.DEFAULT, lv.color_make(0xC0, 0xC0, 0xC0)) table = lv.table(lv.scr_act()) table.add_style(lv.table.PART.CELL1, style_cell1) table.add_style(lv.table.PART.CELL2, style_cell2) #table.add_style(lv.table.PART.BG, lv.style.transp_tight) table.set_col_cnt(2) table.set_row_cnt(4) table.align(None, lv.ALIGN.CENTER, 0, 0) # Make the cells of the first row center aligned table.set_cell_align(0, 0, lv.label.ALIGN.CENTER) table.set_cell_align(0, 1, lv.label.ALIGN.CENTER)
slider.align(scr2, lv.ALIGN.IN_TOP_MID, 0, 15) btn1 = lv.btn(scr1) btn1.align(scr1, lv.ALIGN.IN_TOP_RIGHT, -5, 5) label = lv.label(btn1) label.set_text(">") btn2 = lv.btn(scr2) btn2.align(scr2, lv.ALIGN.IN_TOP_LEFT, 5, 5) label2 = lv.label(btn2) label2.set_text("<") style_led = lv.style_t() lv.style_copy(style_led, lv.style_pretty_color) style_led.body.radius = 800 style_led.body.main_color = lv.color_make(0xB5, 0x0F, 0x04) style_led.body.grad_color = lv.color_make(0x50, 0x07, 0x02) style_led.body.border.color = lv.color_make(0xFA, 0x0F, 0x00) style_led.body.border.width = 3 style_led.body.border.opa = lv.OPA._30 style_led.body.shadow.color = lv.color_make(0xB5, 0x0F, 0x04) style_led.body.shadow.width = 5 led1 = lv.led(scr2) # led1.set_style(lv.led.STYLE.MAIN, style_led) led1.align(slider, lv.ALIGN.OUT_RIGHT_MID, 10, 0) led1.set_bright(slider.get_value() * 2) led1.set_drag(True) def slider_event_cb(slider, event):
cal_x1=touch_x1, cal_y0=touch_y0, cal_y1=touch_y1, ) TOUCH_READY = 1 #表示已经配置好触摸参数 ############################################# ############### Page ################ ############################################# if TOUCH_READY: # Create a scroll bar style style_sb = lv.style_t() lv.style_copy(style_sb, lv.style_plain) style_sb.body.main_color = lv.color_make(0, 0, 0) style_sb.body.grad_color = lv.color_make(0, 0, 0) style_sb.body.border.color = lv.color_make(0xff, 0xff, 0xff) style_sb.body.border.width = 1 style_sb.body.border.opa = lv.OPA._70 style_sb.body.radius = 800 # large enough to make a circle style_sb.body.opa = lv.OPA._60 style_sb.body.padding.right = 3 style_sb.body.padding.bottom = 3 style_sb.body.padding.inner = 8 # Scrollbar width # Create a page page = lv.page(lv.scr_act()) page.set_size(240, 300) page.align(None, lv.ALIGN.CENTER, 0, 0) page.set_style(lv.page.STYLE.SB, style_sb) # Set the scrollbar style
def LV_COLOR_MAKE(r,g,b): # return lv.color_hex(r<<16| g<<8 |b) return lv.color_make(r,g,b)
import lvgl as lv # lvgl must be initialized before any lvgl function is called or object/struct is constructed! lv.init() # Create a style based on style_plain but with a symbol font symbolstyle = lv.style_t(lv.style_plain) symbolstyle.text.font = lv.font_roboto_28 # The following two lines do the same thing. # They show how to initialize struct either directly or through a dict symbolstyle.text.color = lv.color_hex(0xFFFFFF) symbolstyle.text.color = lv.color_make(0xFF, 0xFF, 0xFF) if hasattr(symbolstyle.text.color.ch, "alpha"): symbolstyle.text.color.ch.alpha = 0xFF # Only has alpha when color is 32 bit def get_member_name(obj, value): for member in dir(obj): if getattr(obj, member) == value: return member class SymbolButton(lv.btn): def __init__(self, parent, symbol, text): super().__init__(parent) self.symbol = lv.label(self) self.symbol.set_text(symbol)
import lvgl as lv # lvgl must be initialized before any lvgl function is called or object/struct is constructed! lv.init() # Create a style based on style_plain but with a symbol font symbolstyle = lv.style_t(lv.style_plain) symbolstyle.text.font = lv.font_roboto_28 # The following two lines do the same thing. # They show how to initialize struct either directly or through a dict symbolstyle.text.color = lv.color_hex(0xffffff) symbolstyle.text.color = lv.color_make(0xff, 0xff, 0xff) if hasattr(symbolstyle.text.color.ch, 'alpha'): symbolstyle.text.color.ch.alpha = 0xff # Only has alpha when color is 32 bit def get_member_name(obj, value): for member in dir(obj): if getattr(obj, member) == value: return member class SymbolButton(lv.btn): def __init__(self, parent, symbol, text): super().__init__(parent) self.symbol = lv.label(self) self.symbol.set_text(symbol)
import time import lvgl as lv lv.init() import display display.init() from lvstm32 import lvstm32 from lvdisplay import lvdisplay scr = lv.obj() #color for button style1 = lv.style_t(lv.style_plain) style1.text.font = lv.font_roboto_28 style1.body.main_color = lv.color_make(158, 158, 158) style1.body.grad_color = lv.color_make(158, 158, 158) style1.body.radius = lv.RADIUS.CIRCLE style1.text.color = lv.color_make(0, 0, 0) #color for background style2 = lv.style_t(style1) style2.text.font = lv.font_roboto_28 style2.body.main_color = lv.color_make(0, 0, 0) style2.body.grad_color = lv.color_make(0, 0, 0) style2.text.color = lv.color_make(158, 158, 158) #button1 btn1 = lv.btn(scr) btn1.set_style(lv.btn.STYLE.REL, style1) btn1.align(None, lv.ALIGN.CENTER, 0, -85) btn1.set_size(100, 100) label1 = lv.label(btn1)
#!/opt/bin/lv_micropython -i import lvgl as lv import display_driver # Create a scroll bar style style_sb = lv.style_t() style_sb.init() #lv.style_copy(style_sb, lv.style_plain) style_sb.set_bg_color(lv.STATE.DEFAULT, lv.color_make(0, 0, 0)) style_sb.set_bg_grad_color(lv.STATE.DEFAULT, lv.color_make(0, 0, 0)) style_sb.set_border_color(lv.STATE.DEFAULT, lv.color_make(0xff, 0xff, 0xff)) style_sb.set_border_width(lv.STATE.DEFAULT, 1) style_sb.set_border_opa(lv.STATE.DEFAULT, lv.OPA._70) style_sb.set_radius(lv.STATE.DEFAULT, 800) # large enough to make a circle style_sb.set_bg_opa(lv.STATE.DEFAULT, lv.OPA._60) style_sb.set_pad_right(lv.STATE.DEFAULT, 3) style_sb.set_pad_bottom(lv.STATE.DEFAULT, 3) style_sb.set_pad_inner(lv.STATE.DEFAULT, 8) # Scrollbar width # Create a page page = lv.page(lv.scr_act()) page.set_size(150, 200) page.align(None, lv.ALIGN.CENTER, 0, 0) page.add_style(lv.page.PART.SCROLLABLE, style_sb) # Set the scrollbar style # Create a label on the page label = lv.label(page) label.set_long_mode(lv.label.LONG.BREAK) # Automatically break long lines label.set_width(page.get_fit_width( )) # Set the label width to max value to not show hor. scroll bars label.set_text("""Lorem ipsum dolor sit amet, consectetur adipiscing elit,
def createPage(self): global value global sound_ttf_alive print("Enter SoundTTF") # init scr scr = lv.obj() win = lv.obj(scr) win.set_size(scr.get_width(), scr.get_height()) win.set_style_border_opa(0, 0) win.set_style_radius(0, 0) win.set_style_bg_color(lv.color_black(), 0) win.clear_flag(lv.obj.FLAG.SCROLLABLE) win.set_style_pad_right(30, 0) title = lv.label(win) title.set_text("Sound TTF") title.set_style_text_color(lv.color_white(), 0) title.set_style_text_font(lv.font_montserrat_28, 0) title.align(lv.ALIGN.TOP_LEFT, 20, 0) decibel = lv.label(win) decibel.set_text(str(value) + "dB") decibel.set_style_text_color(lv.color_make(0xFF, 0xA8, 0x48), 0) decibel.set_style_text_font(lv.font_montserrat_28, 0) decibel.align(lv.ALIGN.TOP_RIGHT, 0, 0) chart = lv.chart(win) chart.set_type(lv.chart.TYPE.BAR) chart.set_style_border_opa(0, 0) chart.set_style_bg_opa(0, 0) chart.set_style_line_opa(0, 0) chart.set_width(280) chart.set_height(160) chart.set_div_line_count(6, 0) chart.set_point_count(12) chart.align(lv.ALIGN.BOTTOM_MID, 20, -5) chart.add_event_cb(chart_event_cb, lv.EVENT.DRAW_PART_END, None) ser1 = chart.add_series(lv.color_make(0x56, 0x56, 0x56), lv.chart.AXIS.PRIMARY_Y) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) chart.set_next_value(ser1, lv.rand(30, 100)) backImg = lv.img(win) backImg.set_src(RESOURCES_ROOT + "images/back.png") backImg.set_style_align(lv.ALIGN.LEFT_MID, 0) backImg.add_flag(lv.obj.FLAG.CLICKABLE) backImg.add_event_cb(lambda e: sound_ttf_back_click_callback(e, win), lv.EVENT.CLICKED, None) backImg.set_ext_click_area(30) backImg.add_event_cb( lambda e: sound_ttf_back_press_callback(e, backImg), lv.EVENT.PRESSED, None) backImg.add_event_cb( lambda e: sound_ttf_back_release_callback(e, backImg), lv.EVENT.RELEASED, None) from smart_panel import needAnimation if (needAnimation): lv.scr_load_anim(scr, lv.SCR_LOAD_ANIM.MOVE_LEFT, 500, 0, True) else: lv.scr_load_anim(scr, lv.SCR_LOAD_ANIM.NONE, 0, 0, True) sound_ttf_alive = True
# Create a style style = lv.style_t() lv.style_copy(style, lv.style_pretty_color) style.body.main_color = lv.color_hex3(0x666) # Line color at the beginning style.body.grad_color = lv.color_hex3(0x666) # Line color at the end style.body.padding.left = 10 # Scale line length style.body.padding.inner = 8 # Scale label padding style.body.border.color = lv.color_hex3(0x333) # Needle middle circle color style.line.width = 3 style.text.color = lv.color_hex3(0x333) style.line.color = lv.color_hex3(0xF00) # Line color after the critical value # Describe the color for the needles needle_colors = [ lv.color_make(0x00, 0x00, 0xFF), lv.color_make(0xFF, 0xA5, 0x00), lv.color_make(0x80, 0x00, 0x80) ] # Create a gauge gauge1 = lv.gauge(lv.scr_act()) gauge1.set_style(lv.gauge.STYLE.MAIN, style) gauge1.set_needle_count(len(needle_colors), needle_colors) gauge1.set_size(150, 150) gauge1.align(None, lv.ALIGN.CENTER, 0, 20) # Set the values gauge1.set_value(0, 10) gauge1.set_value(1, 20) gauge1.set_value(2, 30)
# Start your codes here. # ********************************** # Create a chart chart = lv.chart(lv.scr_act()) chart.set_size(200, 150) chart.align(None, lv.ALIGN.CENTER, 0, 0) chart.set_type(lv.chart.TYPE.POINT | lv.chart.TYPE.LINE) # Show lines and points too chart.set_series_opa(lv.OPA._70) # Opacity of the data series chart.set_series_width(4) # Line width and point radious chart.set_range(0, 100) # Add two data series ser1 = chart.add_series(lv.color_make(0xFF, 0, 0)) ser2 = chart.add_series(lv.color_make(0, 0x80, 0)) # Set points on 'dl1' chart.set_points(ser1, [10, 10, 10, 10, 10, 10, 10, 30, 70, 90]) # Set points on 'dl2' chart.set_points(ser2, [90, 70, 65, 65, 65, 65, 65, 65, 65, 65]) # ********************************** # End your codes here. # ********************************** def on_timer(timer): lv.tick_inc(5)
#create button in center with callback btn = lv.btn(scr) btn.align(scr, lv.ALIGN.CENTER, 0, 0) btn.set_event_cb(event_handler) label = lv.label(btn) label.set_text("Press me") label.set_size(20,20) #create semi-transparrent background and set it to hidden bg = lv.obj(scr) bg.set_pos(0, 0) bg.set_size(scr.get_width(), scr.get_height()) modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) modal_style.body.main_color = modal_style.body.grad_color = lv.color_make(0,0,50) modal_style.body.opa = 75 bg.set_style(modal_style) bg.set_hidden(1) #create message box and set it to hidden box = lv.mbox(scr) box.set_text("Congratulations, you pressed the button! Now do it again, here"); box.add_btns(["OK", ""]) box.set_width(200) box.set_event_cb(event_handler) box.align(None, lv.ALIGN.CENTER, 0, 0) box.set_hidden(1) lv.scr_load(scr)
def popup_pid_params(self): """ The popup window of PID params settings """ modal_style = lv.style_t() lv.style_copy(modal_style, lv.style_plain_color) modal_style.body.main_color = modal_style.body.grad_color = lv.color_make( 0, 0, 0) modal_style.body.opa = lv.OPA._50 bg = lv.obj(self.main_scr) bg.set_style(modal_style) bg.set_pos(0, 0) bg.set_size(self.main_scr.get_width(), self.main_scr.get_height()) bg.set_opa_scale_enable(True) # init mbox and title popup_pid = lv.mbox(bg) popup_pid.set_text('Set PID Params') popup_pid.set_size(220, 300) popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) input_cont = lv.cont(popup_pid) input_cont.set_size(210, 180) def input_event_cb(ta, event): if event == lv.EVENT.CLICKED: self.current_input_placeholder = ta.get_placeholder_text() if self.current_input_placeholder == 'Set Offset': popup_pid.align(bg, lv.ALIGN.CENTER, 0, -55) else: popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) if kb.get_hidden(): kb.set_hidden(False) # Focus on the clicked text area kb.set_ta(ta) def keyboard_event_cb(event_kb, event): event_kb.def_event_cb(event) if event == lv.EVENT.CANCEL or event == lv.EVENT.APPLY: kb.set_hidden(True) if self.current_input_placeholder == 'Set Offset': popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) # init keyboard kb = lv.kb(bg) kb.set_cursor_manage(True) kb.set_event_cb(keyboard_event_cb) lv.kb.set_mode(kb, lv.kb.MODE.NUM) rel_style = lv.style_t() pr_style = lv.style_t() lv.style_copy(rel_style, lv.style_btn_rel) rel_style.body.radius = 0 rel_style.body.border.width = 1 lv.style_copy(pr_style, lv.style_btn_pr) pr_style.body.radius = 0 pr_style.body.border.width = 1 kb.set_style(lv.kb.STYLE.BG, lv.style_transp_tight) kb.set_style(lv.kb.STYLE.BTN_REL, rel_style) kb.set_style(lv.kb.STYLE.BTN_PR, pr_style) # init text areas kp_input = lv.ta(input_cont) kp_input.set_text(str(self.pid_params.get('kp'))) kp_input.set_placeholder_text('Set Kp') kp_input.set_accepted_chars('0123456789.+-') kp_input.set_one_line(True) kp_input.set_width(120) kp_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 20) kp_input.set_event_cb(input_event_cb) kp_label = lv.label(input_cont) kp_label.set_text("Kp: ") kp_label.align(kp_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) pid_title_label = lv.label(input_cont) pid_title_label.set_text("PID Params:") pid_title_label.align(kp_input, lv.ALIGN.OUT_TOP_LEFT, -65, 0) ki_input = lv.ta(input_cont) ki_input.set_text(str(self.pid_params.get('ki'))) ki_input.set_placeholder_text('Set Ki') ki_input.set_accepted_chars('0123456789.+-') ki_input.set_one_line(True) ki_input.set_width(120) ki_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 55) ki_input.set_event_cb(input_event_cb) ki_input.set_cursor_type(lv.CURSOR.LINE | lv.CURSOR.HIDDEN) ki_label = lv.label(input_cont) ki_label.set_text("Ki: ") ki_label.align(ki_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) kd_input = lv.ta(input_cont) kd_input.set_text(str(self.pid_params.get('kd'))) kd_input.set_placeholder_text('Set Kd') kd_input.set_accepted_chars('0123456789.+-') kd_input.set_one_line(True) kd_input.set_width(120) kd_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 90) kd_input.set_event_cb(input_event_cb) kd_input.set_cursor_type(lv.CURSOR.LINE | lv.CURSOR.HIDDEN) kd_label = lv.label(input_cont) kd_label.set_text("Kd: ") kd_label.align(kd_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) temp_offset_input = lv.ta(input_cont) temp_offset_input.set_text(str(self.temp_offset)) temp_offset_input.set_placeholder_text('Set Offset') temp_offset_input.set_accepted_chars('0123456789.+-') temp_offset_input.set_one_line(True) temp_offset_input.set_width(120) temp_offset_input.align(input_cont, lv.ALIGN.IN_TOP_MID, 30, 145) temp_offset_input.set_event_cb(input_event_cb) temp_offset_input.set_cursor_type(lv.CURSOR.LINE | lv.CURSOR.HIDDEN) temp_offset_label = lv.label(input_cont) temp_offset_label.set_text("Offset: ") temp_offset_label.align(temp_offset_input, lv.ALIGN.OUT_LEFT_MID, 0, 0) offset_title_label = lv.label(input_cont) offset_title_label.set_text("Temp Correction:") offset_title_label.align(temp_offset_input, lv.ALIGN.OUT_TOP_LEFT, -65, 0) # set btns to mbox btns = ['Save', 'Cancel', ''] popup_pid.add_btns(btns) lv.cont.set_fit(popup_pid, lv.FIT.NONE) mbox_style = popup_pid.get_style(popup_pid.STYLE.BTN_REL) popup_pid_style = lv.style_t() lv.style_copy(popup_pid_style, mbox_style) popup_pid_style.body.padding.bottom = 46 popup_pid.set_style(popup_pid.STYLE.BTN_REL, popup_pid_style) popup_pid.set_size(220, 300) def event_handler(obj, event): if event == lv.EVENT.VALUE_CHANGED: active_btn_text = popup_pid.get_active_btn_text() if active_btn_text == 'Save': kp_value = float(kp_input.get_text()) ki_value = float(ki_input.get_text()) kd_value = float(kd_input.get_text()) temp_offset_value = float(temp_offset_input.get_text()) self.config['pid'] = { 'kp': kp_value, 'ki': ki_value, 'kd': kd_value } self.config['sensor_offset'] = temp_offset_value self.pid_params = self.config.get('pid') self.temp_offset = self.config.get('sensor_offset') # Save settings to config.json with open('config.json', 'w') as f: ujson.dump(self.config, f) # Apply settings immediately self.pid.reset(kp_value, ki_value, kd_value) self.sensor.set_offset(temp_offset_value) bg.del_async() popup_pid.start_auto_close(5) popup_pid.set_event_cb(event_handler) popup_pid.align(bg, lv.ALIGN.CENTER, 0, 0) kb.set_ta(kp_input) kb.set_hidden(True)