Kivy 简明教程

Kivy 简明教程几个月不写中文了 感觉还行 So let sbeginourjou 首先 有两个网址你不得不看 Kivy Cross platformPyth 在官网逛逛 顺便看看最下面的代码 trytorunit https www youtube com playlist list PLQVvvaa0Qu

 

几个月不写中文了, 感觉还行。 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(''' 
     
       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(''' 
     
       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(''' 
      
        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(''' 
      
        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(''' 
      
        : 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(''' 
       
         : HomeScreen AnotherScreen 
        
          : name: 'home' Button: text: 'Go to another screen' on_release: root.manager.current = 'another' 
         
           : 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 
       
         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(''' 
        
          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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218881.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:15
下一篇 2026年3月17日 下午11:15


相关推荐

  • Inno Setup:x64 vs x86

    Inno Setup:x64 vs x86BydefaultInnoSetupalwaysinstallsyourapplicationin32-bitmode.Butifyourapplicationiscompiledto64-bitbinaries(atleast,partly)youwill,probably,wanttouse64-bitmode.Firstthin

    2022年6月7日
    39
  • WPF依赖属性(wpf 依赖属性)

    一、什么是依赖属性依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值。依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。将所有的属性都设置为依赖属性并不总是正确的解决方案,具体取决于其应用场景。有时,使用私有字段实现属性的典型方法便能满足要求。MSDN中给出了下面几种应用依赖属性的场景:1.希望可在样式中设置属性。2.希望属性支持数据绑定。3.希望可使…

    2022年4月11日
    32
  • springsecurity官网_log4j.properties配置

    springsecurity官网_log4j.properties配置由于项目框架古老spring3.0springsecurity2.0.4,但功能齐全,所以个人想要升级各个jar包版本,以减少不必要的已知bug目标更换为springsecurity4.2springdata换为最新问题1:spring版本不匹配,jar包冲突这个是最好解决的,先把springsecurity做最基础配置,换几个理论上兼容的spring版本试试就行,最终选定…

    2022年5月3日
    57
  • lua编写游戏脚本教程_ps2游戏转ps4pkg

    lua编写游戏脚本教程_ps2游戏转ps4pkg先扫盲WQSG是干什么用的一些掌机类游戏汉化比方PSPNDS汉化必备之物它能够依据字典转换文本假设你不知道这是啥玩意,快去充电染成茜色的坂道文本提取(导出)方法(下文称导出文章)在导出文章,我

    2022年8月4日
    16
  • Claude Code 从 0 到 1 实战全攻略:掌握下一代编程 Agent 的核心能力

    Claude Code 从 0 到 1 实战全攻略:掌握下一代编程 Agent 的核心能力

    2026年3月16日
    2
  • MMC卡驱动分析

    MMC卡驱动分析MMC卡驱动分析 最近花时间研究了一下MMC卡驱动程序,开始在网上找了很多关于MMC卡驱动的分析文章,但大都是在描述各个层,这对于初学者来讲帮助并不大,所以我就打算把自己的理解写下来,希望对大家有用。个人觉得理解LINUX内核当中MMC/SD卡驱动程序构架是学习MMC卡驱动程序的重点,只有理解了它的基本框架或流程才能真正理解一个块设备驱动程序的写法,同时才能真正理

    2022年4月28日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号