Implement Clock across multiple screens in kivy

93 views
Skip to first unread message

Paul electric

unread,
Jul 26, 2018, 9:19:15 AM7/26/18
to Kivy users support
Hello,

I hope to get some inormation regarding my problem. I want to design a few screens with different conntent, but they will have ne thing in common: A Clock  on top of the Screen. I actually managed to update the clock using Clock.schedule_interval() when I only have one screen. After adding 2 more screens my clock would not update its time. 
Can somebody help me find any solution?
thanks for help

main.py:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.clock import Clock
from time import strftime, localtime
from kivy.properties import StringProperty, ObjectProperty, NumericProperty
from kivy.config import Config
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.behaviors.focus import FocusBehavior
from kivy.uix.screenmanager import ScreenManager, Screen, SwapTransition

Config.set('graphics', 'width', '1024')
Config.set('graphics', 'height', '600')
Config.write()

screen = ScreenManager(transition=SwapTransition())

#Layouts for each Widget
class HomeUI(GridLayout):
    def multi_select(self):
        screen.current = 'multimedia'
    def radio_select(self):
        screen.current = 'radio'

class MultimediaUI(GridLayout):
    def cd_select(self):
        screen.current = 'home'
    def usb_select(self):
        screen.current = 'home'
    def bluetooth_select(self):
        screen.current = 'home'

class RadioUI(GridLayout):
    def fm_select(self):
        screen.current = 'home'
    def dab_select(self):
        screen.current = 'home'


#Widgets in each Screen
class BMWHome(Widget):
    layout = ObjectProperty()
        
class MultimediaHome(Widget):
    clock = StringProperty()
    layout = ObjectProperty()
        
class RadioHome(Widget):
    clock = StringProperty()
    layout = ObjectProperty()

class TimeLabel(Widget):
    clock = StringProperty()
    print(clock)

#Screens
class HomeScreen(Screen):
    pass

class MultimediaScreen(Screen):
    pass

class RadioScreen(Screen):
    pass

#App
class BMWApp(App):
    timer = TimeLabel()
    def build(self):
        home = HomeScreen()
        home.add_widget(BMWHome())
        home.add_widget(TimeLabel())
        radio = RadioScreen()
        radio.add_widget(RadioHome())
        radio.add_widget(TimeLabel())
        multi = MultimediaScreen()
        multi.add_widget(MultimediaHome())
        multi.add_widget(TimeLabel())
        screen.add_widget(home)
        screen.add_widget(multi)
        screen.add_widget(radio)
        Clock.schedule_interval(self.update, 1)
        return screen

    def update(self,dt):
        self.timer.clock = strftime("%H:%M:%S", localtime())
        print(self.timer.clock)

        
if __name__ == '__main__':
    BMWApp().run()

kv-file:

#:kivy 1.10.1
<HomeScreen>:
    name: 'home'
 
<MultimediaScreen>:
    name: 'multimedia'

<RadioScreen>:
    name: 'radio'

<HomeUI>:
    cols: 1
    minimum_size: 1024,600
    col_default_width: 350
    row_default_height: 50
    row_force_default: 'true'
    spacing: 10
    padding: 450, -400

    Button:
        font_size: 30
        focus: True
        text: "Multimedia"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
        on_press: root.multi_select()
    Button:
        font_size: 30
        text: "Radio"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
        on_press: root.radio_select()
    Button:
        font_size: 30 
        text: "Telefon"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
    Button:
        font_size: 30 
        text: "Navigation"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
    Button:
        font_size: 30 
        text: "Office"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
    Button:
        font_size: 30 
        text: "Fahrzeuginfo"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
    Button:
        font_size: 30 
        text: "Einstellungen"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9

<MultimediaUI>:
    cols: 1
    minimum_size: 1024,600
    col_default_width: 350
    row_default_height: 50
    row_force_default: 'true'
    spacing: 10
    padding: 450, -400

    Button:
        font_size: 30
        focus: True
        text: "CD"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
        on_press: root.cd_select()
    Button:
        font_size: 30
        text: "Mediendatei/USB"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
        on_press: root.usb_select()
    Button:
        font_size: 30
        text: "Bluetooth"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
        on_press: root.bluetooth_select()
    
<RadioUI>:
    cols: 1
    minimum_size: 1024,600
    col_default_width: 350
    row_default_height: 50
    row_force_default: 'true'
    spacing: 10
    padding: 450, -400

    Button:
        font_size: 30
        focus: True
        text: "FM/AM"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
        on_press: root.fm_select()
    Button:
        font_size: 30
        text: "DAB+"
        background_color: 1,1,1,0.2
        text_size: self.size
        halign: 'left'
        padding: 9,9
        on_press: root.dab_select()

        
<BMWHome>:
    layout: home_ui
    canvas:
        Color:
            hsv: 0,0.8,1
        Ellipse:
            pos: 100, self.center_y-50
            size: 100, 100
        
    HomeUI:
        id: home_ui

<MultimediaHome>:
    layout: multi_ui
    canvas:
        Color:
            hsv: 0,0.8,1
        Ellipse:
            pos: 100, self.center_y-50
            size: 100, 100

    Label:
        font_size: 20
        center_x: root.center_x
        top: root.top
        text: root.clock

    MultimediaUI:
        id: multi_ui

<RadioHome>:
    layout: radio_ui
    canvas:
        Color:
            hsv: 0,0.8,1
        Ellipse:
            pos: 100, self.center_y-50
            size: 100, 100

    Label:
        font_size: 20
        center_x: root.center_x
        top: root.top
        text: root.clock

    RadioUI:
        id: radio_ui

<TimeLabel>:
    Button:
        font_size: 20
        background_color: 0,0,0,0
        size: 350,50
        pos: 430,500
        text: root.clock

ZenCODE

unread,
Jul 27, 2018, 2:18:16 AM7/27/18
to Kivy users support
The best way to do this would be to place the clock on top of the screen manager, so the screens swap out, but the clock stays on top. Something like:

FloatLayout:
   
ClockWidget:
        pos_hint
: 0.9, 0.1
        size_hint
: 0.1, 0.1
   
ScreenManager:
       
Screen:
            name
: "One"

      
etc.
Reply all
Reply to author
Forward
0 new messages