基本使用
第一个demo
from kivy.app import App
from kivy.uix.label import Label
# 界面标题名以class名称为命名
class demo(App):
def build(self):
return Label(text="Hello world")
if __name__ == "__main__":
demo().run()
代码运行
按钮
添加按钮
from kivy.app import App
# from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
class Box(FloatLayout):
def __init__(self):
super().__init__()
# 添加一个按钮
self.button = Button(
text = 'Test Button',
# size_hint=[0.2,0.1], # 相对尺寸,使用盒子布局会失效
# size_hint_x=0.5,
# size_hint_y=0.5,
size_hint=[None,None],# 使用固定尺寸,需要设置为None
size=[200,100],
# pos=[100,300] # 固定坐标边距
pos_hint={'x':0.35,'y':0.5}
)
# 将按钮添加至 布局
self.add_widget(self.button)
class demo(App):
def build(self):
return Box()
if __name__ == '__main__':
demo().run()
代码运行
按钮背景图设置
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
class ButtonTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
# 创建一个按钮
self.button = Button(
text='',
size=[100, 100],
size_hint=[None, None],
pos=[300, 300],
# background_color='#0010ff',# (1,1,1,1)
font_size='25px',
color=(0.9,0.9,0.9,1), # rgba 百分比 0~1
state='down', # 按钮的状态, normal|down
# disabled=False, # 禁用否,默认False
background_down='./pt1.jpg' # 按钮图片
)
# 将按钮添加到布局
self.add_widget(self.button)
class demoApp(App):
def build(self):
return ButtonTest()
if __name__ == '__main__':
demoApp().run()
代码运行
按钮触发事件
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
class ButtonTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
# 创建一个按钮
self.button = Button(
text='Event',
size=[100, 100],
size_hint=[None, None],
pos=[300, 300],
# background_color='#0010ff',# (1,1,1,1)
font_size='25px',
color=(0.9,0.9,0.9,1), # rgba 百分比 0~1
)
# 事件绑定
self.button.bind(on_press=self.MouseDown)
self.button.bind(on_release=self.MouseUp)
# 将按钮添加到布局
self.add_widget(self.button)
def MouseDown(self,button): # 必填项:空的参数
print('button参数 : ',button.text)
print('按钮状态 : 按下')
def MouseUp(self,bt):
print('按钮状态 : 松开')
class demoApp(App):
def build(self):
return ButtonTest()
if __name__ == '__main__':
demoApp().run()
代码运行
标签
添加标签
文件名(demo.py)
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class LabelTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def event_1(self, label):
print("事件1触发...")
def event_2(self, label):
print("事件2触发...")
class testApp(App):
def build(self):
return LabelTest()
if __name__ == "__main__":
testApp().run()
文件名(test.kv)
<LabelTest>:
Label:
text:"[s]Tag[ref=label] click[/ref][/s]"
font_size:'50px'
text_size:(250,50)
color:(0.9,0.9,0.9,1)
# 需要标记文本,设置为True
markup:True
on_ref_press:
root.event_1(self)
root.event_2(self)
代码运行
字体
加载中文字体
# 中文乱码(加载中文字体)
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class Box(BoxLayout):
def __init__(self):
super().__init__()
# 添加一个按钮
self.button = Button(
text = '这是一个中文按钮',
# 加载中文字体
# font_name='../font/NotoSansSC-Regular.otf'
)
# 将按钮添加至布局
self.add_widget(self.button)
class demo(App):
def build(self):
return Box()
if __name__ == '__main__':
demo().run()
kivy代码文件
前后端分离
文件名(demo.py)
# 前后端分离-kv文件的使用
# kivy文件的使用
'''
kv文件命名 必须跟类名相同
例子:
class : class demo
kv文件 : demo.kv
'''
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
# from kivy.uix.button import Button
# 方法1-kv布局
class Box(BoxLayout):
pass
# 方法2-代码布局
'''
class Box(BoxLayout):
def __init__(self):
super().__init__()
# 添加一个按钮
self.button = Button(
text = 'Test Button'
)
# 将按钮添加至 布局
self.add_widget(self.button)
'''
class demo(App):
def build(self):
return Box()
if __name__ == '__main__':
demo().run()
文件名(demo.kv)
# Box 相当于一个页面
<Box>:
BoxLayout:
Button:
text:"App"
font_size:"50px"
代码运行
布局风格
文件名(demo.py)
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
class Box(FloatLayout):
def __init__(self):
super().__init__()
# 添加一个按钮
'''
self.button = Button(
text = 'Test Button',
size_hint=[0.2,0.2],
pos_hint={'x':0.2,'y':0.5}
)
'''
# 将按钮添加至 布局
'''
self.add_widget(self.button)
'''
class demo(App):
def build(self):
return Box()
if __name__ == '__main__':
demo().run()
文件名(demo.kv)
<Box>:
Button:
text : 'Button1'
size_hint : [0.15,0.1]
pos_hint : {'x':0.1,'y':0.6}
<Box>:
Button:
text : 'Button2'
size_hint : [0.15,0.1]
pos_hint : {'x':0.3,'y':0.6}
代码运行
控件
多选框
文件名(demo.py)
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class CheckBoxTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
# 使用id绑定事件
self.ids.TestSelect.bind(active=self.event)
def event(self, checkBox, active):
print("事件触发...")
print(checkBox)
print("选中状态:", active)
class demoApp(App):
def build(self):
return CheckBoxTest()
if __name__ == "__main__":
demoApp().run()
文件名(demo.kv)
<CheckBoxTest>:
CheckBox:
id:TestSelect
# 复选框颜色
color:'yellow'
# 选中状态
active:True
# 转换为圆形样式
group: 'xxx'
pos:[-50,100]
Label:
text:'Select Item'
pos:350,350
代码运行
输入框
from kivy.app import App
from kivy.uix.textinput import TextInput
class demo(App):
def build(self):
textinput=TextInput(text="Hello World")
textinput.size_hint=[None,None]
textinput.size=[300,30]
textinput.pos=[250,300]
return textinput
if __name__ == "__main__":
demo().run()
代码运行
switch开关
文件名(demo.py)
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class SwitchTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def event(self,ctr):
print(ctr.active)
class demoApp(App):
def build(self):
return SwitchTest()
if __name__ == '__main__':
demoApp().run()
文件名(demo.kv)
<SwitchTest>:
Switch:
# 活动状态
active:True
on_active:root.event(self)
代码运行
滑块
文件名(demo.py)
'''
事件
on_touch_down 点击触发
on_touch_up 释放触发
on_touch_move
'''
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class SliderTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def event(self,slider):
print('获取滑块数值',slider.value)
class demoApp(App):
def build(self):
return SliderTest()
if __name__ == '__main__':
demoApp().run()
文件名(demo.kv)
<SliderTest>:
# 滑块
Slider:
# 水平滑块 horizontal 垂直滑块 vertical
orientation:'vertical'
# 设置取值范围
range:(0,100)
# 步长
step:1
# 初始值
value:50
# 显示滑块轨迹否
value_track:True
value_track_color:'yellow'
# 绑定事件
on_touch_down:root.event(self)
代码运行
定时器
文件名(demo.py)
'''
schedule_once(callback) 马上执行回调函数
schedule_once(callback,seconds) 多少秒后执行回调函数
schedule_interval(callback,seconds) 每个seconds秒执行一次
'''
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
from functools import partial
class SliderTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def click(self,slider):
print('滑块数值:',slider.value)
# 延迟3秒后触发
Clock.schedule_once(self.timer,3)
# 2秒执行一次
test=2
Clock.schedule_interval(partial(self.range_fc,test),2)
def timer(self,clock):
print('定时器触发:...',clock)
def range_fc(self,clock,param):
print('======>',clock,param)
return True # False 定时器被取消
class demoApp(App):
def build(self):
return SliderTest()
if __name__ == '__main__':
demoApp().run()
文件名(demo.kv)
<SliderTest>:
# 滑块
Slider:
# 水平滑块 horizontal 垂直滑块 vertical
orientation:'vertical'
# 设置取值范围
range:(0,100)
# 步长
step:1
# 初始值
value:50
# 显示滑块轨迹否
value_track:True
value_track_color:'yellow'
# 绑定事件
on_touch_down:root.click(self)
代码运行
进度条
文件名(demo.py)
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class ProgressBarTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class demoApp(App):
def build(self):
return ProgressBarTest()
if __name__ == '__main__':
demoApp().run()
文件名(demo.kv)
<ProgressBarTest>:
ProgressBar:
# 初始值
# value:50
# 最大值
# max:200
# 设置0~1之间的值
value_normalized:0.5
代码运行
图片
加载图片
文件名(demo.py)
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class ImageTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class demoApp(App):
def build(self):
return ImageTest()
if __name__ == '__main__':
demoApp().run()
文件名(demo.kv)
<ImageTest>:
Image:
source: './pt.webp'
# 设置为True,图片拉伸最大
allow_stretch:True
代码运行
异步加载图片
文件名(demo.py)
# 准备小图,大图,网页在线图
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
class AsyncImageTest(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
class demoApp(App):
def build(self):
return AsyncImageTest()
if __name__ == '__main__':
demoApp().run()
文件名(demo.kv)
<AsyncImageTest>:
BoxLayout:
Image:
source: 'pt1.jpg'
# 异步加载图片
AsyncImage:
source: 'pt2.webp'
# 异步加载网络图片
AsyncImage:
source: 'https://images.alphacoders.com/103/103533.jpg'
代码运行
视频
加载视频
# 加载video视频
'''
state play|pause|stop默认
duration 视频时长,默认为-1
position 视频位置,0~duration之间,默认为-1
eos 视频是否已完成播放,默认为False
loaded 是否已加载视频并准备好播放,默认为False
options 用于创建视频核心对象的选项,默认为{}
unload 卸载视频,播放将停止
volume 视频的音量,0~1,默认0,表示静音
'''
from kivy.app import App
from kivy.uix.video import Video
class demo(App):
def build(self):
video = Video(source='C:/Users/Administrator/Desktop/movie.mp4')
video.state='play'
video.options = {'eos': 'loop'}
video.allow_stretch=True
video.bind(position=self.mv_position,duration=self.mv_duration)
return video
def mv_position(self,video,position):
print('==>',video,position)
def mv_duration(self,value,position):
print(value,position)
if __name__ == '__main__':
demo().run()
代码运行