QR-Code ******* QR-Code ist eine 2D-Symbologie, die häufig für URLs und Kontaktdaten verwendet wird. Siehe auch: QR-Code auf Wikipedia für Hintergründe zur Symbologie selbst. QR-Codes sind in ISO/IEC 18004 definiert (Informationstechnik -- Automatische Identifikation und Datenerfassungsverfahren -- Spezifikation der Barcode-Symbologie QR Code). Beispiel ======== from pystrich.qrcode import QRCodeEncoder encoder = QRCodeEncoder("https://github.com/mmulqueen/pyStrich") encoder.save_svg("qrcode-example.svg") [Bild: QR-Code, der die pyStrich-GitHub-URL codiert.][Bild] Größe und Ruhezone ================== Das Argument "cellsize" von "save()" und "get_imagedata()" legt die Kantenlänge eines Moduls in Pixeln fest (Vorgabe "5"). Siehe auch: Barcodes drucken für Hinweise zur Wahl von "cellsize" bei gedruckter Ausgabe. encoder = QRCodeEncoder("https://github.com/mmulqueen/pyStrich") encoder.save("qrcode-large.png", cellsize=10) [Bild: QR-Code, der die pyStrich-GitHub-URL codiert, gerendert mit cellsize=10.][Bild] Ausgabeformate ============== SVG-Ausgabe ----------- Zum Einbetten in Webseiten oder für jeden Arbeitsablauf, der von auflösungsunabhängiger Ausgabe profitiert, verwenden Sie "save_svg()" (oder "get_svg()", um das SVG als Zeichenkette zu erhalten). from pystrich.marks import MarkShape QRCodeEncoder("https://github.com/mmulqueen/pyStrich").save_svg("qr.svg") QRCodeEncoder("https://github.com/mmulqueen/pyStrich").save_svg( "qr-circles.svg", mark_shape=MarkShape.CIRCULAR_CELLS ) Die "viewBox" des SVG ist in Moduleinheiten angegeben, während "width" und "height" mit "cellsize" skalieren. Das Schlüsselwort "mark_shape" bestimmt, wie gesetzte Zellen gezeichnet werden -- horizontale Folgen von Rechtecken (die Vorgabe) oder ein gefüllter Kreis pro Zelle. Bemerkung: Runde Zellen liegen außerhalb der standardmäßigen Modulform und die Decoder-Unterstützung variiert. Testen Sie es vor dem Einsatz mit Ihrem Zielscanner. Neu in Version 0.12. PNG-Ausgabe ----------- Verwenden Sie für die Rasterausgabe "save()", um eine PNG-Datei zu schreiben, oder "get_imagedata()", um die rohen PNG-Bytes zu erhalten. QRCodeEncoder("https://github.com/mmulqueen/pyStrich").save("qrcode.png") EPS-Ausgabe ----------- Verwenden Sie zum Einbetten in LaTeX ("\includegraphics") oder andere Vektor-Druck-Arbeitsabläufe "save_eps()" (oder "get_eps()", um das EPS als Zeichenkette zu erhalten). QRCodeEncoder("https://github.com/mmulqueen/pyStrich").save_eps("qr.eps") Das Argument "cellsize" ist die Kantenlänge eines Moduls in PostScript-Punkten (1 Punkt = 1/72 Zoll). Neu in Version 0.12. Terminal-Ausgabe ---------------- Für schnelle Anzeige auf dem Bildschirm liefert "get_terminal_art()" eine vom Scanner lesbare Darstellung mit Unicode-Halbblockzeichen. Jedes Zeichen steht für zwei Matrixzeilen und eine Spalte, sodass die Zellen in einer typischen Terminalschrift mit fester Breite ungefähr quadratisch erscheinen. print(QRCodeEncoder("https://github.com/mmulqueen/pyStrich").get_terminal_art()) █▀▀▀▀▀█ █▄█▀▀▀▄ ███▀▀ █▀▀▀▀▀█ █ ███ █ ▄▀██ ▀ █▀▄ ▀█ █ ███ █ █ ▀▀▀ █ ▄█▄█▀█▀▀▀▀█▄ █ ▀▀▀ █ ▀▀▀▀▀▀▀ █ ▀ ▀▄█ ▀▄█ ▀ ▀▀▀▀▀▀▀ █ ▀▀ ▀▀█ ▄█▄▀▀▀▀█▀▀▄▄ █▄▄▀ ▀█ ▄█ ▄▀▀▀█ ▄ ▀▄█▄▄▀█▄▄█▄▀▄ ▀▀▄ █▄ ▄█▄▀▀▀█▀█▀▄ ███ █ ▄ ▀█▄▄ ▀▄▄█ ▀▀ █▀▄▄▀▄█ ▀██▄█▄▄ ▀█▀ ▄▀▀▄██▀▄▀▀█ ▀▄ ▄▀ ▀▀▀ ▄▀█▄█ ▄█▄██ ▀▀█▄ █ █▀▄▄ ▀ ███ █ ▀ ▀ ▀▀▀▄▀██ █▄▄▄██ █▀▀▀███▄▄ █▀▀▀▀▀█ █▄▄▀ ▀ █ ▀▀█ ▀ ██ █▄ █ ███ █ ▄▄█▄▄ █▄█▀▀▄▀█▀██▄▀ ▄ █ ▀▀▀ █ ▀▀ ▀██ ▄▀▀▀ █▄ █ ▄▀▄▀ ▀▀▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ ▀ Standardmäßig wird die Ausgabe von ANSI-Escape-Codes umschlossen, die einen weißen Hintergrund und schwarzen Vordergrund erzwingen, sodass das Symbol unabhängig vom Farbschema des Terminals eingelesen werden kann. Übergeben Sie "ansi_bg=False" für eine einfache Ausgabe (nur auf einem hell gestalteten Terminal korrekt). Neu in Version 0.12. DXF-Ausgabe (CAD) ----------------- Für Anwendungen zur direkten Teilekennzeichnung (*direct part marking*) liefert "get_dxf()" eine DXF-Darstellung des Symbols, die CAD- und CAM-Werkzeuge direkt lesen können. Die "cellsize" ist in Ihrer gewählten Einheit "units" (Vorgabe ""mm"") statt in Pixeln angegeben. encoder = QRCodeEncoder("WDBCA45D2HA327260") with open("part.dxf", "w") as f: f.write(encoder.get_dxf(cellsize=0.5, units="mm")) Die Vorgabe "inverse=True" gibt Geometrie für die hellen Module aus, einschließlich der Ruhezone -- sodass der Begrenzungsrahmen (*bounding box*) das Symbol einrahmt. Übergeben Sie "inverse=False", um stattdessen nur die dunklen Module auszugeben, was dem normalen Erscheinungsbild des Symbols entspricht; der Begrenzungsrahmen schmiegt sich dann an die dunklen Zellen an und die Ruhezone muss in der nachgelagerten Verarbeitung wieder hinzugefügt werden. Fehlerkorrekturstufe ==================== QR-Codes betten redundante Daten ein, sodass ein teilweise beschädigtes Symbol noch gelesen werden kann. Die Fehlerkorrekturstufe (ECL) legt fest, wie viel Redundanz hinzugefügt wird, und ist eine der folgenden: +------------+--------------------------------------------------------+ | ""L"" | Niedrig: ~7 % der Codewörter wiederherstellbar. | | | Kleinstes Symbol. | +------------+--------------------------------------------------------+ | ""M"" | Mittel: ~15 %. **Vorgabe**, wenn "ecl" nicht angegeben | | | ist. | +------------+--------------------------------------------------------+ | ""Q"" | Quartil: ~25 %. | +------------+--------------------------------------------------------+ | ""H"" | Hoch: ~30 %. Größtes Symbol; toleriert die meiste | | | Beschädigung. | +------------+--------------------------------------------------------+ Höhere Stufen erzeugen ein dichteres Symbol für dieselben Nutzdaten (oder erfordern entsprechend ein größeres Symbol, um dieselben Nutzdaten aufzunehmen); wählen Sie daher die niedrigste Stufe, die Ihren Haltbarkeitsanforderungen genügt. ""H"" ist typischerweise Symbolen vorbehalten, die teilweise verdeckt sein können (z. B. durch ein Logo) oder auf Oberflächen gedruckt werden, die zerkratzt, verschmiert oder eingerissen werden könnten. QRCodeEncoder("https://en.wikipedia.org/wiki/Kings_River_(California)", ecl="H").save("qr-high.png") GS1 Digital Link ================ GS1 Digital Link codiert eine GTIN (mit optionaler Charge, Verfall, Seriennummer, ...) als URL. Es ist nur eine URL -- übergeben Sie sie direkt an "QRCodeEncoder": QRCodeEncoder("https://id.gs1.org/01/05050070007664/10/W126").save("dl.png") Rohes GS1-QR in Application-Identifier-Syntax (FNC1-Modusindikator) wird nicht unterstützt; verwenden Sie dafür Data Matrix. Nicht-ASCII-Text ================ "QRCodeEncoder" akzeptiert jede Unicode-Zeichenkette direkt und wählt den schmalsten passenden Zeichensatz. Kapseln Sie die Eingabe nur dann in "QRCodeData", wenn Sie diese Wahl einschränken möchten -- zum Beispiel, um ""ascii"" zu erzwingen, sodass ein versehentliches Nicht- ASCII-Zeichen einen Fehler auslöst, statt das Symbol stillschweigend zu vergrößern: +------------------+---------------------------------------------------------------------+ | Codierung | Verhalten | |==================|=====================================================================| | ""ascii"" | Löst "PyStrichInvalidInput" bei jedem Byte > 127 aus. | +------------------+---------------------------------------------------------------------+ | ""iso-8859-1"" | Latin-1. Deklariert am Anfang des Symbols ECI 3, damit Decoder bei | | | hohen Bytes nicht auf Shift-JIS-Heuristiken zurückfallen. | +------------------+---------------------------------------------------------------------+ | ""utf-8"" | Deklariert ECI 26 und codiert die Eingabe byteweise. Konforme | | | Decoder erkennen die Codierung automatisch. | +------------------+---------------------------------------------------------------------+ | ""shift_jis"" | Deklariert ECI 20 und aktiviert die Kanji-Modus-Kompression (13 Bit | | | pro JIS-X-0208-Zeichen gegenüber 24 Bit als UTF-8 im Byte-Modus). | | | Nur explizit wählbar; die automatische Auswahl wählt ihn nie. | +------------------+---------------------------------------------------------------------+ Tipp: Die automatisch gewählte Codierung ist immer die schmalste passende, sodass die Übergabe eines einfachen "str" bereits das kleinste Symbol ergibt. Eine Codierung von Hand zu wählen ist vor allem für die Eingabevalidierung nützlich -- z. B. um an der Grenze alles außerhalb von ASCII abzulehnen. # Plain str: Latin-1 picked automatically, ECI 3 emitted. QRCodeEncoder("Ich dachte, Sie wären kräftiger").save("latin1.png") # Plain str: UTF-8 picked automatically, ECI 26 emitted. QRCodeEncoder("€5 親切にしろ 🐻‍❄️").save("utf8.png") Wenn Sie eine Codierung festlegen, die nicht zur Eingabe passt, schlägt der ausgelöste Fehler die Codierung vor, die funktioniert *hätte*: >>> from pystrich.qrcode import QRCodeData >>> QRCodeData("Ich dachte, Sie wären kräftiger", encoding="ascii") Traceback (most recent call last): ... pystrich.exceptions.PyStrichInvalidInput: QRCodeData encoding ASCII cannot encode the input; try QRCodeData('Ich dachte, Sie wären kräftiger', encoding='iso-8859-1') or pass auto_encoding=True to select an encoding automatically. Japanisch mit Shift_JIS ----------------------- QRCodeEncoder(QRCodeData("親切にしろ", encoding="shift_jis")).save_svg("kanji.svg") [Bild: QR-Code, der die japanische Phrase 親切にしろ über den Shift_JIS-Kanji-Modus codiert.][Bild] Das Festlegen von "shift_jis" aktiviert die Kanji-Modus-Kompression -- 13 Bit pro JIS-X-0208-Zeichen gegenüber 24 als UTF-8 im Byte-Modus. Die automatische Auswahl wählt ihn nicht. WLAN-Netzwerk ============= Telefone bieten an, einem Netzwerk beizutreten, wenn sie einen QR-Code mit "WIFI:"-Nutzdaten scannen. "QRCodeData.wifi_network()" erstellt solche Nutzdaten im Format der Wi-Fi Alliance WPA3 Specification v3.5: from pystrich.qrcode import QRCodeData, QRCodeEncoder payload = QRCodeData.wifi_network(ssid="DoubleDeuceGuest", password="PainDontHurt") QRCodeEncoder(payload).save("wifi.png") [Bild: QR-Code für den Beitritt zum Netzwerk DoubleDeuceGuest][Bild] Lassen Sie das Passwort für ein offenes Netzwerk weg (das Typ-Feld entfällt) und übergeben Sie "hidden=True" für ein Netzwerk, das seine SSID nicht aussendet. Aufbau ====== Ein QR-Code trägt die Nutzdaten in einem Meer von Datenmodulen, umgeben von mehreren festen Funktionsmustern, mit denen Scanner das Symbol lokalisieren, ausrichten und decodieren. Das Diagramm unten beschriftet ein Symbol der Version 5 (37x37 Module); größere Versionen wiederholen dieselben Teile und fügen weitere Ausrichtungsmuster hinzu, ab Version 7 zusätzlich einen Versionsinformationsblock. [Bild: Beschrifteter QR-Code der Version 5, der die Suchmuster, Trennmuster, Taktmuster, das Ausrichtungsmuster, den Datenbereich und die Ruhezone zeigt.][Bild] * **Suchmuster** (*position detection patterns*) -- die drei großen Quadrate in der oberen linken, oberen rechten und unteren linken Ecke. Scanner erkennen damit das Symbol aus jedem Winkel und leiten seine Ausrichtung aus der einen fehlenden Ecke ab. * **Trennmuster** (*separators*) -- ein weißer Streifen von einem Modul Breite, der jedes Suchmuster vom Datenbereich isoliert und das *Suchmuster* eindeutig hält. * **Taktmuster** (*timing patterns*) -- eine Zeile und eine Spalte aus abwechselnd dunklen und hellen Zellen, die zwischen den oberen Suchmustern und zwischen den linken Suchmustern verlaufen. Sie legen das Modulraster über das gesamte Symbol fest. * **Ausrichtungsmuster** (*alignment pattern*) -- kleinere Quadrate, die ab Version 2 in den Datenbereich eingefügt werden, um *projektive Verzerrung* zu korrigieren, wenn das Symbol schräg fotografiert wird. Version 5 hat eines; die größten Versionen haben mehrere Dutzend. * **Daten und Fehlerkorrektur** -- der maskierte *Codewort*-Strom (Nutzdaten plus *Reed-Solomon*). Das ist es, was mit der Version skaliert. * **Ruhezone** (*quiet zone*) -- vier Module weißer Rand auf jeder Seite, wie von der QR-Code-Spezifikation vorgeschrieben. API === class QRCodeEncoder(text: str | QRCodeData, ecl: Literal['L', 'M', 'Q', 'H'] | None = None) Bases: "Matrix2DEncoder"["int"] Codiert Text als QR-Code-2D-Barcode. Ein einfacher "str" wird mit dem schmalsten passenden Zeichensatz codiert: ASCII (kein ECI), Latin-1 (ECI 3) oder UTF-8 (ECI 26). Übergeben Sie ein "QRCodeData", um die Codierung explizit festzulegen. Typische Verwendung: encoder = QRCodeEncoder("https://d-nb.info/gnd/135514053") encoder.save("qr.png") Variablen: * **matrix** -- 2D-Liste, die das Symbol vor dem Rendern beschreibt. * **width** -- Pixelbreite des zuletzt gerenderten Bildes. * **height** -- Pixelhöhe des zuletzt gerenderten Bildes. init_renderer() -> QRCodeRenderer Konstruiert einen "QRCodeRenderer" für die codierte Matrix. Aktualisiert "width" und "height" mit den Maßen des Renderers und gibt den Renderer zurück. get_ascii() -> str Gibt eine ASCII-Art-Darstellung des Symbols zurück. Rückgabetyp: str get_dxf(cellsize: float = 1.0, inverse: bool = True, units: Literal['in', 'ft', 'mi', 'mm', 'cm', 'm'] | None = 'mm', *, mark_shape: MarkShape = MarkShape.SQUARE_CELLS) -> str Gibt eine DXF-Darstellung (CAD) des Symbols zurück. Parameter: * **cellsize** -- Kantenlänge eines Moduls in "units". * **inverse** -- Wenn "True" (die Vorgabe), werden helle Module als gefüllte Zellen gezeichnet. Wenn "False", werden dunkle Module gezeichnet, was dem normalen Erscheinungsbild des Symbols entspricht. * **units** -- Eines von ""in"", ""ft"", ""mi"", ""mm"", ""cm"" oder ""m"" oder "None" für nicht angegeben ("$INSUNITS=0"). * **mark_shape** -- Wie gesetzte Zellen gruppiert und gezeichnet werden. Rückgabetyp: str Neu in Version 0.9. Geändert in Version 0.12: "units" unterstützt jetzt ""in"", ""ft"", ""mi"", ""cm"", ""m"" und "None" (nicht angegeben); zuvor wurde jeder andere Wert als ""mm"" stillschweigend als nicht angegeben behandelt. get_eps(cellsize: int = 5, *, inverse: bool = False, mark_shape: MarkShape = MarkShape.HORIZONTAL_RUNS, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> str Rendert das Symbol und gibt EPS-Markup zurück. Parameter: * **cellsize** -- Kantenlänge eines Moduls in PostScript- Punkten. * **inverse** -- Wenn "True", die hellen statt der dunklen Zellen markieren. * **mark_shape** -- Wie gesetzte Zellen gruppiert und gezeichnet werden. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA", deckend. Standard ist Weiß. Rückgabetyp: str Neu in Version 0.12. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. get_imagedata(cellsize: int = 5, *, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> bytes Rendert das Symbol und gibt PNG-Bytes zurück. Parameter: * **cellsize** -- Kantenlänge eines Moduls in Pixeln. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Weiß. Rückgabe: PNG-codierte Bilddaten. Rückgabetyp: bytes Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. get_pilimage(cellsize: int = 5, *, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> PILImage Rendert das Symbol und gibt ein Pillow-Bild zurück. Parameter: * **cellsize** -- Kantenlänge eines Moduls in Pixeln. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Weiß. Rückgabe: Das gerenderte Symbol. Rückgabetyp: PIL.Image.Image Neu in Version 0.11. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. get_svg(cellsize: int = 5, *, inverse: bool = False, mark_shape: MarkShape = MarkShape.HORIZONTAL_RUNS, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> str Rendert das Symbol und gibt SVG-Markup zurück. Parameter: * **cellsize** -- Kantenlänge eines Moduls in Benutzereinheiten. * **inverse** -- Wenn "True", die hellen statt der dunklen Zellen markieren. * **mark_shape** -- Wie gesetzte Zellen gruppiert und gezeichnet werden. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Weiß. Rückgabetyp: str Neu in Version 0.12. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. get_terminal_art(*, ansi_bg: bool = True) -> str Rendert das Symbol mit Unicode-Halbblockzeichen für Terminals. Jedes Zeichen steht für zwei Matrixzeilen und eine Spalte, erzeugt näherungsweise quadratische Zellen in einer typischen Schrift mit fester Breite und liefert ein Ergebnis, das auf dem Bildschirm vom Scanner lesbar ist. Parameter: **ansi_bg** -- Wenn "True" (die Vorgabe), jede Zeile in ANSI- Escape-Codes einschließen, die einen weißen Hintergrund und schwarzen Vordergrund erzwingen, sodass das Symbol unabhängig vom Farbschema des Terminals vom Scanner lesbar ist. Setzen Sie ihn auf "False" für eine einfache Ausgabe (nur auf einem hell gestalteten Terminal korrekt). Rückgabetyp: str Neu in Version 0.12. png_dataurl(cellsize: int = 5, *, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> str Rendert das Symbol und gibt einen PNG-"data:"-URL-String zurück. Parameter: * **cellsize** -- Kantenlänge eines Moduls in Pixeln. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Weiß. Rückgabetyp: str Neu in Version 0.15. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. save(filename: str | os.PathLike[str], cellsize: int = 5, *, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> None Speichert das Symbol als PNG. Übergeben Sie einen ".png"-Dateinamen. Parameter: * **filename** -- PNG-Ausgabepfad. * **cellsize** -- Kantenlänge eines Moduls in Pixeln. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Weiß. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. save_eps(filename: str | os.PathLike[str], cellsize: int = 5, *, inverse: bool = False, mark_shape: MarkShape = MarkShape.HORIZONTAL_RUNS, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> None Speichert das Symbol als EPS-Datei. Übergeben Sie einen ".eps"-Dateinamen. Parameter: * **filename** -- EPS-Ausgabepfad. * **cellsize** -- Kantenlänge eines Moduls in PostScript- Punkten. * **inverse** -- Wenn "True", die hellen statt der dunklen Zellen markieren. * **mark_shape** -- Wie gesetzte Zellen gruppiert und gezeichnet werden. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA", deckend. Standard ist Weiß. Neu in Version 0.12. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. save_svg(filename: str | os.PathLike[str], cellsize: int = 5, *, inverse: bool = False, mark_shape: MarkShape = MarkShape.HORIZONTAL_RUNS, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> None Speichert das Symbol als SVG-Datei. Übergeben Sie einen ".svg"-Dateinamen. Parameter: * **filename** -- SVG-Ausgabepfad. * **cellsize** -- Kantenlänge eines Moduls in Benutzereinheiten. * **inverse** -- Wenn "True", die hellen statt der dunklen Zellen markieren. * **mark_shape** -- Wie gesetzte Zellen gruppiert und gezeichnet werden. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Weiß. Neu in Version 0.12. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. svg_dataurl(cellsize: int = 5, *, inverse: bool = False, mark_shape: MarkShape = MarkShape.HORIZONTAL_RUNS, dark_hex: str | RGBA | None = None, light_hex: str | RGBA | None = None) -> str Rendert das Symbol und gibt einen SVG-"data:"-URL-String zurück. Parameter: * **cellsize** -- Kantenlänge eines Moduls in Benutzereinheiten. * **inverse** -- Wenn "True", die hellen statt der dunklen Zellen markieren. * **mark_shape** -- Wie gesetzte Zellen gruppiert und gezeichnet werden. * **dark_hex** -- Farbe der dunklen Module als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Schwarz. * **light_hex** -- Hintergrundfarbe als 3-, 6- oder 8-stelliger Hex-String oder "RGBA". Standard ist Weiß. Rückgabetyp: str Neu in Version 0.15. Geändert in Version 0.16: "dark_hex" und "light_hex" hinzugefügt. class QRCodeData(*segments: str | MarkerT, encoding: EncT | None = None, auto_encoding: bool = False) Bases: "EncodableData"["Literal"['ascii', 'iso-8859-1', 'utf-8', 'shift_jis'], "Never"] Encoder-Eingabe mit expliziter Zeichensatz-Wahl. "QRCodeEncoder" akzeptiert einen einfachen "str" und wählt die Codierung automatisch. Verwenden Sie "QRCodeData" nur, um die Codierung festzulegen -- erzwingen Sie zum Beispiel ""ascii"", um Nicht-ASCII-Eingaben abzulehnen, oder ""shift_jis"", um die Kanji- Modus-Kompression für japanische Nutzdaten freizuschalten. Übergeben Sie entweder "encoding=" (eines von ""ascii"", ""iso-8859-1"", ""utf-8"", ""shift_jis"") oder "auto_encoding=True". Mit "auto_encoding=True" wählt der Konstruktor die schmalste passende Codierung aus den ersten dreien; ""shift_jis"" ist nur explizit wählbar. Geändert in Version 0.15: ""shift_jis"" hinzugefügt, um die Kanji- Modus-Kompression freizuschalten. classmethod wifi_network(ssid: str, password: str | None = None, *, hidden: bool = False, transition_disable: int | None = None, password_identifier: str | None = None, public_key: str | None = None) -> QRCodeData Erstellt "WIFI:"-Nutzdaten, die ein Telefon scannen kann, um einem Netzwerk beizutreten. Erzeugt die WIFI-URI gemäß der Wi-Fi Alliance WPA3 Specification v3.5. Parameter: * **ssid** -- Netzwerkname. * **password** -- Netzwerkpasswort; für ein offenes Netzwerk weglassen. * **hidden** -- "True", wenn das Netzwerk seine SSID nicht aussendet. * **transition_disable** -- Transition-Disable-Bitmap, als Hexadezimalzahl dargestellt. * **password_identifier** -- SAE-Passwort-Identifikator. * **public_key** -- Base64-codierter SAE-PK-Public-Key, wortwörtlich eingefügt. Neu in Version 0.15. as_plain_text() -> tuple[str, EncT] Gibt den verketteten Text und den Codec zum Codieren zurück. Löst "_HasMarkers" aus, wenn ein Segment ein Roh-Marker statt einer Zeichenkette ist. Für Unterklassen ohne Marker ("MarkerT == Never") ist die Prüfung ein No-op.