Kivy 教程

Kivy - 主页

Kivy 基础知识

Kivy - 入门 Kivy - 安装 Kivy - 架构 Kivy - 文件语法 Kivy - 应用程序 Kivy - Hello World Kivy - 应用生命周期 Kivy - 事件 Kivy - 属性 Kivy - 输入 Kivy - 行为

Kivy 按钮

Kivy - 按钮 Kivy - 按钮事件 Kivy - 按钮颜色 Kivy - 按钮大小 Kivy - 按钮位置 Kivy - 圆形按钮 Kivy - 禁用按钮 Kivy - 图片按钮

Kivy 小部件

Kivy -小部件 Kivy - 标签 Kivy - 文本输入 Kivy - 画布 Kivy - 线条 Kivy - 复选框 Kivy - 下拉列表 Kivy - 窗口 Kivy - ScrollView Kivy - 轮播 Kivy - 滑块 Kivy - 图像 Kivy - 弹出窗口 Kivy - 开关 Kivy - 旋转器 Kivy - 拆分器 Kivy - 进度条 Kivy - 气泡 Kivy - 选项卡式面板 Kivy - 散点图 Kivy - 手风琴 Kivy - 文件选择器 Kivy - 颜色选择器 Kivy - 代码输入 Kivy - 模态视图 Kivy - 切换按钮 Kivy - 相机 Kivy - 树形视图 Kivy - reStructuredText Kivy - 操作栏 Kivy - 视频播放器 Kivy - 模板视图 Kivy - VKeyboard Kivy - 触摸涟漪 Kivy - 音频 Kivy - 视频 Kivy - 拼写 Kivy - 效果 Kivy - 输入记录器 Kivy - OpenGL Kivy - 文本 Kivy - 文本标记 Kivy - 设置

Kivy 布局

Kivy - 布局 Kivy - 浮动布局 Kivy - 网格布局 Kivy - 框布局 Kivy - 堆栈布局 Kivy - 锚点布局 Kivy - 相对布局 Kivy - 页面布局 Kivy - 循环布局 Kivy - 布局中的布局

Kivy 高级概念

Kivy - 配置对象 Kivy - Atlas Kivy - 数据加载器 Kivy - 缓存管理器 Kivy - 控制台 Kivy - 动画 Kivy - MultiStroke Kivy - 时钟 Kivy - SVG Kivy - UrlRequest Kivy - 剪贴板 Kivy - 工厂 Kivy - 手势 Kivy - 语言 Kivy - 图形 Kivy - 绘图 Kivy - 打包 Kivy - Garden Kivy - 存储 Kivy - 矢量 Kivy - Utils Kivy - Inspector 工具 Kivy - 工具 Kivy - 日志 Kivy - 帧缓冲区

Kivy 应用程序和项目

Kivy - 绘图应用程序 Kivy - 计算器应用程序 Kivy - 秒表应用程序 Kivy - 相机处理 Kivy - 图像查看器 Kivy - 贝塞尔曲线 Kivy - 画布应力 Kivy - 圆形绘制 Kivy - 小部件动画 Kivy - 杂项

Kivy - 时钟

Kivy 框架中的 Clock 对象是一个全局事件调度程序。它用于以特定间隔安排和触发事件。要安排事件重复发生或一次性发生,它绑定到回调函数。您可以通过"dt"参数(即增量时间)获取调度和调用回调之间的时间间隔。

Clock 对象在"kivy.clock"模块中定义。它由"schedule_once()"和"schedule_interval()"等方法组成,用于注册要在一定延迟后或定期调用的函数或方法。此机制可用于处理应用中的定时事件、动画更新和其他重复任务。

函数"schedule_interval()"和"schedule_once()"都有两个参数;回调和以秒为单位的时间间隔。

from kivy.clock import Clock

def clock_callback(dt):
   "Clock event occurred"
   
# 每 2 秒调用一次 clock_callback
Clock.schedule_interval(clock_callback, 2)

# 每 5 秒调用一次 clock_callback
Clock.schedule_once(clock_callback, 5)

timeout dt 参数的默认值为 0。因此,为了尽早调用回调函数,请将第二个参数设置为计划事件为 0,或者不使用该参数来使用默认值。

Clock.schedule_once(my_callback)

