Kivy 简明教程_on_release kivy-程序员宅基地

技术标签: kivy  Python  

 

几个月不写中文了, 感觉还行。 So, let's begin our journey.


首先,有两个网址你不得不看:

  1. Kivy: Cross-platform Python Framework for NUI
    在官网逛逛,顺便看看最下面的代码,try to run it.

  2. https://www.youtube.com/playlist?list=PLQVvvaa0QuDe_l6XiJ40yGTEqIKugAdTy
    sentdex大神的入门级教程。


Kivy总体思想是:kv代码管界面,python代码管逻辑。

然后重点来了, 我主要讲三件事:(kv访问Python;Python访问kv;窗口)。


一阶段:

1.Python访问kv

Python可以直接调用kv代码。如:

from kivy.app import App
from kivy.lang import Builder

kv = Builder.load_string('''
Button:
    text: "I was created by kv codes"
''')

class TestApp(App):
    def build(self):
        return kv

TestApp().run()

2.窗口

kv代码中被<>包裹住的是某个class的名字,这个class需在python代码中声明,它们代表同一个class。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    Label:
        text: "My mother screen was created by kv and python codes."
''')

class OneScreen(Screen):
    pass

class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

3. kv访问Python

在.kv文件或kv代码里,root只代表其上层被<>包裹住的类。如:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    Button:
        text: 'Click me'
        on_release: print(root.__class__)
''')

class OneScreen(Screen):
    pass

class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

二阶段:

1. kv访问Python

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    BoxLayout:
        Button:
            text: 'Click me'
            on_release: root.do_something()
        Button:
            text: 'Who made this?'
            on_release: print(root.author)
''')

class OneScreen(Screen):
    def __init__(self, **kwargs):
        self.author = 'yingshaoxo'
        super(OneScreen, self).__init__(**kwargs)
        
    def do_something(self):
        print('2333')

class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

2. Python访问kv

你需要给kv组件一个id,用以标明其唯一性。再使用ids方法调用它。如:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    BoxLayout:
        Button:
            id: one_ask
            text: 'Who made this?'
            on_release: root.do_something()
''')

class OneScreen(Screen):
    def __init__(self, **kwargs):
        self.author = 'yingshaoxo'
        super(OneScreen, self).__init__(**kwargs)
        
    def do_something(self):
        self.ids['one_ask'].text = self.author

class TestApp(App):
    def build(self):
        return OneScreen()

TestApp().run()

3. 窗口

As far as I see,在做程序的时候,你会遇到很多窗口。所以ScreenManager这时候派上用场了。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager

Builder.load_string('''
<ScreenManager>:
    Screen:
        name: 'home'
        Button:
            text: 'Go to another screen'
            on_release: root.current = 'another'
            
    Screen:
        name: 'another'
        Button:
            text: "Go back home"
            on_release: root.current = 'home'
''')

class ScreenManager(ScreenManager):
    pass

class TestApp(App):
    def build(self):
        return ScreenManager()

TestApp().run()

三阶段:

1+2. 窗口、kv访问Python

In fact, 你可以把ScreenManager看成一个很大的widget

但如果所有的数据操作(root.function)都在一个 ScreenManager class里做的话显然不科学。

所以我们最好把每个窗口都在Python里声明一个class,这样既可以有程序启动时的总操作,又可以有各个子窗口的分操作。看示例:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_string('''
<ScreenManager>:
    HomeScreen
    AnotherScreen

<HomeScreen>:
    name: 'home'
    Button:
        text: 'Go to another screen'
        on_release: root.manager.current = 'another'

<AnotherScreen>:
    name: 'another'
    Button:
        text: "Go back home"
        on_release: root.manager.current = 'home'
''')

class ScreenManager(ScreenManager):
    pass

class HomeScreen(Screen):
    pass

class AnotherScreen(Screen):
    pass

class TestApp(App):
    def build(self):
        return ScreenManager()

TestApp().run()

我们可以看到示例不光在kv代码中绑定了两个Screenclass,还引用了一个root.manager。没错,那是从screen class得到screenmanager class的方法。

3. Python访问kv

直接用kv代码预先定义控件(如按钮)的行为有时不能满足我们的需求,于是我们可能需要临时改变按钮的行为:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

from time import gmtime, strftime # this equls cv codes #...

Builder.load_string("""
#:import gmtime time.gmtime
#:import strftime time.strftime

<RootWidget>
    BoxLayout:
        orientation: 'vertical'
        Button:
            id: change_itself
            text: 'I can change myself'
            on_release: root.ids['change_itself'].text = strftime("%a, %d %b %Y %H:%M:%S", gmtime())
        Button:
            id: change_all
            text: 'I can change our behavior'
            on_release: root.change_all()
""")

class RootWidget(Screen):
    def change_all(self):
        print(self.ids)
        for instance_class in self.ids.values():
            instance_class.text = 'Exit'
            instance_class.bind(on_release=exit)

class TestApp(App):
    def build(self):
        return RootWidget()

if __name__ == '__main__':
    TestApp().run()

四阶段:

1. kv访问Python

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

Builder.load_string('''
<OneScreen>
    Label:
        text: app.saying
''')

class OneScreen(Screen):
    pass

class TestApp(App):
    def __init__(self, **kwargs):
        self.saying = 'I was read from app instance.'
        super(OneScreen, self).__init__(**kwargs)

    def build(self):
        return OneScreen()

TestApp().run()

五阶段:Show time!

还想什么呢?赶紧动手写程序吧~


