Wie sage ich es in Python ? (Einsteigerfragen)

  • Hallo,

    Es geht um Migration von Python2 nach Python3.

    • Function pygame.font.Font(font, font_size), beschwert sich in Python3, wenn Param font_size nicht int ist.
      Frage: Warum hat Python2 sich nicht beschwert?
    • Function pygame.transform.smoothscale (Surface, (w, h)) beschwert sich in Python3, wenn Param w oder h nicht int sind.
      Frage: Warum hat Python2 sich nicht beschwert?

    Danke schonmal, kle

  • Hallo,


    > Warum hat Python2 sich nicht beschwert?

    Beschwert = Warning oder Error?


    Nutzen Pygamg für P2 und P3 den gleiche Code / das gleich Python-Modul oder wird das getrennt ausgeliefert?

    Aber das Verhalten vpn P3 würde ich als richtig bezeichnen und das von P2 als "suboptimal" - was anderes als ein Integer macht hier ja IMHO keinen Sinn.


    Ansonsten ist das wohl eher eine Frage für die Entwickler von Pygame... ;)


    Gruß, noisefloor

  • Nein, P3 nutzt python3-pygame und P2 nutzt python-pygame.

    Doch, das sind nur unterschiedliche Debian-Pakete (PyGame ist teilweise in C geschrieben). Es wird der gleiche Code verwendet: https://github.com/pygame/pygame


    In P3 haben die Funktionen pygame.font.Font und pygame.transform.smoothscale Exceptions geworfen.

    WELCHE?


    Hast du die gleiche PyGame-Version in Python 2 und 3 in Verwendung?

  • Hallo

    noisefloor und Linus für mich ist Python keine Muttersprache, deshalb tue ich mich schwer Euch zu verstehen bzw. richtig zu fragen.


    Die Lösung:

    Info: h = 320

    font_size = h/14

    wird in P2 und in P3 unterschiedlich interpretiert:

    • P2: font_size hat Typ int und Value 22
    • P3: font_size hat Typ float und Value 22.8571428571428


    Die P3 Tracebacks waren eine Folge davon.

    P2 läuft ohne Fehler:

    Code
    root@pipaos4:/usr/local/lib/newtron-v2# python newtron-radio.py
    trying fbcon
    using fbcon
    Display area size: 480 x 320
    connected using unix socket...
    font_size = 22 # nach "font_size = h/14"
    font_size = 22 # vor "pygame.font.Font"

    Schönen Gruß, kle

  • Hallo,


    axo - ja, das ist so: wenn du in Python zwei Integer dividierst, bekommst du immer einen Integer zurück. Auch, wenn das Ergebnis eigentlich ein Float wäre. Dann rundet Python 2 immer ab. Python 3 rechnet "richtig", d.h. liefert wenn die Division nicht glatt ist, einen Float zurück. Das ist aber auch bei den Unterschieden P2 <-> P3 dokumentiert.


    Du musst deinen Code halt leicht anpassen, z.B. in dem du `font_size = int(h/14)` schreibst. Läuft so auch unter P2 und liefert unter P3 das gewünschte Ergebnis.


    Gruß, noisefloor

  • Danke,

    das hatte ich auch schon so gemacht.


    Jetzt beschäftige ich mich mit SVG Grafik.

    Die (pseudografische) Oberfläche von newtron-radio besteht aus skalierten SVG-Grafiken.

    Das habe ich für Python3 minimal-invasiv geändert, (weil kaa.imlib2 nur in Python2 läuft).

    Bei genauer Betrachtung fallen mir an einzelnen Stellen Unterschiede zwischen P2 und P3 auf.

    (An einer bestimmten Stelle links unten, sind einzelne Striche heller. Auch Check-Boxen erscheinen heller. Liegt das an der Koordinatenberechnung?)

    Das ist ein ungelöstes Rätsel für mich. Ich habe keine Ahnung von Bildverarbeitung.


    Es gibt eine zentrale Funktion pygame_svg. Die originale läuft nur mit Python2, die geänderte nur unter Python3.

    Angeregt vom Peppy Player, habe ich kaa.imlib2 (läuft nicht unter Python3) ersetzt durch pynanosvg.

    Code: newtron-radio.py, Funktion pygame_svg (Original von veloci)
    def pygame_svg(svg_file, color, size):
        with open(svg_file, "r+") as f:
            svgbuf = f.read()
        colorstr = '#%02x%02x%02x' % color
        svgbuf = svgbuf.replace("#00ffff", colorstr)
    
        svg = imlib2.open_from_memory(svgbuf,size)
        strbuf = str(svg.get_raw_data(format='RGBA'))
        image = pygame.image.frombuffer(strbuf, size,"RGBA").convert_alpha()
        return image

    Schönen Gruß, kle

  • Hallo,


    Quote

    Bei genauer Betrachtung fallen mir an einzelnen Stellen Unterschiede zwischen P2 und P3 auf.

    Pauschal würde ich sagen: soll eigentlich nicht sein. SVG ist ja ein Grafikformat, was den darzustellenden Inhalt als XML beschreibt. Das XML in ein Bild umzuwandeln ist dann Sachen der Rendering-Engine.

    Grundsätzlich könnte es schon sein, dass verschiedene Rendering-Engines ein leicht anders Ergebnis liefern oder das beim Umskalieren der Grafik das ganze anders wirkt. Lässt sich so von aussen aber schlecht sagen.


    Gruß, noisefloor

  • Hallo,

    ich bin hartnäckig.

    Beim Schreiben fällt mir ein, daß das Problem möglicherweise mit den Positionen der SVGs und nicht mit ihrer Höhe und Breite zusammenhängt.

    Vielleicht haben sich die Werte der Positionen durch Berechnung in Python3 verändert?

    Werde ich mal anschauen.

    Schönen Gruß, kle

    Edited once, last by kle ().

  • Hallo Manul,

    das ist ein Problem. im Moment boote ich in die Console (raspbian-lite), also kein VNC möglich. Bilder von meinem Schmartphone sind überstrahlt. Ich probiere weiter

    Danke, kle

  • Hallo Zusammen,


    ich möchte für mich ein kleines Programm schreiben, dass mir Zeichenketten und / oder Zahlen "verändert".


    Hier ein kleines Beispiel:

    AbC sollte zum Beispiel in DeF umgewandelt werden. Also quasi um 3 Stellen im Alphabet erhöht werden.

    oder

    123 sollte in 456 umgewandelt werden.


    Es muss keine grafische Oberfläche haben, es würde auf der Commandozeile reichen.

    Ist sowas mit Python umsetzbar?

  • Hallo zusammen,


    dies ist das erste Forum, das ich jemals genutzt habe. Ich erhoffe mir, durch direkte Fragen zu direkten Antworten zu kommen, was mittels Google sehr oft nicht so gut funktioniert.

    Und zwar folgendes:

    Mein Script startet per subprocess.Popen eine URL im chromium-browser.

    Anschließend gibt es im Script eine Eingabemöglichkeit (input).

    Problem dabei: Der geöffnete Browser ist nun im Vordergrund und die getätigte Eingabe erfolgt demzufolge im Browser und nicht, wie gewünscht, im Script.

    Das Script soll ohne Monitor laufen, deshalb kann ich das Problem nicht einfach durch manuelles Klicken auf das Script lösen.


    Gibt es eine Möglichkeit, den Browser zu starten und dabei das Script als aktives Fenster bestehen zu lassen?