Python__模块(界面-开发)__kivy(代码实践)

基本使用

第一个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()

代码运行


猜你喜欢

转载自blog.csdn.net/werdasooooo/article/details/135029281