--- /dev/null
+import lvgl as lv
+import ql_fs
+import EventMesh
+from misc import Power
+from ui import style_screen,style_font_youyuan_20_black,style_btn,style_img,Screen,style_contact_btn,style_bar,style_bar_indic
+import constants
+import osTimer
+import audio
+from machine import Pin
+import usys
+
+
+calculator_screen = lv.obj()
+print("calculator_screen")
+calculator_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+calculator_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# 创建文本框
+calculator_label = lv.textarea(calculator_screen)
+calculator_label.set_one_line(True) # 关闭1行模式
+calculator_label.set_size(128, 32) # 设置宽高
+calculator_label.align(lv.ALIGN.TOP_MID, 0, -2) # 设置位置
+calculator_label.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) #不显示滚动条
+#calculator_label.add_event_cb(lambda e: self.textarea_event_handler(e, ta), lv.EVENT.READY, None) # 添加回调函数
+calculator_label.add_state(lv.STATE.FOCUSED) # 设置光标
+calculator_label.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+calculator_num = lv.btnmatrix(calculator_screen)
+calculator_num.set_pos(int(0),int(30))
+calculator_num.set_size(128,90)
+calculator_num.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+btnm_map = [
+"C","<-","=","\n",
+"1","2","3","+","\n",
+"4","5","6","-","\n",
+"7","8","9","*","\n",
+".","0","%","/",""]
+calculator_num.set_map(btnm_map)
+# create style style_calculator_num_main_default
+style_calculator_num_main_default = lv.style_t()
+style_calculator_num_main_default.init()
+style_calculator_num_main_default.set_radius(4)
+style_calculator_num_main_default.set_bg_color(lv.color_make(0xff,0xff,0xff))
+style_calculator_num_main_default.set_bg_grad_color(lv.color_make(0xff,0xff,0xff))
+style_calculator_num_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+style_calculator_num_main_default.set_bg_opa(255)
+style_calculator_num_main_default.set_border_color(lv.color_make(0xff,0xff,0xff))
+style_calculator_num_main_default.set_border_width(1)
+style_calculator_num_main_default.set_border_opa(255)
+style_calculator_num_main_default.set_pad_left(2)
+style_calculator_num_main_default.set_pad_right(0)
+style_calculator_num_main_default.set_pad_top(2)
+style_calculator_num_main_default.set_pad_bottom(0)
+style_calculator_num_main_default.set_pad_row(1)
+style_calculator_num_main_default.set_pad_column(1)
+
+# add style for calculator_num
+calculator_num.add_style(style_calculator_num_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+# create style style_calculator_num_items_default
+style_calculator_num_items_default = lv.style_t()
+style_calculator_num_items_default.init()
+style_calculator_num_items_default.set_radius(4)
+style_calculator_num_items_default.set_bg_color(lv.color_make(0xe6,0xe6,0xe6))
+style_calculator_num_items_default.set_bg_grad_color(lv.color_make(0xe6,0xe6,0xe6))
+style_calculator_num_items_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+style_calculator_num_items_default.set_bg_opa(255)
+style_calculator_num_items_default.set_border_color(lv.color_make(0xd6,0xdd,0xe3))
+style_calculator_num_items_default.set_border_width(1)
+style_calculator_num_items_default.set_border_opa(255)
+style_calculator_num_items_default.set_text_color(lv.color_make(0x00,0x00,0x00))
+try:
+ style_calculator_num_items_default.set_text_font(lv.K01_font_16_ALL)
+except AttributeError:
+ print("set_font:error")
+
+# add style for calculator_num
+calculator_num.add_style(style_calculator_num_items_default, lv.PART.ITEMS|lv.STATE.DEFAULT)
+def my_round(src, idx):
+ src_flag = 1 #正负数
+ if src < 0:
+ src_flag = 0
+ src = abs(src)
+ tmp_str = "{}".format(src)
+ tmp_str_l= tmp_str.split(".")
+ print("tmp_str1:{} {}".format(tmp_str,tmp_str_l))
+ if len(tmp_str_l)>1 :
+ if len(tmp_str_l[1]) > idx:
+ for i in range(idx):
+ src *=10
+ dest = int(src)
+ if src >= dest+0.5 :
+ dest += 1
+ print("dest:{}".format(dest))
+ tmp_str = "{}".format(dest)
+ if len(tmp_str) > idx:
+ tmp_str = tmp_str[:len(tmp_str)-idx]+'.'+tmp_str[len(tmp_str)-idx:]
+ else : #位数不够,补0
+ zero_str = ""
+ for j in range(idx-len(tmp_str)):
+ zero_str += "0"
+ print("zero_str:{}".format(zero_str))
+ tmp_str = '0.'+zero_str+tmp_str
+ tmp_str = tmp_str.rstrip('0')#去掉尾数的 0
+ if "." in tmp_str:
+ tmp_str = tmp_str.rstrip('.')#去掉尾数的 .
+ # for i in range(idx):
+ # dest /=10
+ print("tmp_str:{}".format(tmp_str))
+ if src_flag == 0 :
+ tmp_str = "-" + tmp_str
+ return tmp_str
+
+class calculatorScreen(Screen):
+ NAME = "calculator"
+
+ def __init__(self):
+
+ super().__init__()
+ self.meta = None
+ self.calculator_num = ''
+ self.calculator_list = []
+ self.button = 0
+ self.timer = osTimer()
+ self.timer_cb = 0
+ self.count = 0
+ self.str = ""
+ calculator_num.add_event_cb(lambda e: self.calculator_event_cb(e,calculator_num), lv.EVENT.VALUE_CHANGED, None)
+ self.calculator_flag = 0
+ self.result = ""
+ self.num_count = 0 #限制输入位数 20位
+ def initialization(self):
+
+ self.meta = calculator_screen
+
+ def calculator_eval(self,str):
+ print("calculator_eval:str{}".format)
+ try :
+ num = eval(str)
+ ret = "{}".format((my_round(num,8))) #只保留小数点8位
+ # tmp = ret.split('.')
+ # if len(tmp) > 1:
+ # if len(tmp[1]) > 8 : #保留小数点失败
+ # str_tmp = tmp[0]+"."+tmp[1][:-1]
+ # ret = "{}".format((float(str_tmp)))
+
+ return ret
+ except Exception as e:
+ usys.print_exception(e)
+ e_tmp = "{}".format(e)
+ if e_tmp.find("divide by zero") != -1 :
+ calculator_label.set_text("除数不能为0")
+ elif e_tmp.find("invalid syntax") != -1 :
+ EventMesh.txt_log("calculator:{} {}".format(self.calculator_flag,self.str))
+ calculator_label.set_text("无效语法")
+ else :
+ EventMesh.txt_log("calculator:{} {}".format(self.calculator_flag,self.str))
+ calculator_label.set_text("运算异常")
+ self.str = ""
+ self.calculator_flag = 0
+ return -1
+ def calculator_event_cb(self,e,calculator_num):
+ src = e.get_target()
+ code = e.get_code()
+ #print("calculator_clicked:{} {}".format(src,code))
+ if code == lv.EVENT.VALUE_CHANGED:
+ txt = src.get_btn_text(src.get_selected_btn()) # 获取被点击的按钮的内容
+ try :
+ if txt == "<-": # 如果是退格键,那么就删除1个字符
+ if self.calculator_flag != 2 :
+ if len(self.str) > 1:
+ str_tmp = self.str[-1]
+ if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符
+ self.calculator_flag = 0
+ self.str = self.str[0:-1]
+ else :
+ self.str = ""
+ self.calculator_flag = 0
+ if self.num_count > 0 :
+ self.num_count-=1
+ #calculator_label.del_char()
+ elif txt == "C": #清除键
+ self.num_count = 0
+ self.str = ""
+ calculator_label.set_text("")
+ self.calculator_flag = 0
+ elif txt == "=" :
+ if(self.calculator_flag == 1): #有运算符
+ str_tmp = self.str[-1]
+ if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符
+ return
+ else:
+ self.num_count = 0
+ self.result = self.calculator_eval(self.str)
+ if self.result == -1:
+ return
+ self.str += txt+self.result
+ self.calculator_flag = 2
+ elif txt == "%" :
+ str_tmp = self.str[-1]
+ if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符
+ self.str = self.str[:-1]
+
+ self.num_count = 0
+ self.result = self.calculator_eval(self.str+"/100")
+ if self.result == -1:
+ return
+ self.str += txt+"="+self.result
+ self.calculator_flag = 2
+ elif txt == "/" or txt == "*" or txt == "-" or txt == "+" : # 如果是符号,就运算
+ self.num_count = 0
+ if self.calculator_flag == 0:#无运算符
+ if len(self.str) == 0: #开头不能为运算符
+ return
+ self.calculator_flag = 1
+ self.str += txt
+ elif self.calculator_flag == 1 : #有运算符
+ str_tmp = self.str[-1]
+ if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符
+ self.str = self.str[:-1]+txt
+
+ elif str_tmp == ".": #最后一个是.,去除再运算
+ self.str = self.str[0:-1]
+ self.result = self.calculator_eval(self.str)
+ if self.result == -1:
+ return
+ self.str = self.result+txt
+ else :
+ self.result = self.calculator_eval(self.str)
+ if self.result == -1:
+ return
+ self.str = self.result+txt
+ elif self.calculator_flag == 2 : #已经运算了一次
+ self.str = self.result + txt
+ self.calculator_flag = 1
+ elif txt == ".":
+ if self.num_count >=20:
+ return
+ self.num_count += 1
+ str_tmp = self.str[-1]
+ if str_tmp == "." :#最后一个是. 不再添加
+ pass
+ elif str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+": #最后一个是符号 前面加一个0
+ self.str = self.str + "0"+ txt
+ else :
+ self.str+=txt
+ elif txt:#数字
+ if self.num_count >=20:
+ return
+ self.num_count += 1
+ #calculator_label.add_text(txt) # 如果不是回车键,那么就将当前数字显示到文本框
+ self.str+=txt
+ if self.calculator_flag == 2 :
+ self.str=txt
+ self.calculator_flag = 0
+ calculator_label.set_text(self.str)
+ except Exception as e:
+ usys.print_exception(e)
+ e_tmp = "{}".format(e)
+ if e_tmp.find("divide by zero") != -1 :
+ calculator_label.set_text("0不能为除数")
+ self.str = ""
+ self.calculator_flag = 0
+ else :
+ EventMesh.txt_log("calculator:{} {} {}".format(self.calculator_flag,self.str,txt))
+ calculator_label.set_text("运算异常")
+ self.str = ""
+ self.calculator_flag = 0
+ #print("ui_queue_thread:ERROR:{}".format(e))
+
+ print("calculator_clicked:flag:{} str{} ".format(self.calculator_flag,self.str))
+
+
+
+ def lcd_on(self):
+ if self.timer_cb != 0:
+ self.timer_cb = 0
+ #self.timer.start(1000,1,self.refresh_line)
+
+ def lcd_off(self):
+ self.timer_cb = 1
+ self.timer.stop()
+
+
+ def done_return(self):
+ EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+ def btn1_release(self):
+ EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+ def btn8_press(self):
+ EventMesh.publish("watch_top_show")
+ EventMesh.publish("load_screen", {"screen": "main_menu"})
+