【Kivy】基于Kivy实现倒计时(心流状态)

心流状态介绍

在这里插入图片描述

Kivy介绍

能够全平台开发App,支持windows,macos,linux,安卓等等
PS:本文的窗口 保持在最前功能,调用了KivyOnTop,只支持Windows,

Kivy安装

参考python编程(Kivy 安装及使用教程)

python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew
python -m pip install kivy.deps.gstreamer
python -m pip install kivy
""" test.py
	from kivy.app import App
	from kivy.uix.button import Button
	class TestApp(App):
	    def build(self):
	        return Button(text='iPaoMi') 
	TestApp().run()
"""
python test.py
# 可选(窗口保持最前,仅支持windows)
pip install pywin32

心流代码效果

在桌面正上方出现一个简单的计时器,点击就会倒计时,再次点击就会重置。
在这里插入图片描述

心流代码

# test.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from time import time
from kivy.core.window import Window
from kivy.properties import StringProperty
from functools import partial
from kivy.lang import Builder
from kivy.config import Config
from kivy.core.window import Window
Config.set('graphics', 'resizable', 0)
from kivy.uix.screenmanager import ScreenManager, Screen
try:
    from KivyOnTop import register_topmost
except Exception as e:
    print("ERROR FOR KivyOnTop ", e)
    def register_topmost(*args):
        pass
import tkinter
tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()

Window.size = (240, 60)
Window.top = 0
Window.left = width//2 - Window.size[0]//2

Builder.load_string('''
<InputScreen>: 
    BoxLayout:
        orientation: 'vertical'
        spacing:0
        padding:0
        BoxLayout:
            orientation: 'horizontal'
            spacing:0
            Button:
                id:start
                font_size:'24sp'
                text:'start/reset'
                on_press:root.start()
''')

class InputScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.mental_flow_time = 30
        self.reset()

    def setTime(self, stop_time, key):
        self.interval = abs(time() - stop_time)
        hours = int(self.interval / 60 / 60)
        mins = int((self.interval - hours * 60 * 60) / 60)
        seconds = int(self.interval - hours * 60 * 60 - mins * 60)
        self.ids["start"].text = "{:0>2d}:{:0>2d}:{:0>2d}".format(hours, mins, seconds)

    def start(self):
        if self.running:
            self.reset()
        else:
            self.event = Clock.schedule_interval(partial(self.setTime, time() + self.mental_flow_time * 60), 0.1)
            self.running = True

    def reset(self):
        self.running = False
        self.ids["start"].text = "{} min".format(self.mental_flow_time)
        if hasattr(self, "event"):
            self.event.cancel()
            self.running = False

class MyApp(App):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.title = '心流'
    def build(self):
        return InputScreen()
    
if __name__ == '__main__':
    app = MyApp()
    register_topmost(Window,str(app.title))
    app.run()

python test.py