Python开发App实战(⼀)-Kivy⼊门
写在最前:
开发App的主流语⾔中应该是Java,但是苦于没有学过Java但⽬前⼜没那么多时间重新学,因此就想着⽤已经⼊门的Python开发两个App 练⼿,学习的过程中看过很多资料,也踩过很多坑,于是就想着将⾃⼰的经验写出来分享给⼤家,希望⼤家可以少踩些坑,更顺利地学习。本次《Python开发App实战》总共分为4个部分,第⼀部分是Kivy的⼊门教程,第⼆部分是基于Kivy实现⼀个具有计时器和秒表功能的表,第三部分是基于Kivy实现⼀个科学计算器,第四部分是Kivy向移动设备的打包移植。前三个部分博主是已经完成的,虽然第四部分相对简单,但是⽐较⽅便的⼀种⽅法是使⽤Kivy提供的Buildozer打包,由于博主研究室的⽹络最近处于瘫痪状态,因此唯⼀⼀台ubuntu设备⽆法使⽤,博主在⾃⼰的macbook上打包了好多次也因为⼀些不知原因的问题没有成功,在ubuntu的虚拟机上打包⼜提⽰内存空间不⾜,因此想等到研究室⽹络恢复,打包移植成功后再更新第四部分。
本次开发的环境如下:
Python:3.6.6
Kivy:1.11.1
OS: MacOS(Ubuntu⾃然ok)
IDE:Pycharm EDU
了解Kivy
好了,开始正题。
于2011年初⾸次发布。该跨平台的Python框架可以部署到Windows,Mac,Linux和树莓派上。它除了常规的键盘和⿏标输⼊外,还⽀持多点触控事件。Kivy甚⾄还⽀持其图形的GPU加速,因为它们是⽤OpenGL ES2构建的。Kivy使⽤的是MIT许可证,因此你可以将该库⽤于免费和商业软件。
Kivy不会尝试使⽤本机控件或⼩部件。它的所有⼩部件都是定制的,因此⽤Kivy开发的App在所有平台上的GUI都是⼀样的,不过缺点可能就是你开发的App的GUI将与⽤户的本机应⽤程序不同。
安装Kivy
Kivy具有许多依赖关系,建议将其安装到Python虚拟环境中。没有⽤过虚拟环境的千万不要劝退,这⾥简单的介绍⼀下虚拟环境:
虚拟环境可以理解于开辟出来的专⽤的⼀块环境,它独⽴于你系统的环境,因为在实际项⽬中可以根据需求或者库不同需要不同版本的依赖关系,⽐如有的项⽬要⽤Python2,有的要⽤Python3,有的⽤Tensorflow1.10,有的⽤Tensorflow2.0。使⽤虚拟环境就可以将每个项⽬完美地独⽴起来,避免的每次需要把系统整体环境的版本改来改去。⽤过Pycharm的同学可以理解为软件设置⾥的project interpreter,你可能每次创建⼀个⼯程都会重新安装依赖,这其实就是所谓的虚拟环境。
如果你只是⽤来做项⽬⽽不打算深⼊了解它,你可以使⽤Python的内置库或包。本次教程就使⽤venv库实现。
先导航到你创建项⽬的⽬录下,在terminal输⼊以下指令创建虚拟环境:
python3 -m venv my_kivy_project
这样就创建成功了⼀个my_kivy_project的⽂件夹并且在⽬录下创建了虚拟环境。
接下来⽤以下指令来激活环境:
source bin/activate
激活之后你terminal应该变成了这样:
(my_kivy_project)你的计算机名:my_kivy_project 你的⽤户名$
不⽤的时候输⼊deactivate退出即可。
接下来在激活后的虚拟环境中安装Kivy,如果你已经安装过pip即可以输⼊以下指令,否则你需要先安装pip:
python -m pip install kivy
如果顺利安装完成后你就可以输⼊pip list,然后看到其中有kivy了。
⽤Kivy的Label实现Hello World
⼤家学语⾔之前都是⽤Hello World开始的吧,那我们今天⼊门Kivy也从Hello World开始。
创建⼀个main.py或者其他的什么命名,在⾥⾯输⼊以下程序你就可以看到Hello World了,你可以使⽤Pycharm这个IDE来编程,在然后在虚拟环境中python main.py来运⾏。
from kivy.app import App
from kivy.uix.label import Label
class mainApp(App):
def build(self):
label = Label(text='Hello World', size_hint=(.5,.5),
pos_hint={'center_x':.5,'center_y':.5})
return label
if __name__ =='__main__':
app = mainApp()
app.run()
运⾏完.py⽂件后,如果没有出现错误你应该可以看到这个界⾯:
每个Kivy应⽤程序都需要继承App类和重写build()函数。在这⾥,你可以编写⾃⼰的UI代码或调⽤定义UI代码的其他函数。这次创建⼀个Label窗⼝⼩部件,并通过定义text,size_hint和pos_hint的数值告诉Kivy创建⼩部件时要使⽤的⽐例和部件的位置。其中size_hint两个数字的含义是:
第⼀个数字是x⼤⼩提⽰,指的是控件的宽度。
第⼆个数字是y⼤⼩提⽰,表⽰控件的⾼度。
这两个数字范围为0到1。两个提⽰的缺省值都是1。
pos_hint两个值的意思可以参考size_hint,上⾯的代码中的两个.5是将label这个部件(widget)在x和y轴上居中。
布置UI
excel表格的基本操作总结Kivy提供了很多的部件,在接下来的项⽬中⽐较常⽤到的有BoxLayout,TextInput, Button,还有本次⽤到的Label等,⼤家可以根据⾃⼰的需求设计UI,然后添加部件,在官⽹上都可以看到相应的部件函数,如⾥除了BoxLayout还有AnchorLayout,FloatLayout等,⼤家可以去⽤⽤试试看。
接下来我们就⽤之后的开发中⽤的最频繁的BoxLayout和Button来给⼤家做⼀个简单的UI演⽰。
尝试以下的代码
def build(self):
layout = BoxLayout(orientation='vertical', spacing=15, padding=10)#创建Layout
buttons =[str(i)for i in range(7)]#设置按键的标签
for i in range(7):
springer科学与商业媒体集团button = Button(text=buttons[i], size_hint=(.5,.5),
pos_hint={"center_x":.5,"center_y":.5})
layout.add_widget(button)#将按键加⼊到Layout中
return layout
if __name__ =="__main__":
app = boxLayoutExample()
app.run()
如果运⾏之后没有错的话你将看到如下的界⾯
参考Hello World部分的代码解释以及本次代码中的注释我们⼤概可以理解,⾸先继承App类然后重写build()函数,在函数中创建⼀
个BoxLayout,然后以字符的形式为按钮创建标签,接着⽤⼀个循环将按钮添加到Layout中即可。可以在出现的界⾯上点⼀下0-6的数字,可以发现确实是按键,可以按下可以弹起。
需要注意的是创建BoxLayout的时候,⾥⾯⽤到的orientation,spacing,padding的局部变量,它们的含义如下:
padding:可以通过以下三种⽅式之⼀指定Layout及其⼦元素之间的填充像素:
1.四参数列表: [padding_left,padding_top,padding_right,padding_bottom]
2.两个参数的列表: [padding_horizontal,padding_vertical]
3.单个参数: padding=10
spacing:可以使⽤此参数在⼦窗⼝⼩部件之间添加空间。
orientation:可以更改默认orientation的BoxLayout从⽔平到垂直。
其他的参数也可以在官⽹上看到其含义和使⽤⽅法,官⽅⼿册是很好的⼯具,⼤家可以好好利⽤,顺便锻炼⼀下英语。
添加事件
和⼤多数GUI⼯具包⼀样,Kivy主要基于,它可以响应⽤户的按键,⿏标事件和触摸事件,此外Kivy还具有时钟的事件。
Kivy也有Properties与之搭配的概念EventDispatcher。属性可帮助您进⾏验证检查。它们还使您可以在⼩部件更改⼤⼩或位置时触发事件。
承接上⾯的按键的例⼦,我们可以通过定义on_press_button()函数来定义按键后的回调函数,然后⽤bind()函数来将该相应的事件绑定到定义的回调函数上。我们就来定义⼀个回调函数,⽤来打印出是哪个按键被按下,绑定的事件的相应的按键被按下,添加绑定事件和回调函数的代码段如下所⽰:
def build(self):
layout = BoxLayout(orientation='vertical', spacing=15, padding=10)#创建Layout
buttons =[str(i)for i in range(7)]#设置按键的标签
for i in range(7):
button = Button(text=buttons[i], size_hint=(.5,.5),
pos_hint={"center_x":.5,"center_y":.5})
button.bind(on__press_button)
layout.add_widget(button)#将按键加⼊到Layout中
return layout
def on_press_button(self, instance):
print('你按下了{}键'.))
if __name__ =="__main__":
app = boxLayoutExample()
app.run()
运⾏完后出现的界⾯跟上⾯UI的例⼦相同,因为我们没有修改UI的布置,不同的是因为按下按键后触发了on_press事件,该事件绑定了我们定义的回调函数,因此回调函数中的代码段就被执⾏,就可以在terminal看到你按下了*键的提⽰。
KV语⾔
布局UI不仅可以像上⽂介绍的那样实现,Kivy还提供了⼀种称为KV的设计语⾔,你可以⽤KV语⾔实现UI布局。不要看到是⼀门新的语⾔就劝退,博主⼀开始就被劝退了,但实际上学起来还是很快的,因为它虽然是⼀个语⾔,但毕竟⽤来设计UI界⾯的,所以⼊门也⽐较简单。
使⽤KV语⾔来实现UI布局可以创建⼀个名为***.kv的⽂档实现,也可以在原来的.py⽂件中添加kivy.bulid.Builder.load_string()函数,在该函数中添加代码段。完整的程序如下:
from kivy.lang import Builder
Builder.load_string('''
<myLayout>
BoxLayout:
orientation:'vertical'
spacing:15
padding:38
Button:
id:0
text:'0'
size_hint:(.5, .5)
pos_hint:{"center_x": .5, "center_y": .5}
on__press_)
Button:
id:1
text:'1'
多重阴影攻略size_hint:(.5, .5)
pos_hint:{"center_x": .5, "center_y": .5}
on__press_)
Button:
id:2
text:'2'
size_hint:(.5, .5)
pos_hint:{"center_x": .5, "center_y": .5}
on__press_)
Button:
id:3
text:'3'
size_hint:(.5, .5)
pos_hint:{"center_x": .5, "center_y": .5}
on__press_)
Button:
id:4
text:'4'
size_hint:(.5, .5)
pos_hint:{"center_x": .5, "center_y": .5}
on__press_)
Button:
id:5
text:'5'
size_hint:(.5, .5)
pos_hint:{"center_x": .5, "center_y": .5}
on__press_)
Button:
id:6
text:'6'
size_hint:(.5, .5)
pos_hint:{"center_x": .5, "center_y": .5}
on__press_)
''')google翻译为什么没有声音了
class myLayout(BoxLayout):
def__init__(self,**kwargs):
super(myLayout, self).__init__(**kwargs)
def on_press_button(self, instance):
print('你按下了{}键'.format(instance))
python入门教程资料class boxLayoutExample(App):
def build(self):
return myLayout()
php workerman⽤以上的代码段与之前不⽤KV语⾔的代码段的UI和功能完全相同,⼤家可以运⾏⼀下试试。需要注意创建的myLayout类中继承
了BoxLayout,并且在主App类的build()函数中要返回myLayout类,这样kivy才知道布置的UI是哪个。
细⼼的同学可以发现,在KV语⾔中定义的按钮中添加了id的属性,有了这个属性后就可以通过self.ids['id']来对相应的部件进⾏操作,虽然本次的例⼦中没有⽤到,但后⾯的例⼦会⽤到,在此先做个铺垫。⽤了KV语⾔的好处就是UI布置起来更直观,更符合易读,缺点就是很多功能相同的代码段重复出现,虽然可以复制粘贴,但毕竟还是体⼒活。在实际应⽤中⼤家可以根据⾃⼰的需求选择⽤或者不⽤KV语⾔。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论