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 时钟停止