Seite 1 von 1

Python Variabel im Branca-Template anzeigen

Verfasst: Freitag 1. Mai 2020, 17:44
von chilltok
Hallo zusammen,

ich versuche bisher vergeblich eine Variabel die ich im Python-Skript definiert habe im HTML-Code des Template anzeigen zu lassen.

Code: Alles auswählen

anzahl = 10

template = """
{% macro html(this, kwargs) %}

<!doctype html>
<html lang="en">
<head>
</head>
<body>

 
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:2px solid grey; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:14px; right: 20px; bottom: 20px;'>
     
<div class='legend-title'>Patientenanzahl</div>
<div class='legend-scale'>
  <ul class='legend-labels'>         
    <li><span style='background:red;opacity:0.9;'></span>[b]Anzahl: {{ anzahl }} [/b]</li>
  </ul>
</div>
</div>
 
</body>
</html>
Das Skript lässt sich ohne Fehlermeldung ausführen, aber die Variabel "Anzahl" wird nicht gezeigt. Hatte auch schon versucht eine Funktion zu erstellen und diese aufzurufen und mir dann den Rückgabewert anzeigen zu lassen, dass hat leider auch nicht funktioniert.

Weiß da jemand vielleicht was ich falsch machen?

Re: Python Variabel im Branca-Template anzeigen

Verfasst: Freitag 1. Mai 2020, 19:07
von __blackjack__
@chilltok: Das lässt sich nicht ohne Fehlermeldung ausführen, denn das ist kein vollständiges Python-Programm. Selbst wenn man die fehlenden schliessenden Anführungszeichen ergänzt, macht das da natürlich nichts ausser zwei Variablen zu definieren.

Wobei das auf Modulebene keine Variablen sein sollten, sondern Konstanten. Was die Vorlage wohl ist, aber `anzahl`?

Re: Python Variabel im Branca-Template anzeigen

Verfasst: Samstag 2. Mai 2020, 11:43
von chilltok
Hallo,

der Code ist ein Ausschnitt gewesen dachte das wäre etwas übersichtlicher, hier ist der Rest. Das Skript soll eine Karte darstellen und darauf verschiedene GPS-Marker anzeigen (das klappt auch soweit). In der Legende möchte ich aber die aktuelle Anzahl wiedergeben. Daran scheitert es leider noch.

Code: Alles auswählen

import folium
from branca.element import Template, MacroElement
import json

template = """
{% macro html(this, kwargs) %}

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Draggable - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  
  <script>
  $( function() {
    $( "#maplegend" ).draggable({
                    start: function (event, ui) {
                        $(this).css({
                            right: "auto",
                            top: "auto",
                            bottom: "auto"
                        });
                    }
                });
});

  </script>
</head>
<body>

 
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:2px solid grey; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:14px; right: 20px; bottom: 20px;'>
     
<div class='legend-title'>Patientenanzahl</div>
<div class='legend-scale'>
  <ul class='legend-labels'>    
     
    <li><span style='background:red;opacity:0.9;'></span>Anzahl: {{ anzahl }}</li>    
  </ul>
</div>
</div>
 
</body>
</html>

<style type='text/css'>
  .maplegend .legend-title {
    text-align: left;
    margin-bottom: 5px;
    font-weight: bold;
    font-size: 90%;
    }
  .maplegend .legend-scale ul {
    margin: 0;
    margin-bottom: 5px;
    padding: 0;
    float: left;
    list-style: none;
    }
  .maplegend .legend-scale ul li {
    font-size: 80%;
    list-style: none;
    margin-left: 0;
    line-height: 18px;
    margin-bottom: 2px;
    }
  .maplegend ul.legend-labels li span {
    display: block;
    float: left;
    height: 16px;
    width: 30px;
    margin-right: 5px;
    margin-left: 0;
    border: 1px solid #999;
    }
  .maplegend .legend-source {
    font-size: 80%;
    color: #777;
    clear: both;
    }
  .maplegend a {
    color: #777;
    }
</style>
{% endmacro %}"""

  folium.Marker(
        location=[x.LAT, x.LNG],
        popup="-Nr.: "+str(x.NR)+"\n Letzte Aktualisierung: "+x.TIME,
        icon=folium.Icon(color = "black",icon_color=c, icon='user')
    ).add_to(m)
    m.location =[x.LAT, x.LNG]
    

m.get_root().add_child(macro)

m

Re: Python Variabel im Branca-Template anzeigen

Verfasst: Samstag 2. Mai 2020, 11:58
von __blackjack__
@chilltok: Das ist immer noch kein Python das am Compiler vorbei kommt. Und sollte die Einrückung korrigiert werden, sind `macro`, `c`, `m`, und `x` nicht definiert.

Re: Python Variabel im Branca-Template anzeigen

Verfasst: Samstag 2. Mai 2020, 11:59
von Sirius3
Da fehlt immer noch das entscheidende Stück im Code. template wird immer noch nirgends benutzt.

Re: Python Variabel im Branca-Template anzeigen

Verfasst: Samstag 2. Mai 2020, 12:42
von chilltok
Hier ist der vollständige Code:

Code: Alles auswählen

anzahl = 10

template = """
{% macro html(this, kwargs) %}

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Draggable - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  
  <script>
  $( function() {
    $( "#maplegend" ).draggable({
                    start: function (event, ui) {
                        $(this).css({
                            right: "auto",
                            top: "auto",
                            bottom: "auto"
                        });
                    }
                });
});

  </script>
