Python und Kivy

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

Hallo liebe Forenmitglieder!

Ich habe mir vorgenommen ein Wetterstation Script zu schreiben welches mir über OpenWeathermap verschiedene Wetterdaten liefert.

Mein momentanes Problem besteht in der aktualisierung der Daten. Ich würde gerne alle 60sec eine Abfrage an den Server schicken
Der Code für die Abfrage steht soweit und funktioniert, jedoch fahr ich bei der aktualisierung von Kivy gegen die Wand.

Ich Schlaumeier hab als erstes versucht mit while True() : die Abfrage in eine Schleife zu setzen und mit time. sleep(60) zu pausieren... geht natürlich nicht weil ich damit die gui "schlafen" schicke...
Hab dann probiert den Code in die Klasse zu packen mit def Abfrage() : und das Ganze mit t = Timer(60) t.start() laufen zu lassen hat ebenfalls nicht funktioniert.

Wäre super wenn mir da jemand auf die Sprünge helfen könnte. Ich hab Meister Google natürlich auch schon ausführlich mit meinem Problem gefüttert und folgenden Beitrag im englischen Forum gefunden:
https://stackoverflow.com/questions/342 ... m-and-kivy
Irgendwie bekomm ichs aber damit auch nicht gebacken :o

Code: Alles auswählen

#TEST
from datetime import datetime, timedelta
import requests
import time

import kivy
kivy.require('1.10.1')
#from kivy.interactive import InteractiveLauncher
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.core.image import Image
from kivy.graphics import BorderImage
from kivy.graphics import Color, Rectangle
from kivy.properties import NumericProperty
from kivy.properties import StringProperty
from kivy.clock import Clock



#Abfrage der daten
webseite = "http://api.openweathermap.org/data/2.5/weather?&APPID=db0d3062e5b81bbe72ecc6d74e8e8171&q=achenkirch&units=metric"
#Daten in Variable
wetterdaten = requests.get(webseite).json()
#Daten Variablen zuweisen
wetter = wetterdaten['weather'][0]['main']
temperatur = wetterdaten['main']['temp']
sonnenaufgangunix = wetterdaten['sys']['sunrise']
sonnenuntergangunix = wetterdaten['sys']['sunset']
station = wetterdaten['name']
uhrzeitunix = wetterdaten['dt']
#Zeit von Unix in MEZ umrechnen
unix_ts1 = uhrzeitunix
unix_ts2 = sonnenaufgangunix
unix_ts3 = sonnenuntergangunix
uhrzeit = (datetime.fromtimestamp(unix_ts1) - timedelta(hours=0)).strftime('%H:%M:%S')
sonnenaufgang = (datetime.fromtimestamp(unix_ts2) - timedelta(hours=0)).strftime('%H:%M:%S')
sonnenuntergang = (datetime.fromtimestamp(unix_ts3) - timedelta(hours=0)).strftime('%H:%M:%S')
#Daten in Shell ausgeben
print(station)
print(uhrzeit)
print(temperatur)
if wetter == "Clouds":
	wetter = ("Bewoelkt")
if wetter == "Rain":
	wetter = ("Regen")
if wetter == "Clear":
	wetter = ("Wolkenlos")
if wetter == "Snow":
	wetter = ("Schneefall")
print(wetter)
print(sonnenaufgang)
print(sonnenuntergang)
#Daten in Datei speichern
f = open("Wetter Achenkirch.txt","w")
f.write("Temperatur "+str(temperatur))
#Temperatur als string abspeichern
f.close()
   
Builder.load_string('''
<Hauptseite>:
    Label:
        text: root.wetter
''')



class Hauptseite(BoxLayout):
    wetter = StringProperty('')

    def __init__(self, **kwargs):
        super(Hauptseite, self).__init__(**kwargs)
        self.wetter = wetter

class TestApp(App):
    def build(self):
        return Hauptseite()


TestApp().run()  
Das ist die abgespeckte Version. Wie ihr vl schon bemerkt habt bin ich recht neu in dem Thema, also wundert euch nicht wenn das Script vermurkst aussieht.
Die trennung von kv und py file hab ebenfalls nicht auf die Reihe bekommen, deswegen steht der kivy code bis auf weiteres im "Hauptprogramm"

Beste Grüße
Bergstern
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Ansatz mit einer Funktion war schon richtig. So wie hier https://kivy.org/doc/stable/api-kivy.clock.html zu sehen musst auch du das machen.
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

Danke für die schnelle Antwort.

habs jetzt soweit hinbekommen das es mir die Variablen in der GUI anzeigt, jetzt habe ich das Problem das die GUI nicht aktualisiert wird bei einer Änderung.
Ich hab mir zum testen in den Spinner als Text die staionkivy definition gesetzt. Damit ich überhaupt beim start der Gui eine Variable für "station" habe, habe ich sie am Programmanfang auf "keine Daten" gesetzt. Jetzt wird aber nach der Stationabfrage der Text nicht aktualisiert?

Code: Alles auswählen

from datetime import datetime, timedelta
import requests
import time
from threading import Timer

import kivy
kivy.require('1.10.1')
#from kivy.interactive import InteractiveLauncher
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.core.image import Image
from kivy.graphics import BorderImage
from kivy.graphics import Color, Rectangle
#from kivy.uix.image import AsyncImage
from kivy.clock import Clock
from kivy.properties import StringProperty