For more information, you can go and see:

https://kivy.org/docs/api-kivy.uix.screenmanager.html

https://github.com/yingshaoxo/kivy-chat

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ficre/article/details/89637104

智能推荐

YOLO-Darknet实战(七):Ubuntu下QT自建YOLOv4工程(C++版本)_darknet c++ ubuntu-程序员宅基地

文章浏览阅读1.2k次,点赞5次,收藏6次。全网最全YOLO-Darknet实战教程!_darknet c++ ubuntu

C#中汉字转区位码-程序员宅基地

文章浏览阅读511次,点赞8次,收藏7次。区位码是一个4位的十进制数,每个区位码都对应着一个唯一的汉字,区位码的前两位叫做区码,后两位叫做位码。

Oracle 使用SQL*Loader导入文本数据_oracle通过使用sql*loader导入csv文件数据-程序员宅基地

文章浏览阅读1.9k次。把txt或者csv文件导入oracle最方便的方法是通过plsql的文本导入器导入,但是导入大批量数据时文本导入器效率慢,可以使用oracle命令行sqlldr导入更快速。replace :删除旧记录(等价delete from table语句),替换成新导入的记录;truncate:删除旧记录(等价truncate table语句),替换成新导入的记录;其中ctl就是控制文件,log是日志,userid是oracle的用户和密码。数据文件就是你的txt或者csv文本文件,控制文件是你写的命令。_oracle通过使用sql*loader导入csv文件数据

快速排序_qsort排序结构-程序员宅基地

文章浏览阅读3.2k次。 快速排序(Quicksort)是一種眾所周知的排序算法,由C. A. R. Hoare所發展的,以平均效能來說,排序 n 個項目要Θ(n log n)次比較。然而,在最壞的效能下,它需要Θ(n2)次比較。一般來說,快速排序實際上明顯地比其他Θ(n log n) 演算法更快,因為它的內部回圈(inner loop)可以在大部分的架構上很有效率地被實作出來,且在大部分真實世界的資料,可以決定設計的選_qsort排序结构

清除win7或win10系统垃圾文件2023.7.12_win7 professional版本 垃圾文件清理-程序员宅基地

文章浏览阅读102次。清除系统垃圾文件_win7 professional版本 垃圾文件清理

【驱动】网卡驱动·linux内核网络分层结构-程序员宅基地

文章浏览阅读133次。原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://liucw.blog.51cto.com/6751239/1221140Preface Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。 Linux内核采用分层结构处理网络数据包。分层结构与网络协议的结构匹..._网卡驱动程序可以有内核实现 也可以有用户层实现的 但只能同时有一个接管网卡

随便推点

FileUploadException: Stream closed-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏5次。springboot升级到2.3.4.RELEASE后,上传文件报FileUploadException,因使用logback过滤器引起,解决方案,增加以下配置。spring:  mvc: hiddenmethod: filter: enabled: true _fileuploadexception: stream closed

ext4文件系统镜像制作教程_3519dv500 emmc 使用ext4格式的镜像制作-程序员宅基地

文章浏览阅读47次。ext4文件系统镜像制作教程 - 小蓝博客dd if=/dev/zero of=image.img bs=1M count=1024mkfs.ext4 image.imgmkdir ~/workmount -o loop image.img $HOME/work_3519dv500 emmc 使用ext4格式的镜像制作

大模型中的数据_大模型样本数据质量 csdn-程序员宅基地

文章浏览阅读70次。数据是基础大模型的生命线;这些模型的训练数据在很大程度上决定了这些模型可以获得哪些功能。数据的中心性并不是基础大模型所独有的;最近对以数据为中心的人工智能的呼吁表明了管理、理解和记录用于训练机器学习模型的数据的普遍重要性。具体而言,对于基础大模型,目前的做法是使用未指定或不明确的原则选择训练数据,并且训练数据的性质普遍缺乏透明度。我们认为,需要一种替代方法来重新构想围绕基础模型的数据生态系统:我们利用数据可视化和管理方面的工作,为基础模型提出一个数据中心。_大模型样本数据质量 csdn

Error parsing XML: junk after document element这样的错误_invalid roslaunch xml syntax: junk after document -程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏2次。很多开发者可能在编写XML布局文件时提示Error parsing XML: junk after document element这样的错误,这里Android123提示大家一般合法的XML文件只有一个主根节点,比如&lt;android12..._invalid roslaunch xml syntax: junk after document element: line 29, column 0

linux系统时区、日期、时间的查看和修改_linux 获取时区时间差-程序员宅基地

文章浏览阅读3.4k次。修改时区$ sudo cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime#在中国可以使用:$ sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime查看日期和时间$ date -R #Fri, 09 Dec 2016 14:24:07 +0800$ date -R "+%Y-%m-%d %H:_linux 获取时区时间差

Throwable异常和处理异常的方案(try……catch……finally;throws)_try catch throwable-程序员宅基地

文章浏览阅读877次。Throwable异常的概念java程序出现了不正常的现象,异常主要分为两大类Exception和ErrorError表示非常严重的错误,一般情况下我们无法自己处理,那就不处理。Exception异常有两类,一类是RuntimeException,表示运行时期异常,这样的异常一般是由于代码逻辑不够严谨导致的,可以按照编译时期异常的处理方式去处理,另外一种是非RuntimeException异常,叫做编译时期异常,一定要处理,如果不处理,编译不通过,程序无法运行处理异常的方式1.try……_try catch throwable