Das Framework baut auf dem Screen Manager auf, mit dem sich mehrere Screens verwalten lassen. Jeder Screen beinhaltet einen anderen Teil der Visualisierung. Im Detail lege ich die vier Screens Scrn1 bis Scrn4 an.
Scrn1: Bildet das Hauptmenü
Scrn2: Zeigt die gemessene Temperatur und Feucht, in meinem Fall des Wohnzimmers an
Scrn3: Beinhaltet eine einfache Wetter App
Scrn4: Stellt die Verläufe der Temperatur und Feuchte der letzten 24h dar
Um das zu tun müssen wir zwei Dateien anlegen. Dabei ist die Benennung wichtig, ebenso wie die Groß- und Kleinschreibung.
Die erste Datei beinhaltet den Pyhton Code der Anwendung und heißt MyVisuApp.py.
Die zweite Datei beinhaltet die in kv language geschriebenen Layoutinformationen und heißt myvisu.kv.
Python
Wichtig ist erstmal nur, dass die Identifizierung der Screens über den Namen, in diesem Beispiel scrn1, scrn2, ... stattfindet. Diese Namen findet man später auch im .kv file.
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
class MyScreens(ScreenManager):
'''
The ScreenManager MyScreens takes care of changing between the available screens
The functions goto_screen_1 .... can be called by all elements on the screens
'''
def __init__(self, **kwargs):
'''__init__() can perform actions on instantioation. None so far'''
super(MyScreens, self).__init__(**kwargs)
def goto_scrn1(self):
'''Switches to screen 1'''
self.current='scrn1'
def goto_scrn2(self):
'''switches to screen 2'''
self.current='scrn2'
def goto_scrn3(self):
'''switches to screen 3'''
self.current='scrn3'
def goto_scrn4(self):
'''switches to screen 4'''
self.current='scrn4'
class Scrn1(Screen):
pass
class Scrn2(Screen):
pass
class Scrn3(Screen):
pass
class Scrn4(Screen):
pass
class MyVisuApp(App):
def build(self):
return MyScreens()
if __name__ == '__main__':
MyVisuApp().run()
KV
<MyScreens>:
Scrn1:
Scrn2:
Scrn3:
Scrn4:
<Scrn1>:
name: 'scrn1'
GridLayout:
cols: 3
size_hint: 1, .8
pos_hint: {'top':.9, 'left':1}
Button:
id: bnt1
text: 'Wohnzimmer'
font_size: 35
on_press:
root.manager.transition.direction = 'left'
root.manager.goto_scrn2()
Button:
id: btn2
text: 'Vorhersage'
font_size: 35
on_press:
root.manager.transition.direction = 'left'
root.manager.goto_scrn3()
Button:
id: btn3
text: 'Einstellungen'
font_size: 35
on_press: app.open_settings()
Button:
id: btn4
text: 'Beenden'
on_press: App.get_running_app().stop()
size_hint: .1, .1
pos_hint: {'top':1, 'left':1}
Label:
id: lbl1
text: 'Hauptmenu'
size_hint: .8, .1
pos_hint: {'top':1, 'center_x':.5}
Label:
id: lbl2
text: 'lbl2'
size_hint: 1, .1
pos_hint: {'bottom':1, 'center_x':.5}
#Screen 2 displays the temperature and humidity
<Scrn2>:
name: 'scrn2'
Button:
id: back
text: 'Hauptmenu'
on_press:
root.manager.transition.direction = 'right'
root.manager.goto_scrn1()
size_hint: .1, .1
pos_hint: {'top':1, 'left':1}
Button:
id: btn1
text: 'Diagramm'
on_press:
root.manager.transition.direction = 'right'
root.manager.goto_scrn4()
size_hint: .1, .1
pos_hint: {'top':1, 'right':1}
Label:
id: lbl1
text: 'Wohnzimmer'
size_hint: .8, .1
pos_hint: {'top':1, 'center_x':.5}
Label:
id: lbl2
text: 'lbl2'
size_hint: 1, .1
pos_hint: {'bottom':1, 'center_x':.5}
#Screen 3 displays the weather forecast
<Scrn3>:
name: 'scrn3'
Button:
id: back
text: 'Hauptmenu'
on_press:
root.manager.transition.direction = 'right'
root.manager.goto_scrn1()
size_hint: .1, .1
pos_hint: {'top':1, 'left':1}
Label:
id: lbl1
text: 'Vorhersage'
size_hint: .8, .1
pos_hint: {'top':1, 'center_x':.5}
Label:
id: lbl2
text: 'lbl2'
size_hint: 1, .1
pos_hint: {'bottom':1, 'center_x':.5}
#Screen 4 displays the temperature and humidity graph
<Scrn4>:
name: 'scrn4'
Button:
id: btn1
text: 'Wohnzimmer'
on_press:
root.manager.transition.direction = 'right'
root.manager.goto_scrn2()
size_hint: .1, .1
pos_hint: {'top':1, 'left':1}
Label:
id: lbl1
text: 'Diagramm'
size_hint: .8, .1
pos_hint: {'top':1, 'center_x':.5}
Label:
id: lbl2
text: 'lbl2'
size_hint: 1, .1
pos_hint: {'bottom':1, 'center_x':.5}
BoxLayout:
id: lay1
size_hint: 1, .8
pos_hint: {'center_y':.5, 'left':1}
Das Ergebnis zeigt uns jetzt ein Hauptmenü mit drei Buttons, um zu den gewünschten Screens an. Die Screens selber sind noch leer, werden aber im Weitern mit Leben gefüllt.