station = ("keine Station")
uhrzeit = ("keine Daten")
temperatur = ("keine Daten")
sonnenaufgang = ("keine Daten")
sonnenuntergang = ("keine Daten")
wetter = ("keine Daten")




# You can create your kv code in the Python file
Builder.load_string("""
<Startbildschirm>:
    timeb:time_box
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'EuropaBeiNacht.png'
    FloatLayout:
        Label: # Uhrzeit und Datum
            id:time_box
            text:root.update()
            size_hint_x: 6
            pos_hint:{"center_x": 0.5, "center_y":0.95}
            font_size: 30
        Button:
        	id: Wetter
            font_size: 30
            color: 1, 1, 1, 1
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.8}
            background_normal: 'Kloetze.png'
            text: "Wetter"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
                root.manager.current = 'Wetter'
		Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.15, "center_y":0.5}
            background_normal: 'Kloetze.png'
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei1'
		Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.2}
            background_normal: 'Kloetze.png'
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
            	root.manager.current = 'Frei2'
		Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.8}
            background_normal: 'Kloetze.png'
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
            	root.manager.current = 'Frei3'
		Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.85, "center_y":0.5}
            background_normal: 'Kloetze.png'
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
            	root.manager.current = 'Frei4'
		Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.2}
            background_normal: 'Kloetze.png'
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
            	root.manager.current = 'Frei5'

<Wetter>:
    FloatLayout:
        Button:
            text: root.wetterkivy
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

        Spinner:
            text: root.stationkivy
            values: "Achenkirch", "Maurach", "Radfeld", "Pakostane", "Grado"
            pos: 0, 0
            size_hint: (0.2, 0.1)
            #size: (100, 50)
			
<Frei1>:
    BoxLayout:
        Button:
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

<Frei2>:
    BoxLayout:
        Button:
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

<Frei3>:
    BoxLayout:
        Button:
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'

<Frei4>:
    BoxLayout:
        Button:
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'

<Frei5>:
    BoxLayout:
        Button:
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'
""")

# Create a class for all screens in which you can include
# helpful methods specific to that screen





class Startbildschirm(Screen):
    def __init__(self, **kw):
        super(Startbildschirm, self).__init__(**kw)
        Clock.schedule_interval(self.update, 1)

    def update(self, *args):
        self.timeb.text = time.asctime()
        return time.asctime()


class Wetter(Screen):
    def my_callback(dt):
        # Abfrage der daten
        webseite = "http://api.openweathermap.org/data/2.5/weather?&APPID=1233062e5b81bbe72ecc6d74e8e8171&q=achenkirch&units=metric"
        # Daten in Variable
        wetterdaten = requests.get(webseite).json()

        # Daten Variablen zuweisen
        wetter = wetterdaten['weather'][0]['main']
        temperatur = wetterdaten['main']['temp']
        sonnenaufgangunix = wetterdaten['sys']['sunrise']
        sonnenuntergangunix = wetterdaten['sys']['sunset']
        station = wetterdaten['name']
        uhrzeitunix = wetterdaten['dt']

        # Zeit von Unix in MEZ umrechnen
        unix_ts1 = uhrzeitunix
        unix_ts2 = sonnenaufgangunix
        unix_ts3 = sonnenuntergangunix

        uhrzeit = (datetime.fromtimestamp(unix_ts1) - timedelta(hours=0)).strftime('%H:%M:%S')

        sonnenaufgang = (datetime.fromtimestamp(unix_ts2) - timedelta(hours=0)).strftime('%H:%M:%S')

        sonnenuntergang = (datetime.fromtimestamp(unix_ts3) - timedelta(hours=0)).strftime('%H:%M:%S')

        # Daten in Shell ausgeben
        print(station)
        print(uhrzeit)
        print(temperatur)
        if wetter == "Clouds":
            wetter = ("Bewoelkt")
        if wetter == "Rain":
            wetter = ("Regen")
        if wetter == "Clear":
            wetter = ("Wolkenlos")
        if wetter == "Snow":
            wetter = ("Schneefall")
        print(wetter)
        print(sonnenaufgang)
        print(sonnenuntergang)

        # Daten in Datei speichern
        f = open("Wetter Achenkirch.txt", "w")
        f.write("Temperatur " + str(temperatur))  # Temperatur als string abspeichern
        f.close()


    wetterkivy = StringProperty('')

    def __init__(self, **kwargs):
        super(Wetter, self).__init__(**kwargs)
        self.wetterkivy = wetter

    stationkivy = StringProperty('')

    def __init__(self, **kwargs):
        super(Wetter, self).__init__(**kwargs)
        self.stationkivy = station

    Clock.schedule_interval(my_callback, 5)


class Frei1(Screen):
    pass


class Frei2(Screen):
    pass


class Frei3(Screen):
    pass


class Frei4(Screen):
    pass


class Frei5(Screen):
    pass



# The ScreenManager controls moving between screens
screen_manager = ScreenManager()

# Add the screens to the manager and then supply a name
# that is used to switch screens
screen_manager.add_widget(Startbildschirm(name="Startbildschirm"))
screen_manager.add_widget(Wetter(name="Wetter"))
screen_manager.add_widget(Frei1(name="Frei1"))
screen_manager.add_widget(Frei2(name="Frei2"))
screen_manager.add_widget(Frei3(name="Frei3"))
screen_manager.add_widget(Frei4(name="Frei4"))
screen_manager.add_widget(Frei5(name="Frei5"))

class WetterApp(App):
	def build(self):
            		return screen_manager



