Making a clock in kivy

后端 未结 2 1843
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-06 02:11

I\'m new to Kivy, and I\'m trying to get a better handle on Events, as well as a few basics of the framework.

For that purpose, can anyone provide the code for a sim

相关标签:
2条回答
  • 2020-12-06 02:16

    What about a simple graphical one:

    from kivy.app import App
    from kivy.uix.widget import Widget
    from kivy.graphics import Color, Line
    from kivy.uix.floatlayout import FloatLayout
    from math import cos, sin, pi
    from kivy.clock import Clock
    from kivy.lang import Builder
    from kivy.properties import NumericProperty
    
    import datetime
    
    kv = '''
    #:import math math
    
    [ClockNumber@Label]:
        text: str(ctx.i)
        pos_hint: {"center_x": 0.5+0.42*math.sin(math.pi/6*(ctx.i-12)), "center_y": 0.5+0.42*math.cos(math.pi/6*(ctx.i-12))}
        font_size: self.height/16
    
    <MyClockWidget>:
        face: face
        ticks: ticks
        FloatLayout:
            id: face
            size_hint: None, None
            pos_hint: {"center_x":0.5, "center_y":0.5}
            size: 0.9*min(root.size), 0.9*min(root.size)
            canvas:
                Color:
                    rgb: 0.1, 0.1, 0.1
                Ellipse:
                    size: self.size     
                    pos: self.pos
            ClockNumber:
                i: 1
            ClockNumber:
                i: 2
            ClockNumber:
                i: 3
            ClockNumber:
                i: 4
            ClockNumber:
                i: 5
            ClockNumber:
                i: 6
            ClockNumber:
                i: 7
            ClockNumber:
                i: 8
            ClockNumber:
                i: 9
            ClockNumber:
                i: 10
            ClockNumber:
                i: 11
            ClockNumber:
                i: 12
        Ticks:
            id: ticks
            r: min(root.size)*0.9/2
    '''
    Builder.load_string(kv)
    
    class MyClockWidget(FloatLayout):
        pass
    
    class Ticks(Widget):
        def __init__(self, **kwargs):
            super(Ticks, self).__init__(**kwargs)
            self.bind(pos=self.update_clock)
            self.bind(size=self.update_clock)
    
        def update_clock(self, *args):
            self.canvas.clear()
            with self.canvas:
                time = datetime.datetime.now()
                Color(0.2, 0.5, 0.2)
                Line(points=[self.center_x, self.center_y, self.center_x+0.8*self.r*sin(pi/30*time.second), self.center_y+0.8*self.r*cos(pi/30*time.second)], width=1, cap="round")
                Color(0.3, 0.6, 0.3)
                Line(points=[self.center_x, self.center_y, self.center_x+0.7*self.r*sin(pi/30*time.minute), self.center_y+0.7*self.r*cos(pi/30*time.minute)], width=2, cap="round")
                Color(0.4, 0.7, 0.4)
                th = time.hour*60 + time.minute
                Line(points=[self.center_x, self.center_y, self.center_x+0.5*self.r*sin(pi/360*th), self.center_y+0.5*self.r*cos(pi/360*th)], width=3, cap="round")
    
    class MyClockApp(App):
        def build(self):
            clock = MyClockWidget()
            Clock.schedule_interval(clock.ticks.update_clock, 1)
            return clock
    
    if __name__ == '__main__':
        MyClockApp().run()
    

    enter image description here

    EDIT: I updated code to 1.8.0 version, fixing problem with displaying labels

    0 讨论(0)
  • 2020-12-06 02:17

    Here's an extremely simple clock:

    from kivy.app import App
    from kivy.uix.label import Label
    from kivy.clock import Clock
    
    import time
    
    class IncrediblyCrudeClock(Label):
        def update(self, *args):
            self.text = time.asctime()
    
    class TimeApp(App):
        def build(self):
            crudeclock = IncrediblyCrudeClock()
            Clock.schedule_interval(crudeclock.update, 1)
            return crudeclock
    
    if __name__ == "__main__":
        TimeApp().run()
    

    incredibly crude clock

    0 讨论(0)
提交回复
热议问题