</head>
<body>

 
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:2px solid grey; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:14px; right: 20px; bottom: 20px;'>
     
<div class='legend-title'>Points</div>
<div class='legend-scale'>
  <ul class='legend-labels'>    
     
    <li><span style='background:red;opacity:0.9;'></span>Anzahl: {{ anzahl }}</li>   

  </ul>
</div>
</div>
 
</body>
</html>

<style type='text/css'>
  .maplegend .legend-title {
    text-align: left;
    margin-bottom: 5px;
    font-weight: bold;
    font-size: 90%;
    }
  .maplegend .legend-scale ul {
    margin: 0;
    margin-bottom: 5px;
    padding: 0;
    float: left;
    list-style: none;
    }
  .maplegend .legend-scale ul li {
    font-size: 80%;
    list-style: none;
    margin-left: 0;
    line-height: 18px;
    margin-bottom: 2px;
    }
  .maplegend ul.legend-labels li span {
    display: block;
    float: left;
    height: 16px;
    width: 30px;
    margin-right: 5px;
    margin-left: 0;
    border: 1px solid #999;
    }
  .maplegend .legend-source {
    font-size: 80%;
    color: #777;
    clear: both;
    }
  .maplegend a {
    color: #777;
    }
</style>
{% endmacro %}"""


class Point:
    def __init__(self, nr, sk ,time, lat ,lng):         
        self.NR = nr
        self.SK = sk
        self.TIME = time
        self.LAT = lat
        self.LNG =lng


def AddData(y):    
    obj = json.loads(y)

    for x in Data:
        if x.NR == obj['MAC']:        
            break
    else:
        tmp =  obj['LOC'].split(';')
        lat_values = tmp[0]
        lon_values = tmp[1]      
        s = obj['MAC'].replace(':','')        
        Nr = int(str(int(s, 16))[0:4])   
      
       
        Points.append(Point(Nr,obj['SK'],obj['TIME'],lat_values,lon_values))


Points= []

m = folium.Map(
    location=[51.240447, 6.508115],
    zoom_start=19,
    tiles='OpenStreetMap'
)
macro = MacroElement()
macro._template = Template(template)

tiles='OpenStreetMap'

msg = ({"MAC":"A4:CF:12:DF:6A:9B","SK":1,"LOC":"51.240747;6.508115","TIME":"14:20"})
y = json.dumps(msg)
AddData(y)

for x in Data:
    c = "green"    
    if x.SK == 1:
        c = "red";     
    elif x.SK==4:
        c = "blue"
    elif x.SK==0:
        c = "white"
    folium.Marker(
        location=[x.LAT, x.LNG],
        popup="Nr.: "+str(x.NR)+"\n Letzte Aktualisierung: "+x.TIME,
        icon=folium.Icon(color = "black",icon_color=c, icon='user')
    ).add_to(m)
    m.location =[x.LAT, x.LNG]
    

m.get_root().add_child(macro)

m
Auf der Karte wo ich in der Legende die Anzahl gerne anzeigen lassen würde steht dann nur "Anzahl:"

Re: Python Variabel im Branca-Template anzeigen

Verfasst: Samstag 2. Mai 2020, 13:50
von __blackjack__
@chilltok: Da fehlen jetzt ziemlich sicher Importe und mindestens `Data` ist nicht definiert. Es kann doch nicht so schwer sein Quelltext komplett zu kopieren‽

Die Zuweisung an ein Attribut das nicht zur öffentlichen API des Objekts gehört (`_template`) sieht auch kaputt aus.

Namen sollten keine kryptischen Abkürzungen enthalten und schon gar nicht aus einzelnen Buchstaben bestehen. Wenn man `color` meint, sollte man nicht `c` schreiben. Bei anderen Namen kann man nur raten wie die denn tatsächlich heissen sollten.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Daraus folgt das Funktionen und Methoden alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Die Attributnamen von `Point` sind also alle falsch, weil das keine Konstanten sind.

Der letzte Ausdruck ``m`` macht so keinen Sinn.