sample_app = WetterApp()
sample_app.run()
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du mischst munter Methoden mit einfachem Code der nur zufällig auf Klassenebene steht. Letzteres gilt für deinen my_callback (sehr schlechter Name. Gibt es wen anderes als dich, der auch callbacks hat?) und dessen Scheduling.

Aus ersterem gehört eine vernünftige Methode gemacht, und letzteres sollte in den Initialisator wandern. Und in der Methode kannst du dann über self auf die GUI-Elemente zugreifen & sie aktualisieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bergstern: Die Importe sollte man mal aufräumen. `threading.Timer` wird nicht verwendet. Und bei den `kivy`-Importen ist das `BoxLayout` doppelt und aus `kivy.graphics` wird zweimal importiert – das liesse sich zusammenfassen falls wirklich alles davon gebraucht wird, weil `Image`, `Window`, `BorderImage`, `Color`, und `GridLayout` werden importiert, aber auch nirgends verwendet.

Von den sechs Definitionen nach den importen werden nur zwei im Code verwendet. Die sollten komplett gross geschrieben werden, weil das Konstanten sind. Und die Klammern um die Zeichenketten machen keinen Sinn – weg damit. Wobei ich auch den Sinn dieser Konstanten nicht so ganz sehe. Sie könnten auch besser benannt sein. Ich würde jedenfalls hinter `STATION` nicht vermuten das da ein Text mit dem Wert 'keine Station' steckt.

Einige Kommentare sind schräg weil die eher wie Handlungsanweisungen aus einem Tutorial klingen. So etwas hat in einem Programm nichts zu suchen.

Der ``# Create a class for all …``-Kommentar ist falsch, weil das gar nicht das ist, was da im Code passiert. Falsche Kommentare sind im Grunde schlimmer als gar keine. Wenn keine Kommentare da sind, muss man sich am Code orientieren. Wenn Kommentare da sind, die nicht zum Code passen, dann klären die nicht den Code auf, sondern der Leser weiss nicht wer denn nun recht hat – der Code oder der Kommentar. Wenn so etwas oft genug in einer Codebasis vor kommt, dann werden auch die korrekten Kommentare wertlos, weil der Leser denen nicht mehr vertrauen kann, weil er ja auch bei den korrekten immer überprüfen muss um sie denn mit dem Code übereinstimmen oder nicht.

Die Argumente bei den `super()`-Aufrufen sind überflüssig.

`Startbildschirm.update()` hat einen sinnlosen Rückgabewert. Der Aufrufer erwartet hier keine Zeichenkette mit der Uhrzeit. Das `*args`-Argument ist der Signatur ist sehr/zu generisch. Man weiss doch dass dort *ein* Argument übergeben wird, und zwar die verstrichene Zeit seit dem letzten Aufruf.

In `Wetter` wird der Klasseninhalt in einer Reihenfolge definiert die nicht den Konventionen entspricht. Üblich ist es erst die Klassenvariablen, dann die ”magischen” Methoden, und dann normale Methoden zu definieren. Wobei `__init__()` die erste ”magische” Methode ist (sofern es kein `__new__()` gibt).

Dann definierst Du *zwei* `__init__()`-Methoden. Davon ”überlebt” nur die zweite, weil die erste durch die zweite ersetzt wird. Es kann immer nur ein Attribut mit einem gegebenen Namen existieren. Wie sollte das auch anders funktionieren?

Durch die Definition von `wetterkivy` und `stationkivy` (schlechte Namen übrigens) als Attribute auf dem Exemplar, ”verdeckst” Du die Klassenvariablen mit den gleichen Namen. Über das Exemplar erreicht man unter den Namen also nur noch die Zeichenketten, aber nicht mehr die gleichnamigen `StringProperty`-Exemplare die auf der Klasse definiert sind. Da sollten sie auch eher nicht definiert sein/werden, denn auf Klasseneben definiert man üblicherweise nur Konstanten und keine Variablen. Die werden dadurch nämlich zu globalen Variablen.

Bei `my_callback()` fehlt das `self`-Argument, oder man sollte das explizit zu einer `@staticmethod` machen.

Der Name ist schlecht. Was soll das `my_` bedeuten? Gibt es auch `our_`? Und nur `callback()` würde nichts darüber aussagen was die Funktion/Methode denn eigentlich *tut*. Das ist doch eher die Information die man als Leser haben möchte.

Die Kommentare in `my_callback()` sind nahezu alle total überflüssig weil sie nur noch mal beschreiben was sehr offensichtlich im Code sowieso schon steht. Faustregel für Kommentare: Nicht beschreiben *was* der Code macht, das steht da ja schon als Code, sondern *warum* er das macht, sofern das nicht offensichtlich ist.

Die URL wäre etwas was man eher als Konstante am Anfang des Moduls definieren würde, damit man die leicht finden und anpassen kann.

Das umbennen der Zeiten in nichtssagende und nummerierte `unix_ts*`-Namen macht keinen Sinn. Die anschliessende Rechnung wo 0 von der Zeit abgezogen wird auch nicht. Der Kommentar, dass es sich um eine Umrechnung in die MEZ-Zeitzone handelt, stimmt nur wenn das die lokale Zeitzone des Systems ist.

Das Umwandeln in einen sinnvolle(re)n Datentyp wie `datetime`-Objekte und die Formatierung als Zeichenkette für eine Ausgabe, sollte man voneinander getrennt halten.

