k01计算器文件提交
authorp15692025051 <846603105@qq.com>
Mon, 9 Oct 2023 08:58:30 +0000 (16:58 +0800)
committerp15692025051 <846603105@qq.com>
Mon, 9 Oct 2023 08:58:30 +0000 (16:58 +0800)
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/calculator.py [new file with mode: 0644]

diff --git a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/calculator.py b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/calculator.py
new file mode 100644 (file)
index 0000000..73d9c43
--- /dev/null
@@ -0,0 +1,295 @@
+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"})  
+