使用"-1"的超时会导致事件在下一帧之前发生,而将其设置为 0 会导致事件在下一帧之后发生。

触发的事件

Clock 对象可以使用以下函数触发时钟事件 −

  • schedule_interval(callback, ti​​meout) − 此函数安排每隔指定秒调用一次事件。该函数返回一个 ClockEvent 对象。在返回的事件上调用 ClockEvent.cancel() 取消安排事件。

  • schedule_once(callback, ti​​meout=0) − 此函数安排事件在指定的秒数内一次性执行,并返回 ClockEvent 对象。如果未指定 timeout 或为 0,则在渲染下一帧后调用回调。要取消事件,请在返回的事件上调用 ClockEvent.cancel()。

  • create_trigger(callback, ti​​meout=0) − 此函数创建一个触发事件。与其他两个函数不同,事件不会自动安排,您需要调用它。与其他两个函数一样,在执行事件之前,通过调用 ClockEvent.cancel() 取消事件。要再次安排它,只需调用事件 (event())。

create_trigger() 函数具有以下参数 −

  • callback − 要执行的回调。来自 kivy。它需要一个 timeout 参数来指定在调用回调之前要等待多长时间。

  • interval − 一个 bool 参数指示是否应调用一次 (False) 或重复调用回调。

from kivy.clock import Clock
def clock_callback(dt):
   "Clock event occurred"
triggerevent = Clock.create_trigger(clock_callback, 5)
triggerevent()

要取消通过上述任一方式创建的事件,请使用 event.cancel() 或 event.unschedule() 方法。

示例

以下代码在 Kivy 应用程序窗口上运行倒计时器。"kv"脚本将 TextInput 框、标签和按钮放在一列网格布局中。

<clockwidget>:
   GridLayout:
      cols:1
      size:root.size
      TextInput :
         font_size : '30pt'
         id:t1
         halign:'center'
         valign:'center'
      Label:
         id: l1
         text : 'Current Value: '
         font_size : '20pt'
      
      Button :
         id:b1
         text : 'Start Countdown'
         font_size:20

布局类clockwidget继承自GridLayout,并将命令按钮绑定到一种方法,该方法安排一个周期性事件在每一秒后发生。

每次调用回调时,标签都会显示递减的数字,从用户在文本框中输入的值开始。当它达到0时,该事件将被其cancel()方法取消安排。

class clockwidget(GridLayout):
   def __init__(self, *args):
      super(*args).__init__()
      self.ids.b1.bind(on_press=self.showtime)

   def countdown(self, dt):
      if self.val==0:
         self.ids.l1.text="Countdown Stopped"
         self.ids.l1.color=[1,0,0]
         self.ev.cancel()
         self.ids.b1.disabled=False
      else:
         self.ids.l1.text="Current Value: {}".format(self.val)
         self.ids.l1.color=[1,1,1]
         self.val=self.val-1
         
   def showtime(self, *args):
      self.val=int(self.ids.t1.text)
      self.ev=Clock.schedule_interval(self.countdown, 1)
      self.ids.b1.disabled=True

本练习的完整代码如下 −

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.clock import Clock
from kivy.core.window import Window

Window.size = (720, 400)

class clockwidget(GridLayout):
   def __init__(self, *args):
      super(*args).__init__()
      self.ids.b1.bind(on_press=self.showtime)
      
   def countdown(self, dt):
      if self.val == 0:
         self.ids.l1.text = "Countdown Stopped"
         self.ids.l1.color = [1, 0, 0]
         self.ev.cancel()
         self.ids.b1.disabled = False
      else:
         self.ids.l1.text = "Current Value: {}".format(self.val)
         self.ids.l1.color = [1, 1, 1]
         self.val = self.val - 1
   def showtime(self, *args):
      self.val = int(self.ids.t1.text)
      self.ev = Clock.schedule_interval(self.countdown, 1)
      self.ids.b1.disabled = True
      
class clockdemoapp(App):
   def build(self):
      w = clockwidget()
      w.cols = 1
      return w
      
clockdemoapp().run()

输出

当您运行此程序时,它将显示以下应用程序窗口。 输入倒计时器的值,然后单击"开始"按钮。

Kivy 时钟

标签开始更新,减少倒计时值的数量。

Kivy 时钟开始

当它达到"0"时,按钮将再次启用。

Kivy 时钟停止