Bei den ganzen ``if wetter…``-Konstrukten sind wieder unnötige Klammern um Zeichenkettenliterale. Das liesse sich ausserdem einfacher mit einem Wörterbuch lösen das die Englischen auf Deutsche Worte abbildet.

Bei Dateien bietet sich die ``with``-Anweisung an um das schliessen in jedem Fall sicherzustellen.

Werte und Zeichenkettenliterale mit `str()` und ``+`` zusammenstückeln ist eher BASIC als Python. Im Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode und seit Python 3.6 auch f-Zeichenkettenliterale.

Textdateien sollten mit einem Zeilenendezeichen enden.

Das `Clock.schedule_interval()` auf *Klassenebene* hat dort sicher nichts zu suchen.

Der `screen_manager` hat auf Modulebene nichts zu suchen. Und auch `sample_app` sollte in einer Funktion verschwinden. Wobei das `sample_` in dem Namen auch gar keinen Sinn macht.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import datetime
import time

import kivy
kivy.require('1.10.1')
from kivy.app import App
from kivy.clock import Clock
from kivy.graphics import Rectangle
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen, ScreenManager
import requests

WEATHER_API_URL = (
    'http://api.openweathermap.org/data/2.5/weather?'
        '&APPID=1233062e5b81bbe72ecc6d74e8e8171&q=achenkirch&units=metric'
)
WEATHER_EN_TO_DE = {
    'Clouds': 'Bewoelkt',
    'Rain': 'Regen',
    'Clear': 'Wolkenlos',
    'Snow': 'Schneefall',
}
# 
# TODO Do these constants make sense?
# 
STATION = 'keine Station'
UHRZEIT = 'keine Daten'
TEMPERATUR = 'keine Daten'
SONNENAUFGANG = 'keine Daten'
SONNENUNTERGANG = 'keine Daten'
WETTER = 'keine Daten'


Builder.load_string("""
<Startbildschirm>:
    timeb:time_box
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'EuropaBeiNacht.png'
    FloatLayout:
        Label: # Uhrzeit und Datum
            id:time_box
            text:root.update()
            size_hint_x: 6
            pos_hint:{"center_x": 0.5, "center_y":0.95}
            font_size: 30
        Button:
            id: Wetter
            font_size: 30
            color: 1, 1, 1, 1
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.8}
            background_normal: 'Kloetze.png'
            text: "Wetter"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
                root.manager.current = 'Wetter'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.15, "center_y":0.5}
            background_normal: 'Kloetze.png'
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei1'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.2}
            background_normal: 'Kloetze.png'
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei2'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.8}
            background_normal: 'Kloetze.png'
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei3'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.85, "center_y":0.5}
            background_normal: 'Kloetze.png'
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei4'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.2}
            background_normal: 'Kloetze.png'
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei5'

<Wetter>:
    FloatLayout:
        Button:
            text: root.wetterkivy
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

        Spinner:
            text: root.stationkivy
            values: "Achenkirch", "Maurach", "Radfeld", "Pakostane", "Grado"
            pos: 0, 0
            size_hint: (0.2, 0.1)
            #size: (100, 50)
            
<Frei1>:
    BoxLayout:
        Button:
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

<Frei2>:
    BoxLayout:
        Button:
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

<Frei3>:
    BoxLayout:
        Button:
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'

<Frei4>:
    BoxLayout:
        Button:
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'

<Frei5>:
    BoxLayout:
        Button:
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'
""")


class Startbildschirm(Screen):
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_interval(self.update, 1)

    def update(self, _dt=None):
        self.timeb.text = time.asctime()


