kivy部署移动端预测模型记录

之所以选择kivy作为移动端的语言,本人是先了解的python,然后才来学习kivy,是看中了python的数据处理能力和施行机器学习算法的能力,kivy与python无缝结合,或许是优于其他类似的语言。

架构(kv部分,python部分,APP部分如何组织

目前采用的一个架构是:

from kv.lang.builder import Builder
#第一部分: kv部分,其中构建了一个尖括号包裹的Widget, 尖括号包裹的widget在kv中被认为是'"root"widget.
Builder.load_string("""
<MenuScreen>:#主页name:'menu'BoxLayout:orientation:'vertical' ActionBar:id:barActionView:ActionPrevious:title:'慢性疾病'font_name:"Droid"markup:Truewith_previous:Falseapp_icon:'logo.png'ActionButton:text:"遇病一测,防微杜渐"font_name:"Droid"Accordion:orientation:'vertical'AccordionItem:title:"常见问题问答"collapse:FalseGridLayout:cols:1canvas:Color:rgb:1,1,0.8Rectangle:pos:self.possize:self.sizeScrollView:do_scroll_x:Falsedo_scroll_y:TrueLabel:size_hint_y:Nonetext:root.txtfont_name:"Droid"color: 0,0.2,0.4,1markup:Trueheight:self.texture_size[1]text_size:self.width, Noneline_height:1.2# padding_x:2valign: 'center'               AccordionItem:title:"糖尿病、冠心病、卒中"GridLayout:cols:3pos_hint: {"center_x": .5, "center_y": .5}row_force_default:Truerow_default_height:200padding_y:10canvas:Color:rgb:0.6,0.8,0.2Rectangle:pos:self.possize:self.sizeButton:text:'2型糖尿病肾病'on_press:root.manager.current='screen1'  # background_normal:''# background_color:(0,0.6,1,1)Button:text:"2型糖尿病脑卒中"on_press:root.manager.current='screen2'  Button:text:"2型糖尿病"on_press:root.manager.current='screen4'  Button:text:"冠心病"on_press:root.manager.current='screen5' Button:text:"卒中"on_press:root.manager.current='screen7' Button:text:'认知功能障碍'on_press:root.manager.current='screen8'  <screen1>: #与主页并列name:'screen1'BoxLayout:orientation:'vertical'ActionBar:id:barActionView:ActionPrevious:title:'2型糖尿病肾病'font_name:"Droid"markup:Trueapp_icon:'logo.png'with_previous:Trueon_press:root.manager.current="menu"TabbedPanel:id:tpdo_default_tab:Falsecanvas.before:Color:rgb:0.4,0.4,0.6Rectangle:pos:self.possize:self.sizeTabbedPanelItem:text:"ID31865340"font_name:"Droid"# border:'off'GridLayout:cols:1padding: '10dp'spacing:'10dp' canvas.before:Color:rgb:0.8,0.8,1Rectangle:pos:self.possize:self.size GridLayout:cols:3panding:10DarkLabel:text:"性别"ToggleButton:id:femaletext:'女' group:'gender'state:'down'ToggleButton:id:maletext:"男"group:'gender'GridLayout:cols:4spacing:10DarkLabel:text:"糖尿病病程"ToggleButton:id:<5yeartext:'<5年' group:'duration'state:'down'ToggleButton:id:5-10yeartext:"5-10年"group:'duration'ToggleButton:id:>10yeartext:">10年"group:'duration'GridLayout:cols:3DarkLabel:text:"视网膜病变"ToggleButton:text:"无"group:'dr'state:"down"ToggleButton:id:dr_yestext:'有'group:'dr'GridLayout:cols:4DarkLabel:text:"血尿"ToggleButton:id:<5numtext:'<5个' group:'hematuria'state:'down'ToggleButton:id:5-10numtext:"5-10个"group:'hematuria'ToggleButton:id:>10numtext:">10个"group:'hematuria'GridLayout:cols:3DarkLabel:text:'贫血'ToggleButton:id:anemia_notext:'否'group:'anemia'state:'down'ToggleButton:id:anemia_yestext:'是'group:'anemia'GridLayout:cols:3DarkLabel:text:'HbA1c'ToggleButton:id:HbA1c_notext:'<7%'group:'HbA1c'state:'down'ToggleButton:id:HbA1c_yestext:'≥7%'group:'HbA1c'   GridLayout:cols:3DarkLabel:text:'eGFR'ToggleButton:id:eGFR_hightext:'≥90ml/min/1.73m2'group:'gfr'state:'down'ToggleButton:id:eGFR_lowtext:'<90ml/min/1.73m2'group:'gfr'GridLayout:cols:4DarkLabel:text:"UPE"ToggleButton:id:<1gtext:'<1g/24h' group:'upe'state:'down'ToggleButton:id:1-3gtext:"1-3.5g/24h"group:'upe'ToggleButton:id:>3gtext:">3.5g/24h"group:'upe'GridLayout:cols:3DarkLabel:text:"高血压"ToggleButton:id:bp_normaltext:'SBP<140且DBP<90'font_size:15group:'bp'state:'down'ToggleButton:id:bp_unnormaltext:'SBP≥140或DBP≥90'font_size:15group:'bp'AButton:text:'计算'on_state: root.on_press_prob()pos_hint:{'center_x':.5,'center_y':.5}size_hint:(0.9,0.9)              Label:id:prob_labeltext:" "color:(0.4,0.4,0.6,1)GridLayout:cols:4spacing: '10dp'         AButton:text:'模型信息表'on_release:root.info_sheet()pos_hint:{'center_x':.5,'center_y':.5} AButton:text:'评价星级:3星'on_release:root.conclusion()pos_hint:{'center_x':.5,'center_y':.5}
""")
#第二部分:python 部分, 与一般的python语言类似
class MenuScreen(Screen):pass
class screen1(Screen):def on_press_prob(self, *args):duration1 = self.ids['5-10year'].stateif duration1=="down":duration_5=1else:duration_5=0duration2=self.ids['>10year'].stateif duration2=='down':duration_10=1else:duration_10=0sex = self.ids['female'].stateif sex == 'down':sex_female = 1else:sex_female = 0dr=self.ids['dr_yes'].stateif dr=='down':dr_yes =1else:dr_yes=0hematuria1=self.ids['>10num'].stateif hematuria1=='down':hematuria_10 = 1else:hematuria_10 = 0hematuria2=self.ids['5-10num'].stateif hematuria2=='down':hematuria_5=1else:hematuria_5=0anemia=self.ids['anemia_yes'].stateif anemia=='down':anemia_yes=1else:anemia_yes=0HbA1c=self.ids['HbA1c_yes'].stateif HbA1c=='down':hba1c=1else:hba1c=0gfr=self.ids['eGFR_low'].stateif gfr=='down':egfr_90=1else:egfr_90=0upe1=self.ids['>3g'].stateif upe1=='down':upe_3=1else:upe_3=0upe2=self.ids['1-3g'].stateif upe2=='down':upe_1=1else:upe_1=0bp=self.ids['bp_unnormal'].stateif bp=='down':bp_unnormal=1else:bp_unnormal=0list_or = [0.35, 7.46, 2.99, 8.27, 0.15,0.70,3.48,1.43,3.78,2.24,1.76,2.17]list_para = [sex_female, duration_10, duration_5,dr_yes,hematuria_10,hematuria_5,anemia_yes,hba1c,bp_unnormal,upe_3,upe_1,egfr_90]intercept = 0.017   model=ev.logistic(ls_or=list_or,ls_xvar=list_para,intercept=intercept)prob = model.prob()label = self.ids['prob_label']label.text = "患者患糖尿病肾病的概率为: " + str(round(prob, 2) * 100) + '%'
#第三部分:APP部分,也是python语言的一部分,但是功能是与其它python部分有不同,可以独立出来作为一个特殊的功能块.
class MPDApp(App):def build(self):sm=ScreenManager() #通过这一部分将所有的widget整合整合在一起.sm.add_widget(MenuScreen(name='menu'))sm.add_widget(screen1(name='screen1'))return sm
MPDApp().run()

个人认为这个架构比较清晰,当然我的经验还是有限。

遇到的问题及解决

首先是中文支持的问题,如果构建的是手机端的app,那就不要 用雅黑字体(开始用雅黑字体导致在手机上一直不能识别),因为手机不支持,我现在用的是‘Droid-Sans-Fallback.ttf’。

kivy.resources.resource_add_path("./") #字体文件放在了和main.py同样的目录下
# #通过labelBase
LabelBase.register("Droid","Droid-Sans-Fallback.ttf")
kivy.core.text.Label.register("Droid","Droid-Sans-Fallback.ttf")

widget模板

这一部分主要用kv语言来进行书写。
可以通过改写widget来个性化widget,我一般用来支持中文和调整各种背景颜色和大小。
暂时没有对应python 类,或许是因为没有用到复杂的函数功能,有相应心得随时更新。

<DarkLabel@Label>:font_name:"Droid"#指定字体color:(0.4,0.4,0.6,1)size_hint_x: Nonewidth:220text_size:self.width, None

共同的函数可放在app类中

比如在主页和页面1,有同样一个按钮使用相似的函数,这个函数就可以放在app类中,不用在页面对应的class里面重复写。

buildozer构建APP

操作系统用的是ubuntu系统(windows7+虚拟机)
一定要安装adb。一是方便检查app不成功时哪里出错,个人有好几次app闪退的情况, 就是靠adb检查出的原因;二是builder构建app时,如果连有手机,可以将app直接推送到手机上安装。

kivy部署移动端预测模型网页计算器记录相关推荐

  1. 临床预测模型网页计算器汇总-肿瘤篇

    胃癌(转移)早期死亡 适用人群 :根据美国SEER数据库构建,不适合中国人群使用,仅用于学术讨论. 膀胱肿瘤术后复发

  2. 请在贵网站的根目录下部署一个文件_使用 github pages, 快速部署你的静态网页

    使用 github pages, 快速部署你的静态网页 Github Pages 官网 Github Pages: Websites for you and your projects. Hosted ...

  3. 海豚客服系统接入技巧分享:微信端和网页端

    1微信端 1.如何使用微信端原生对话框? 在微信公众平台里设置自定义菜单,设置文字消息,引导客户用原生页面进行问答. 2.公众号接入海豚客服和微信原生客服有什么不同 开通海豚客服账号之后,在第三方客服 ...

  4. 多商户商城系统功能拆解36讲-平台端营销-拼团记录

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统.可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城. 多商户商城系统支持商家入驻加盟,同时满足平台自营.旗舰店等多种经营方 ...

  5. 如何在 PC 机上测试移动端的网页?

    如何在 PC 机上测试移动端的网页?如果用 HTML5 写的页面,想兼容 iOS.Android 平台的手机,在 PC 机上看有些效果可能不准确,但不可能在每个移动终端都放上去看下效果吧,一般用什么工 ...

  6. 设计一个简单的网页计算器

    设计一个简单的网页计算器 一.代码 <!DOCTYPE html> <html> <head><meta charset="UTF-8"& ...

  7. ASP.net编写一个网页计算器

    本文主要介绍使用ASP.net编写一个简易的网页计算器.前端主要是使用自带的控件,实现逻辑主要是服务端C#. 一.实现功能 简单加减乘除四则运算 能防止出现多个小数点等不符合实际错误 二.实现界面 三 ...

  8. 使用 github pages, 快速部署你的静态网页

    使用 github pages, 快速部署你的静态网页 Github Pages 官网 Github Pages: Websites for you and your projects. Hosted ...

  9. JavaWeb——网页计算器

    系列文章 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.网页计算器设计目标 二.前端界面设计 CSS样式定义 1.大框 2.数字显示框 3.按钮框 Div页面布 ...

最新文章

  1. ubuntu命令创建用户无法登入问题
  2. 活跃用户数怎么计算_不懂LTV,怎么做用户增长?详解用户生命周期价值计算方法...
  3. 方法的反射---反射学习笔记(二)
  4. java 常量 内存分配_Java内存分配之堆、栈和常量池
  5. Ubuntu Core 给物联网提供更多安全支持
  6. @大学生,送给步入大学生活的你,高速学编程。
  7. 以太坊开发入门,如何搭建一个区块链DApp投票系统
  8. 相平衡计算matlab代码,MATLAB,气液相平衡程序,求帮忙改一下。 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  9. 月薪2w的前端工程师,必盘的实战项目
  10. pycharm备份还原
  11. 反转链表(Java)
  12. HDLC概述-iealb
  13. 小程序授权给第三方平台代开发实现业务(流程和实现)
  14. 常见网络故障及其解决办法
  15. 纯CSS3画哆啦A梦
  16. 软件的成本与定价如何决策?PMP软件开发规模估算和成本估算方法详解
  17. 司科水果o2o_水果o2o系统_生鲜配送水果o2o系统开发
  18. python 字典代码_python中的字典用法大全的代码
  19. JavaScript实现弹出“确定/取消”对话框的方法
  20. N73主相机无法打开解决方法

热门文章

  1. while True:just do it
  2. 链游时代来临!1周12款游戏与公有区块链MagnaChain签约上链
  3. 鸿蒙试炼如何拿经验,热血精灵派空空夜夜的勇士试炼 百万经验轻松得
  4. 2010上半年网络规划设计师上午试卷、标准答案及分析Ⅱ
  5. MATLAB/Simulink模型开发乐高EV3 双足平衡机器人
  6. ubuntu20.04 ros 采集velodyne激光雷达数据
  7. 如何用puttygen由pem生成ppk
  8. 简单几步解决ie打不开闪退的问题 亲测有效
  9. Python:求列表的最大数以及下标
  10. VMMECH007_Thermal Stress in a Bar with Temperature Dependent Conductivity