Kivy基础笔记
环境配置
安装Virtualenv
打开CMD
安装virtualenv
pip install virtualenv
切换目录
切换到你的工作位置
创建虚拟环境
virtualenv kv-demo-env
kv-demo-env是解释器
为编译器设置虚拟环境解释器
安装Kivy
(如需版本更替,只需将对应依赖项版本号更改为所需版本号即可)
安装依赖项
python -m pip install docutils pygments pypiwin32 kivy_deps.sdl2==0.1.22 kivy_deps.glew==0.1.12
安装gstreamer
python -m pip install kivy_deps.gstreamer==0.1.17
安装angle
python -m pip install kivy_deps.angle==0.1.9
安装Kivy
python -m pip install kivy==2.0.0
安装示例
python -m pip install kivy_examples=1.11.1
大小与位置
大小
size_hint的值(0~1),可以将控件的大小设置为当前窗口的比值
size用于将一个控件的大小固定,所以需要width,height的值
(注: 使用时需要将size_hint设置为[None,None])
位置
pos_hint可以将位置以一个字典比值(0~1)来设置(以窗口左下角作为起点(0,0)).
控件有三条线左边界x线,正中间center_x线,右边界right线,
y轴有上边界top线,正中间center_y线,下边界y线,
x,y线可以随意组合
如:pos_hint:{‘center_x’:0.5, ‘y’:0.7}
pos以对应数值(x,y)在当前窗口内寻找对应的点
八大布局
布局通用属性
属性 | 说明 | 值 |
---|---|---|
padding | 布局与子控件之间各方向填充值 | [value, value, value, value] |
spacing | 子控件与子控件之间填充值 | Value |
boder | 可以指定边界大小 | Value |
col_force_default | 是否强制使用默认列宽 | Bool |
col_default_width | 设置默认列宽 | Value |
row_force_default | 是否强制使用默认行高 | Bool |
row_default_width | 设置默认行高 | Value |
FloatLayout布局
作为浮动布局,它允许子部件以位置和尺寸放在窗口的随意位置,其优点是可以跟随设置分辨率自动调整大小,不会使你的布局看起来乱七八糟.
代码示例:
py文件
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class FloatLayoutWidget(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class FloatApp(App):
def build(self):
return FloatLayoutWidget()
if __name__ == "__main__":
FloatApp().run()
kv文件:
<BoxLayoutWidget>:
Button:
text:'bt0'
background_color:0,1,1,1
font_size:40
Button:
text:'bt1'
background_color:0,1,0,1
font_size:35
Button:
text:'bt2'
background_color:0,0,1,1
font_size:30
Button:
text:'bt3'
background_color:1,0,1,1
font_size:25
Button:
text:'bt4'
background_color:1,0,0,1
font_size:20
BoxLayout布局
盒子布局,可以(使用orientation)将子控件排版成水平排列(horizental)或垂直排列(vertical)的布局,如不设置任何大小,子控件会以10像素的间距平分父控件
padding与spacing适用所有布局
布局与子控件之间填充需使用padding,默认为[0,0,0,0]
子级和子级之间填充需使用spacing,默认为0
代码示例:
py文件:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class BoxLayoutWidget(BoxLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
class BoxApp(App):
def build(self):
return BoxLayoutWidget()
if __name__=="__main__":
BoxApp().run()
kv文件:
<BoxLayoutWidget>:
orientation:'vertical'
padding:[10,40,40,30]
Button:
text:'bt0'
background_color:0,1,1,1
font_size:40
Button:
text:'bt1'
background_color:0,1,0,1
font_size:35
Button:
text:'bt2'
background_color:0,0,1,1
font_size:30
BoxLayout:
orientation:'vertical'
spacing:20
Button:
text:'bt3'
background_color:1,0,1,1
font_size:20
Button:
text:'bt4'
background_color:1,0,0,1
font_size:20
AnchorLayout布局
锚点布局,可以(使用anchor_x和anchor_y设置位置)将子控件设置在
左上 中上 右上
左 中间 右
左下 中下 右下
九个位置上,注意:当设置位置后,同时添加两个子控件,会使两个子控件叠在一起
代码示例:
py文件:
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
class AnchorLayoutWidget(AnchorLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class AnchorApp(App):
def build(self):
return AnchorLayoutWidget()
if __name__ == "__main__":
AnchorApp().run()
kv文件:
<AnchorLayoutWidget>:
AnchorLayout:
anchor_x:'right'
anchor_y:'top'
Button:
text:'right and top'
size_hint:.2,.2
AnchorLayout:
anchor_x:'left'
anchor_y:'bottom'
Button:
text:'left and bottom'
size_hint:.2,.2
GridLayout布局
网格布局
,可以(使用列cols和行rows)将子控件设置成多行多列的矩阵,
注意:如果你不单一设置大小它们会很整齐
代码示例:
py文件:
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
class GridLayoutWidget(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class GridApp(App):
def build(self):
return GridLayoutWidget()
if __name__=='__main__':
GridApp().run()
kv文件:
<GridLayout>:
padding:30
spacing:30
# 可以将cols或rows的值修改查看效果
cols:3
col_force_default:True
col_default_width:120
row_force_default:True
row_default_width:40
Button:
text:'1'
size_hint_x:None
width:100px
Button:
text:'2'
Button:
text:'3'
Button:
text:'4'
PageLayout布局
分页布局,该布局的每个子控件都视为一个单独的界面,所以不支持使用size_hint和pos_hint
使用page可以设置默认先显示哪一页
swipe_threshold设置翻页灵敏度
anim_kwargs设置翻页动画和持续时间
border可以指定两边边界大小,默认50dp
代码示例:
py文件:
from kivy.app import App
from kivy.uix.pagelayout import PageLayout
class PageLayoutWidget(PageLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class PageApp(App):
def build(self):
return PageLayoutWidget()
if __name__=='__main__':
PageApp().run()
kv文件:
<PageLayoutWidget>:
anim_kwargs:{'d':10,'t':'linear'}
page:2
border:'100dp'
swipe_threshold:.8
BoxLayout:
Button:
text:'page 1'
background_color:(0.3,0.3,0.3,1)
BoxLayout:
Button:
text:'page 2'
background_color:(.9,.3,.3,1)
BoxLayout:
Button:
text:'page 3'
background_color:(.3,.9,.3,1)
BoxLayout:
Button:
text:'page 4'
background_color:(.3,.3,.9,1)
RelativeLayout布局
相对布局,它的定位属(x,y,conter_x.conter_y,right,top)性是相对于父控件的大小,而不是窗口大小
注:RelativeLayout不可以直接作为窗口创建
代码示例:
为了展示新技巧,单独使用py完成
py文件:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.boxlayout import BoxLayout
from kivy,graphics import Rectangle,Color
class MyButton(Button):
def __init__(self,**kwargs)
super().__init__(**kwargs)
self.font_size = 20
self.size_hint = [0.2,.2]
class BoxLayoutWidget(BoxLayout):
def __init__(self,**kwargs)
super().__init__(**kwargs)
with self.canvas:
Color(1,1,1,1)
self.rect = Rectangle(pos=self.pos,size=self.size)
self.bind(pos=self.update_rect,size=self.update_rect)
relative = RelativeLayout()
bt0 = MyButton(text='bt0',pos_hint={'right':1, 'top':1},background_color=(.2,.5,.4,1))
bt1 = MyButton(text='bt1',pos_hint={'x':0,'top':1},background_color=(.5,.3,.2,1))
bt2 = MyButton(text='bt2',pos_hint={'center_x':.5,'center_y':.5},background_color=(.4,.2,.2,1))
bt3 = MyButton(text='bt3',pos_hint={'x':0,'y':0},background_color=(.8,.7,.2,1))
bt4 = MyButton(text='bt4',pos_hint={'right':1,'y':0},background_color=(.4,.9,.3,1))
for i in [bt0,bt1,bt2,bt3,bt4]:
relative.add_widget(i)
self.add_widget(BoxLayout())
self.add_widget(relative)
def update_rect(self,*args):
self.rect.pos = self.pos
self.rect.size = self.size
class RelativeApp(App):
def build(self):
return BoxLayoutWidget()
if __name__ == '__main__':
RelativeApp().run()
ScatterLayout布局
未完待续…
下班
有没有一起学的