kivy部署移动端预测模型网页计算器记录
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部署移动端预测模型网页计算器记录相关推荐
- 临床预测模型网页计算器汇总-肿瘤篇
胃癌(转移)早期死亡 适用人群 :根据美国SEER数据库构建,不适合中国人群使用,仅用于学术讨论. 膀胱肿瘤术后复发
- 请在贵网站的根目录下部署一个文件_使用 github pages, 快速部署你的静态网页
使用 github pages, 快速部署你的静态网页 Github Pages 官网 Github Pages: Websites for you and your projects. Hosted ...
- 海豚客服系统接入技巧分享:微信端和网页端
1微信端 1.如何使用微信端原生对话框? 在微信公众平台里设置自定义菜单,设置文字消息,引导客户用原生页面进行问答. 2.公众号接入海豚客服和微信原生客服有什么不同 开通海豚客服账号之后,在第三方客服 ...
- 多商户商城系统功能拆解36讲-平台端营销-拼团记录
多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统.可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城. 多商户商城系统支持商家入驻加盟,同时满足平台自营.旗舰店等多种经营方 ...
- 如何在 PC 机上测试移动端的网页?
如何在 PC 机上测试移动端的网页?如果用 HTML5 写的页面,想兼容 iOS.Android 平台的手机,在 PC 机上看有些效果可能不准确,但不可能在每个移动终端都放上去看下效果吧,一般用什么工 ...
- 设计一个简单的网页计算器
设计一个简单的网页计算器 一.代码 <!DOCTYPE html> <html> <head><meta charset="UTF-8"& ...
- ASP.net编写一个网页计算器
本文主要介绍使用ASP.net编写一个简易的网页计算器.前端主要是使用自带的控件,实现逻辑主要是服务端C#. 一.实现功能 简单加减乘除四则运算 能防止出现多个小数点等不符合实际错误 二.实现界面 三 ...
- 使用 github pages, 快速部署你的静态网页
使用 github pages, 快速部署你的静态网页 Github Pages 官网 Github Pages: Websites for you and your projects. Hosted ...
- JavaWeb——网页计算器
系列文章 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.网页计算器设计目标 二.前端界面设计 CSS样式定义 1.大框 2.数字显示框 3.按钮框 Div页面布 ...
最新文章
- ubuntu命令创建用户无法登入问题
- 活跃用户数怎么计算_不懂LTV,怎么做用户增长?详解用户生命周期价值计算方法...
- 方法的反射---反射学习笔记(二)
- java 常量 内存分配_Java内存分配之堆、栈和常量池
- Ubuntu Core 给物联网提供更多安全支持
- @大学生,送给步入大学生活的你,高速学编程。
- 以太坊开发入门,如何搭建一个区块链DApp投票系统
- 相平衡计算matlab代码,MATLAB,气液相平衡程序,求帮忙改一下。 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
- 月薪2w的前端工程师,必盘的实战项目
- pycharm备份还原
- 反转链表(Java)
- HDLC概述-iealb
- 小程序授权给第三方平台代开发实现业务(流程和实现)
- 常见网络故障及其解决办法
- 纯CSS3画哆啦A梦
- 软件的成本与定价如何决策?PMP软件开发规模估算和成本估算方法详解
- 司科水果o2o_水果o2o系统_生鲜配送水果o2o系统开发
- python 字典代码_python中的字典用法大全的代码
- JavaScript实现弹出“确定/取消”对话框的方法
- N73主相机无法打开解决方法
热门文章
- while True:just do it
- 链游时代来临!1周12款游戏与公有区块链MagnaChain签约上链
- 鸿蒙试炼如何拿经验,热血精灵派空空夜夜的勇士试炼 百万经验轻松得
- 2010上半年网络规划设计师上午试卷、标准答案及分析Ⅱ
- MATLAB/Simulink模型开发乐高EV3 双足平衡机器人
- ubuntu20.04 ros 采集velodyne激光雷达数据
- 如何用puttygen由pem生成ppk
- 简单几步解决ie打不开闪退的问题 亲测有效
- Python:求列表的最大数以及下标
- VMMECH007_Thermal Stress in a Bar with Temperature Dependent Conductivity