class Wetter(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.wetterkivy = StringProperty(WETTER)
        self.stationkivy = StringProperty(STATION)
        Clock.schedule_interval(self.update_weather_information, 5)
    
    @staticmethod
    def update_weather_information(_dt=None):
        wetterdaten = requests.get(WEATHER_API_URL).json()

        stationsname = wetterdaten['name']
        uhrzeit = datetime.fromtimestamp(wetterdaten['dt'])
        wetter = WEATHER_EN_TO_DE[wetterdaten['weather'][0]['main']]
        temperatur = wetterdaten['main']['temp']
        sonnenaufgang = datetime.fromtimestamp(wetterdaten['sys']['sunrise'])
        sonnenuntergang = datetime.fromtimestamp(wetterdaten['sys']['sunset'])

        print(stationsname)
        print(format(uhrzeit, '%H:%M:%S'))
        print(temperatur)
        print(wetter)
        print(format(sonnenaufgang, '%H:%M:%S'))
        print(format(sonnenuntergang, '%H:%M:%S'))

        with open('Wetter Achenkirch.txt', 'w', encoding='utf-8') as file:
            file.write('Temperatur {}\n'.format(temperatur))


class Frei1(Screen):
    pass


class Frei2(Screen):
    pass


class Frei3(Screen):
    pass


class Frei4(Screen):
    pass


class Frei5(Screen):
    pass


class WetterApp(App):
    def build(self):
        screen_manager = ScreenManager()
        screen_manager.add_widget(Startbildschirm(name='Startbildschirm'))
        screen_manager.add_widget(Wetter(name='Wetter'))
        screen_manager.add_widget(Frei1(name='Frei1'))
        screen_manager.add_widget(Frei2(name='Frei2'))
        screen_manager.add_widget(Frei3(name='Frei3'))
        screen_manager.add_widget(Frei4(name='Frei4'))
        screen_manager.add_widget(Frei5(name='Frei5'))
        return screen_manager


def main():
    app = WetterApp()
    app.run()


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

Hey Blackjack,

mit einer so ausführlichen Antwort hab ich jetzt ehrlich gesagt nicht gerechnet, kann mich da nur tausend mal bedanken für die arbeit die du in die Antwort gesteckt hast!!!
Das mein Code vor Fehlern nur so strotzt ist mir durchaus bewusst, vor allem wenn mir das so ausführlich erklärt wird wie weit es im argen liegt, ist mir das ja fast schon peinlich dass ich den Mist gepostet habe... :?

Ich hab mit python etwas am raspi rumgespielt und wie das meistens so ist wenn man was neues anfängt und man Spaß daran hat, wollte ich mehr als ich eigentlich im Moment in der Lage bin zu machen mit meinem jetzigen Wissensstand..... und ja ich hab da reichlich aus tutorials und aus anderen beiträgen geklaut/kopiert... :o

Wie gesagt tausend Dank!!! Ich brauch jetzt erst mal ne Weile um deiner Antwort gerecht zu werden und mein Script dementsprechend anzupassen.

Das du mir mein Script bereits umgeschrieben hast ist natürlich noch das I-Tüpfelchen,!!!!!

danke danke!!
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

Abend!
Habe immer noch das Problem das ich die Daten die in den Variablen stehen nicht in der Gui angezeigt bekomme. Hab mir wirklich schon gefühlte 10 ähnliche Schilderungen von ähnlichen Problemen durchgelesen und hab trotzdem keine Ahnung was jetzt schon wieder schief läuft.
Der Code ist so ziemlich der gleiche wie Blackjack ihn gepostet hat, hab nur die Groß-Kleinschreibung der Variablen angepasst, weil einige noch kleingeschrieben waren. ansonsten hab ich alles so gelassen wie es war.
Bekomme jetzt ständig folgende Fehlermeldung nach dem Start des Scriptes:

kivy.lang.builder.BuilderException: Parser: File "<inline>", line 87:
...
85: FloatLayout:
86: Button:
>> 87: text:root.wetterkivy
88: on_press:
89: root.manager.transition.direction = 'up'
...
ValueError: Button.text accept only str

Sry Blackjack "wetterkivy" ist immer noch wetterkivy :lol: aber an dem kanns ja nicht liegen
P.S: danke für das Dictionary!!! sieht so wesentlich besser aus als meine if wetter = snow wetter= schneefall :lol:


Beste Grüße
Bergstern
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

“So ziemlich der gleiche”. Aha. Und wie sollen wir nun rausfinden, wo das Problem ist? Das ist bestimmt so ziemlich das gleiche wie die Lösungen die wir hier schon besprochen haben.....
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

Sobald ich zuhause bin poste ich das Script. Was das "ziemlich" betrifft. Habe ja dazu geschrieben was geändert wurde.
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

Hier nochmal der Code, vl. sieht ja jemand den Fehler.

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import datetime
import time
import kivy
kivy.require('1.10.1')
from kivy.app import App
from kivy.clock import Clock
from kivy.graphics import Rectangle
from kivy.lang import Builder
from kivy.properties import StringProperty, NumericProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen, ScreenManager
import requests

WEATHER_API_URL = (
    'http://api.openweathermap.org/data/2.5/weather?'
    'APPID=db0d3062e5b81bbe72ecc6d74e8e8171&q=achenkirch&units=metric'
)

#http://api.openweathermap.org/data/2.5/weather?&APPID=db0d3062e5b81bbe72ecc6d74e8e8171&q=achenkirch&units=metric

WEATHER_EN_TO_DE = dict(Clouds='Bewoelkt', Rain='Regen', Clear='Wolkenlos', Snow='Schneefall')
#
# TODO Do these constants make sense?
#
STATIONSNAME = 'keine Station'
UHRZEIT = 'keine Daten'
TEMPERARTUR = 'keine Daten'
SONNENAUFGANG = 'keine Daten'
SONNENUNTERGANG = 'keine Daten'
WETTER = 'keine Daten'

#print(WETTER)
Builder.load_string("""
<Startbildschirm>:
    timeb:time_box
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'EuropaBeiNacht.png'
    FloatLayout:
        Label: # Uhrzeit und Datum
            id:time_box
            text:root.update()
            size_hint_x: 6
            pos_hint:{"center_x": 0.5, "center_y":0.95}
            font_size: 30
        Button:
            id: jaja
            font_size: 30
            color: 1, 1, 1, 1
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.8}
            background_normal: 'Kloetze.png'
            text: "Wetter"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.transition.duration = 2
                root.manager.current = 'Wetteranzeige'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.15, "center_y":0.5}
            background_normal: 'Kloetze.png'
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei1'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.2}
            background_normal: 'Kloetze.png'
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei2'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.8}
            background_normal: 'Kloetze.png'
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei3'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.85, "center_y":0.5}
            background_normal: 'Kloetze.png'
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei4'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.2}
            background_normal: 'Kloetze.png'
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei5'

<Wetteranzeige>:
    FloatLayout:
        Button:
            text:root.wetterkivy
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.current = 'Startbildschirm'

        Spinner:
            text:root.stationkivy
            values: "Achenkirch", "Maurach", "Radfeld", "Pakostane", "Grado"
            pos: 0, 0
            size_hint: (0.2, 0.1)
            #size: (100, 50)

<Frei1>:
    BoxLayout:
        Button:
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

<Frei2>:
    BoxLayout:
        Button:
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.current = 'Startbildschirm'

<Frei3>:
    BoxLayout:
        Button:
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.current = 'Startbildschirm'

<Frei4>:
    BoxLayout:
        Button:
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'

<Frei5>:
    BoxLayout:
        Button:
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.current = 'Startbildschirm'
""")


class Startbildschirm(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_interval(self.update, 1)

    def update(self, _dt=None):
        self.timeb.text = time.asctime()
        return time.asctime()


class Wetteranzeige(Screen):
    def __init__(self, **kwargs):
        self.wetterkivy = StringProperty(WETTER)
        self.stationkivy = StringProperty(STATIONSNAME)
        super().__init__(**kwargs)
        Clock.schedule_interval(self.update_weather_information, 5)
    
    @staticmethod
    def update_weather_information(_dt=None):
        WETTERDATEN = requests.get(WEATHER_API_URL).json()
        STATIONSNAME = WETTERDATEN['name']
        UHRZEIT = datetime.fromtimestamp(WETTERDATEN['dt'])
        WETTER = WEATHER_EN_TO_DE[WETTERDATEN['weather'][0]['main']]
        TEMPERARTUR = WETTERDATEN['main']['temp']
        SONNENAUFGANG = datetime.fromtimestamp(WETTERDATEN['sys']['sunrise'])
        SONNENUNTERGANG = datetime.fromtimestamp(WETTERDATEN['sys']['sunset'])
        print(STATIONSNAME)
        print(format(UHRZEIT, '%H:%M:%S'))
        print(TEMPERARTUR)
        print(WETTER)
        print(format(SONNENAUFGANG, '%H:%M:%S'))
        print(format(SONNENUNTERGANG, '%H:%M:%S'))

        with open('Wetter Achenkirch.txt', 'w', encoding='utf-8') as file:
            file.write('Temperatur {}\n'.format(TEMPERARTUR))




class Frei1(Screen):
    pass


class Frei2(Screen):
    pass


class Frei3(Screen):
    pass


class Frei4(Screen):
    pass


class Frei5(Screen):
    pass


class WetterApp(App):
    def build(self):
        screen_manager = ScreenManager()
        screen_manager.add_widget(Startbildschirm(name='Startbildschirm'))
        screen_manager.add_widget(Wetteranzeige(name='Wetteranzeige'))
        screen_manager.add_widget(Frei1(name='Frei1'))
        screen_manager.add_widget(Frei2(name='Frei2'))
        screen_manager.add_widget(Frei3(name='Frei3'))
        screen_manager.add_widget(Frei4(name='Frei4'))
        screen_manager.add_widget(Frei5(name='Frei5'))
        return screen_manager


def main():
    app = WetterApp()
    app.run()
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nur kurz drüber geschaut und in `update_weather_information()` sind eindeutig viel zu viele komplett gross geschriebene Namen. Die sind für Konstanten, nicht für normale, lokale Variablen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

ok. dann hab ich das mit der Großschreibung wohl etwas übertrieben. Habs korrigiert und es funktioniert immer noch nicht. Hab jetzt mal etwas rumprobiert weil anscheinend die Variablen nicht übergeben werden. Wenn die Klasse so aufgebaut ist verschwindet zumindest der Fehler "Button.text accept only str", die richtigen Daten werden aber immer noch nicht angezeigt.

Code: Alles auswählen

class Wetteranzeige(Screen):
    def __init__(self, **kwargs):
        wetter = "noch keine Daten"
        stationsname = "noch keine Daten"
        print(wetter)
        print(stationsname)
        time.sleep(2)
        wetterkivy = StringProperty('')
        stationskivy = StringProperty('')
        self.wetterkivy = wetter
        self.statioskivy = stationsname
        #self.wetterkivy = StringProperty(wetter)
        #self.stationkivy = StringProperty(stationsname)
        super().__init__(**kwargs)
        Clock.schedule_interval(self.update_weather_information, 5)


Sobald ich es so versuche:

Code: Alles auswählen

class Wetteranzeige(Screen):
    def __init__(self, **kwargs):
        wetter = "noch keine Daten"
        stationsname = "noch keine Daten"
        print(wetter)
        print(stationsname)
        time.sleep(2)
        #wetterkivy = StringProperty('')
        #stationskivy = StringProperty('')
        #self.wetterkivy = wetter
        #self.statioskivy = stationsname
        self.wetterkivy = StringProperty(wetter)
        self.stationkivy = StringProperty(stationsname)
        super().__init__(**kwargs)
        Clock.schedule_interval(self.update_weather_information, 5)
kommt immer die oben genannte fehlermeldung. Ich war der Meinung self.wetterkivy = StringProperty (wetter) ersetzt mir einfach nur meinen zweizeiligen Code?

Ich habe die lokalen Variablen deshalb schon oben in der Klasse definiert weil ich sonst den Fehler bekomme das keine Variable definiert sei...

Ich probier jetzt mal munter weiter, wird schon irgendwie funktionieren ^^
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bergstern: Das ist keine Frage des munter herumprobierens. Der Fehler ist offensichtlich. `text` von `Button` will eine Zeichenkette und `StringProperty` ist offensichtlich keine Zeichenkette.

Anscheinend gehören diese `*Property`-Exemplare doch auf Klassenebene damit auf den Exemplaren dann Instanzvariablen davon existieren. Oder man definiert in der `__init__()` ganz normale Instanzvariablen. In beiden Fällen wird man aber wohl noch den Text in der GUI ändern müssen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe das Beispiel nicht wirklich zum laufen gebracht, neben einigen kleinen Fehlern hat es vor allem einfach nichts dargestellt. Darum hier ein kleiner Test, der das dynamische aktualisierend eines Widgets durch einen geschedulten Callback illustriert:

Code: Alles auswählen

import time
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock

Builder.load_string('''
<TestWidget>:
    canvas.before:
        Color:
            rgba: 0, 1, 0, 1
        Rectangle:
            # self here refers to the widget i.e FloatLayout
            pos: self.pos
            size: self.size
    Button:
        text: 'Hello World!!'
        size_hint: .5, .5
        pos_hint: {'center_x':.5, 'center_y': .5}

    Label:
        text: root.time
        size_hint_x: 6
        pos_hint:{"center_x": 0.5, "center_y":0.95}
        font_size: 30

''')

class TestWidget(FloatLayout):

    time = StringProperty("<notime>")

    def __init__(self, *a, **kw):
        super().__init__(*a, **kw)
        Clock.schedule_interval(self.update, 1)

    def update(self, _dt=None):
        self.time = time.asctime()


class MainApp(App):


    def build(self):
        return TestWidget()

if __name__ == '__main__':
    MainApp().run()
Bergstern
User
Beiträge: 8
Registriert: Donnerstag 28. März 2019, 23:32

Danke deets,
das ist jedoch die gleiche Uhr die bereits in meinem Script implementiert ist.

Hab jetzt mal die Hintergrundbilder rausgenommen damit das Script bei jedem läuft der es sich ansehen will. Ich lass jetzt dann die Tage einen Freund von mir nochmal drüber schauen. Vl. weiß ja er weiter. Hier nochmal das Script:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import datetime
import time
import kivy
kivy.require('1.10.1')
from kivy.app import App
from kivy.clock import Clock
from kivy.graphics import Rectangle
from kivy.lang import Builder
from kivy.properties import StringProperty, NumericProperty, ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen, ScreenManager
import requests



#folgendes Problem: Ich hole mir über die wetter API von OpenWeatherMap Daten die ich gerne über die GUI angezeigt haben möchte
# Die Werte werden ab Zeile 267 ausgelesen, anschließend wird ab Zeile 286 die Python Variablen in die Kivy Variablen übernommen
# (stationkivy und temperaturkivy usw.) Diese werden dann in der KV. file im Screen Wetteranzeige bei den Labels als Text hinterlegt.
# Die Darstellung der Werte funktioniert soweit, nur die Aktualisierung sobald von der Webseite ein neuer Wert bereitgestellt wird funktioniert nicht.
# die Werte werden auch alle in der Console ausgegeben. Dort sind sie immer aktuell (alle 5 sek eine neue Abfrage)
# Die Variablen die ganz oben ab Zeile 36 sind hab ich nur reingeschrieben weil pycharm mir sonst eine fehlermeldung bringt das die Variable nicht definiert sei...

WEATHER_API_URL = (
    'http://api.openweathermap.org/data/2.5/weather?'
    'APPID=db0d3062e5b81bbe72ecc6d74e8e8171&q=achenkirch&units=metric'
)

#http://api.openweathermap.org/data/2.5/weather?&APPID=db0d3062e5b81bbe72ecc6d74e8e8171&q=achenkirch&units=metric

WEATHER_EN_TO_DE = dict(Clouds='Bewoelkt', Rain='Regen', Clear='Wolkenlos', Snow='Schneefall')
#
# TODO Do these constants make sense?
wetterdaten = requests.get(WEATHER_API_URL).json()
stationsname = wetterdaten['name']
uhrzeit = datetime.fromtimestamp(wetterdaten['dt'])
wetter = WEATHER_EN_TO_DE[wetterdaten['weather'][0]['main']]
temperatur = wetterdaten['main']['temp']
sonnenaufgang = datetime.fromtimestamp(wetterdaten['sys']['sunrise'])
sonnenuntergang = datetime.fromtimestamp(wetterdaten['sys']['sunset'])

Builder.load_string("""
<Startbildschirm>:
    timeb:time_box
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 0.5
        Rectangle:
            pos: self.pos
            size: self.size
            source:
            
    FloatLayout:
        Label: # Uhrzeit und Datum
            id:time_box
            text:root.update()
            size_hint_x: 6
            pos_hint:{"center_x": 0.5, "center_y":0.95}
            font_size: 30
            color: 2, 2, 2, 2
        Button:
            id: jaja
            font_size: 30
            color: 1, 1, 1, 1
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.8}
            background_normal:
            text: "Wetter"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.transition.duration = 2
                root.manager.current = 'Wetteranzeige'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.15, "center_y":0.5}
            background_normal:
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei1'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.2, "center_y":0.2}
            background_normal:
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei2'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.8}
            background_normal:
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei3'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.85, "center_y":0.5}
            background_normal:
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei4'
        Button:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.8, "center_y":0.2}
            background_normal:
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.transition.duration = 2
                root.manager.current = 'Frei5'

<Wetteranzeige>:
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 0.5
        Rectangle:
            pos: self.pos
            size: self.size
            
        
               
    FloatLayout:
        Label:
            id: jaja
            font_size: 30
            color: 1, 1, 1, 1
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.5, "center_y":0.9}
            background_normal:
            text:"Wetter in "+(root.stationkivy)
            
        Label:
            font_size: 15 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.5, "center_y":0.85}
            background_normal:
            text:"Messung von"+" "+(root.zeitkivy[11:16])+ " Uhr"
            
        Label:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.5, "center_y":0.75}
            background_normal:
            text:root.wetterkivy         
                
        Label:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.2, 0.15
            pos_hint:{"center_x": 0.5, "center_y":0.55}
            background_normal:
            text: "Temperatur"+" " +(root.temperaturkivy[:1])+" "+"Grad"
            
        Label:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.5, "center_y":0.35}
            background_normal:
            text:"Sonnenaufgang "+(root.sonnenaufgangkivy[11:16])+" Uhr"
            
        Label:
            font_size: 30 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.15, 0.15
            pos_hint:{"center_x": 0.5, "center_y":0.15}
            background_normal:
            text:"Sonnenuntergang "+(root.sonnenuntergangkivy[11:16])+" Uhr"
    
        Button:
            font_size: 15 #Schrift
            color: 1,1,1, 1 #Schriftfarbe
            size_hint: 0.1, 0.1
            pos_hint:{"center_x": 0.9, "center_y":0.1}
            background_normal:
            text:"Zurueck"
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.transition.duration = 2
                root.manager.current = 'Startbildschirm'
                   
    
    
<Frei1>:
    BoxLayout:
        Button:
            text: "Frei1"
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'Startbildschirm'

<Frei2>:
    BoxLayout:
        Button:
            text: "Frei2"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.current = 'Startbildschirm'

<Frei3>:
    BoxLayout:
        Button:
            text: "Frei3"
            on_press:
                root.manager.transition.direction = 'up'
                root.manager.current = 'Startbildschirm'

<Frei4>:
    BoxLayout:
        Button:
            text: "Frei4"
            on_press:
                root.manager.transition.direction = 'right'
                root.manager.current = 'Startbildschirm'

<Frei5>:
    BoxLayout:
        Button:
            text: "Frei5"
            on_press:
                root.manager.transition.direction = 'down'
                root.manager.current = 'Startbildschirm'
""")


class Startbildschirm(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_interval(self.update, 1)

    def update(self, _dt=None):
        self.timeb.text = time.asctime()
        return time.asctime()


class Wetteranzeige(Screen):
    wetterkivy = StringProperty('')
    stationkivy = StringProperty('')
    temperaturkivy = ObjectProperty('')
    sonnenaufgangkivy = ObjectProperty('')
    sonnenuntergangkivy = ObjectProperty('')
    zeitkivy = ObjectProperty('')

    @staticmethod
    def update_weather_information(_dt=None):
        wetterdaten = requests.get(WEATHER_API_URL).json()
        stationsname = wetterdaten['name']
        uhrzeit = datetime.fromtimestamp(wetterdaten['dt'])
        wetter = WEATHER_EN_TO_DE[wetterdaten['weather'][0]['main']]
        temperatur = wetterdaten['main']['temp']
        sonnenaufgang = datetime.fromtimestamp(wetterdaten['sys']['sunrise'])
        sonnenuntergang = datetime.fromtimestamp(wetterdaten['sys']['sunset'])
        print(stationsname)
        print(format(uhrzeit, '%H:%M:%S'))
        print(temperatur)
        print(wetter)
        print(format(sonnenaufgang, '%H:%M:%S'))
        print(format(sonnenuntergang, '%H:%M:%S'))


        with open('Wetter Achenkirch.txt', 'w', encoding='utf-8') as file:
            file.write('Temperatur {}\n'.format(temperatur))

    def __init__(self, **kwargs):
        self.wetterkivy = wetter
        self.stationkivy = stationsname
        self.temperaturkivy = (str(temperatur))
        self.zeitkivy = (str(uhrzeit))
        self.sonnenaufgangkivy = (str(sonnenaufgang))
        self.sonnenuntergangkivy = (str(sonnenuntergang))
        # self.wetterkivy = StringProperty(wetter)
        # self.stationkivy = StringProperty(stationsname)
        super().__init__(**kwargs)

        Clock.schedule_interval(self.update_weather_information, 5)



class Frei1(Screen):
    pass


class Frei2(Screen):
    pass


class Frei3(Screen):
    pass


class Frei4(Screen):
    pass


class Frei5(Screen):
    pass


class WetterApp(App):
    def build(self):
        screen_manager = ScreenManager()
        screen_manager.add_widget(Startbildschirm(name='Startbildschirm'))
        screen_manager.add_widget(Wetteranzeige(name='Wetteranzeige'))
        screen_manager.add_widget(Frei1(name='Frei1'))
        screen_manager.add_widget(Frei2(name='Frei2'))
        screen_manager.add_widget(Frei3(name='Frei3'))
        screen_manager.add_widget(Frei4(name='Frei4'))
        screen_manager.add_widget(Frei5(name='Frei5'))
        return screen_manager



def main():
    app = WetterApp()
    app.run()


if __name__ == '__main__':
    main()
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natuerlich ist es die gleiche Uhr - den Wetterdienst konnte ich mangels API-Key nicht abfragen. Und dessen Methode update_weather_information ist als Klassmethod ungeeignet, denn sie kann ja nicht auf eine String-Property oder aehnliches zugreifen, mit der ein geaenderter Text kommuniziert wird. Darum habe ich ein Beispiel gebaut, das funktioniert. Das deine Uhr schon tut - das konnte ich nicht sehen, da ich wie gesagt dein Skript nicht zu einer Darstellung bewegen konnte.
Antworten