Seite 38 von 40
					
				Re: kleine Mathe-Spielereien
				Verfasst: Montag 11. August 2025, 11:08
				von OSWALD
				11.8.2025
Endlich habe ich ein perfektes Programm gefunden,
 in dem  das CSV-Problem  demonstriert wird.
Ich werde versuchen  ein  analoges Programm mit anderen Daten
zu entwickeln. Einen Versuch ist es jedenfalls wert.##
(wer immer stetig sich bemüht, den können wir erlösen: frei nach Goethe FaustII)
OSWALD
Code: Alles auswählen
import requests
import matplotlib.pyplot as plt
import pandas as pd
import io
CSV_URL = 'https://www.kiel.de/opendata/kiel_gesetze_justiz_strassenverkehsunfaelle_verkehrstote_verletzte_fahrerflucht.csv'
#Anschließend kommt requests zum Einsatz, wobei die Daten der Variablen csv_data zugewiesen werden:
csv_data = requests.get(CSV_URL).content
#Jetzt kann ein Dataframe erzeugt werden,
#d.h. wir verwenden das Modul Pandas um die Daten zu parsen.
#Falls Euch der Begriff Dataframe noch nicht begegnet ist: Die Pandas-Bibliothek enthält einige nützliche Datenstrukturen, u.a. das Dataframe-Objekt.
#Dabei handelt es sich um eine Zwei-Dimensionale Tabelle mit Zeilen und Spalten (so wie man es beispielsweise aus einer Tabellenkalkulation wie Excel oder Numbers kennt).
df = pd.read_csv(io.StringIO(csv_data.decode('utf-8')), sep=';')
#Die ersten fünf Zeilen lassen sich übrigens wie folgt ausgeben:
print(df.head())
print(df)
#Daten visualisieren
#Dies war der interessante Teil.
##Anstatt eine lokale CSV-Datei zu verwenden, wurde das Modul requests genutzt,
#um die Daten aus dem Internet zu laden.
#Als Zeichencodierung habe ich „utf-8“ angegeben und zusätzlich
#ein Semikolon als Trennzeichen definiert.
#Der restliche Code entspricht meinem alten Beispiel:
fig, ax = plt.subplots()
x = df['Jahr']
y = df['Unfaelle']
print('Aufzaehlung der Unfaelle',x, y)
plt.title('Straßenverkehrsunfälle in Kiel', size='x-large')
plt.ylabel('Anzahl', size='x-large')
plt.xlabel('Jahr', size='x-large')
 
plt.plot(y, '*-', markersize=6, linewidth=1, color='b', label='Unfälle')
print(plt.plot(y, '*-', markersize=6))
plt.legend(loc=(0.4, 0.8))
ax.set_xticks(range(len(x)))
ax.set_xticklabels(x, rotation='vertical')
plt.show()
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Montag 11. August 2025, 11:56
				von __blackjack__
				`requests` und `io` hier selbst zu benutzen ist nicht notwendig — man kann Pandas auch eine URL statt eines Dateinamens übergeben.
Das Label "Jahr" ist bei mir nicht sichtbar.  `tight_layout()` schafft da Platz für.
Wenn man mit Statistik nicht lügen oder irreführen möchte, sollte bei solchen Plots die Bandbreite bis runter zu 0 gehen, sonst sehen Unterschiede/Änderungen in der Regel überproportional gross aus.
Code: Alles auswählen
#!/usr/bin/env python3
import matplotlib.pyplot as plt
import pandas as pd
CSV_URL = "https://www.kiel.de/opendata/kiel_gesetze_justiz_strassenverkehsunfaelle_verkehrstote_verletzte_fahrerflucht.csv"
def main():
    df = pd.read_csv(CSV_URL, sep=";", encoding="utf-8")
    _fig, ax = plt.subplots()
    plt.title("Straßenverkehrsunfälle in Kiel", size="x-large")
    plt.ylabel("Anzahl", size="x-large")
    plt.xlabel("Jahr", size="x-large")
    plt.plot(
        df["Unfaelle"],
        "*-",
        markersize=6,
        linewidth=1,
        color="blue",
        label="Unfälle",
    )
    # plt.legend(loc="upper center")
    x = df["Jahr"]
    ax.set_xticks(range(len(x)))
    ax.set_xticklabels(x, rotation="vertical")
    ax.set_ylim(0)
    plt.tight_layout()
    plt.show()
if __name__ == "__main__":
    main()
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Freitag 29. August 2025, 15:36
				von OSWALD
				29.8.20255
Aus gegebenem Anlass musste ich mich mit  PDF  beschäftigen.
- Aus e-Mail   PDF-Anhang  auf PC sichern
- mit Chrome lesen
- das klappte perfekt
Nun aber wollte ich  wissen , wie man  mit Python   -Text auf  PDF transponieren - kann.
Nach Versuchen mit  den  zahlrechen Modulen/Paketen, die ich nicht
bewältigen konnte,  habe es dann doch 
mit   ReportLab zu einem ersten Programm gebracht.
PDF wird verwendet, weil es eine plattformunabhängige,
originalgetreue Darstellung eines Dokuments gewährleistet,
unabhängig vom verwendeten Gerät oder Betriebssystem.
Es bietet Vorteile wie Datensicherheit, Kompatibilität
mit verschiedenen Inhaltstypen (Text, Bilder, Audio, 3D-Modelle)
und Benutzerfreundlichkeit beim Anzeigen, aber davon  bin ich noch Lichtjahre entfernt.
Erklärungen folgen noc
OSWALD 
Code: Alles auswählen
  
#  Transformation von     Text   zu  PDF 
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch ,cm
def create_simple_pdf(filename="Taucher_example.pdf"):
    doc = SimpleDocTemplate(filename)
   
    
    styles = getSampleStyleSheet()
    story = []
    # Ein einfacher Absatz
    #text = "Dies ist ein einfacher Text in einer PDF-Datei, die mit ReportLab erstellt wurde."
    text =  '''Wer wagt es, Rittersmann oder Knapp,
    'Zu tauchen in diesen Schlund?
    Einen goldnen Becher werf ich hinab,
    Verschlungen schon hat ihn der schwarze Mund.
    Wer mir den Becher kann wieder zeigen,
    Er mag ihn behalten, er ist sein eigen 
    Der König spricht es, und wirft von der Höh
    Der Klippe, die schroff und steil
    Hinaushängt in die unendliche See,
    Den Becher in der Charybde Geheul.
    „Wer ist der Beherzte, ich frage wieder,
     Zu tauchen in diese Tiefe nieder? '''
                                           
   
    paragraph = Paragraph(text, styles['Normal'])
    story.append(paragraph)
    #print(story)
    # Ein weiterer Absatz mit mehr Text
    text2 = "ReportLab ist eine leistungsstarke Bibliothek,\
    die das Erstellen von PDF-Dokumenten in Python ermöglicht."
    paragraph2 = Paragraph(text2, styles['Normal'])
    story.append(paragraph2)
    #print(story)
    # Den Inhalt des Dokuments generieren
    doc.build(story)
    print(f"'{filename}' wurde erfolgreich erstellt.")
# Die Funktion aufrufen, um die PDF zu erstellen
create_simple_pdf()
                                
 
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Freitag 29. August 2025, 15:52
				von OSWALD
				29.8.2025
Darstellung der PDF - Datei
Ordner erstellen:
nach Ablauf des Code 
zurück zum Ordner 
auf Python-file  alle Dateien einstellen
aus angezeigten PDF-Dateien 
z.B.    ' öffnen   mit Chrome     auswählen
PDF Datei erscheint (allerdings noch mit anonym)
hier noch ein Beispiel mit größerem Text
Ich hoffe, dass bis jetzt alles richtig ist
OSWALD
Code: Alles auswählen
#  Transformation von     Text   zu  PDF 
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch ,cm
def create_simple_pdf(filename="Schatzgräber_example.pdf"):
    doc = SimpleDocTemplate(filename)
    #print(doc)
    
    styles = getSampleStyleSheet()
    story = []
    # Ein einfacher Absatz
    text = '''Der Schatzgräber
Arm am Beutel, krank am Herzen,
Schleppt ich meine langen Tage.
Armuth ist die größte Plage,
Reichthum ist das höchste Gut!
Und zu enden meine Schmerzen,
Ging ich einen Schatz zu graben.
Meine Seele sollst du haben!
Schrieb ich hin mit eignem Blut.
Und so zog ich Kreis um Kreise,
Stellte wunderbare Flammen,
Kraut und Knochenwerk zusammen:
Die Beschwörung war vollbracht.
Und auf die gelernte Weise
Grub ich nach dem alten Schatze
Auf dem angezeigten Platze;
Schwarz und stürmisch war die Nacht.
Und ich sah ein Licht von weiten,
Und es kam gleich einem Sterne,
Hinten aus der fernsten Ferne.
Eben als es zwölfe schlug.
Und da galt kein Vorbereiten:
Heller ward's mit einemmale
Von dem Glanz der vollen Schale,
Die ein schöner Knabe trug.
Holde Augen sah ich blinken
Unter dichtem Blumenkranze;
In des Trankes Himmelsglanze
Trat er in den Kreis herein.
Und er hieß mich freundlich trinken,
Und ich dacht' es kann der Knabe
Mit der schönen, lichten Gabe
Wahrlich nicht der Böse sein.
Trinke Muth des reinen Lebens!
Dann verstehst du die Belehrung,
Kommst, mit ängstlicher Beschwörung,
Nicht zurück an diesen Ort.
Grabe hier nicht mehr vergebens!
Tages Arbeit, Abends Gäste!
Saure Wochen, frohe Feste!
Sei dein künftig Zauberwort. '''
 
   
    paragraph = Paragraph(text, styles['Normal'])
    story.append(paragraph)
    #print(story)
    # Ein weiterer Absatz mit mehr Text
    text2 = "ReportLab ist eine leistungsstarke Bibliothek,\
    die das Erstellen von PDF-Dokumenten in Python ermöglicht."
    paragraph2 = Paragraph(text2, styles['Normal'])
    story.append(paragraph2)
    #print(story)
    # Den Inhalt des Dokuments generieren
    doc.build(story)
    print(f"'{filename}' wurde erfolgreich erstellt.")
# Die Funktion aufrufen, um die PDF zu erstellen
create_simple_pdf()
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Freitag 29. August 2025, 16:30
				von OSWALD
				2.8.2025
Für Fachleute noch ein Blick in das Innenleben
des letzten Programms
Ich habe nicht die geringste Ahnung
Gute Zeit OSWALD
Code: Alles auswählen
PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/Contents 7 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 6 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>> 
  /Type /Page
>>
endobj
4 0 obj
<<
/PageMode /UseNone /Pages 6 0 R /Type /Catalog
>>
endobj
5 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20250829152319+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20250829152319+02'00') /Producer (ReportLab PDF Library - www.reportlab.com) 
  /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
6 0 obj
<<
/Count 1 /Kids [ 3 0 R ] /Type /Pages
>>
endobj
7 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 306
>>
stream
GasJK:K)m"&B4*cMKc.^;M&$7[6o<+TfP2[8RVu=#b!=Dq=Y#k3]bPG43;#WZYt=h+S$\Q]BFd)`,[4J@`T3N&gi]eCh<)UM"AqL6[C9"/6cb9_De3g@B72iMD$tCd*5J9,ScA,Md2HuFpuf24==.YA0L2s0iraGaEQ7H@a\=+25/KXH[=s/n'r"\*E1]J?3a\4GQIUGGr[)*q=odaVuL4`jA4(iI:lYK9E$r=auNM2+`-eUeNMO6ba>5IfZnGHnC!fZ8)F^q)>5BFn*nVFDa'R*A@mVdeZ*A,;=e]V#X/5()fZG~>endstream
endobj
xref
0 8
0000000000 65535 f 
0000000073 00000 n 
0000000104 00000 n 
0000000211 00000 n 
0000000414 00000 n 
0000000482 00000 n 
0000000765 00000 n 
0000000824 00000 n 
trailer
<<
/ID 
[<59b0fed9a9c45d3646493e0aeb7d8abb><59b0fed9a9c45d3646493e0aeb7d8abb>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 5 0 R
/Root 4 0 R
/Size 8
>>
startxref
1220
%%EOF
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Samstag 30. August 2025, 09:36
				von OSWALD
				30.8.2025
Hier ein Python  Beispiel mit PGF-Grafik. Auch einfach.
Inzwischen habe ich gelesen, dass eine Transformation
von PDF  zu Texten etc.  in Python nicht  möglich ist.
Dafür benötigt man  andere Methoden.
Ich werde  nun versuchen weitere  PDF-Dateien ,etwa   
mit besonderen Gliederungen der Texte  herzustellen-
OSWALD
Code: Alles auswählen
import matplotlib.pyplot as plt
import numpy as np
# Daten erstellen
x = np.linspace(0, 10, 100)
y = np.sin(x)
# Plot erstellen
plt.plot(x, y)
plt.title("Beispiel-Sinus-Diagramm")
plt.xlabel("X-Achse")
plt.ylabel("Y-Achse")
# Diagramm als PDF speichern
plt.savefig("mein_diagramm.pdf")
plt.show()
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Samstag 30. August 2025, 14:54
				von OSWALD
				30.8.2025
Nun meines Bild als PDF.
schon wesentlich schwieriger ,weil
stets der richtige Pfad gefunden werden muss
und die Zeilen des Code werden immer länger.
Code: Alles auswählen
rom PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
def bilder_zu_pdf(bildpfade, ausgabe_pdf):
    """
    Integriert eine Liste von Bildern in eine PDF-Datei.
    Args:
        bildpfade (list): Eine Liste von Pfaden zu den Bilddateien.
        ausgabe_pdf (str): Der Name der Ausgabedatei (z.B. 'meine_bilder.pdf').
    """
    c = canvas.Canvas(ausgabe_pdf, pagesize=letter)
    for bildpfad in bildpfade:
        try:
            img = Image.open(bildpfad)
            # Größe des Bildes an die Seitengröße anpassen (optional)
            # Sie können hier auch andere Abmessungen festlegen
            c.setPageSize((img.width, img.height))
            c.drawImage(bildpfad, 0, 0, width=img.width, height=img.height)
            c.showPage() # Neue Seite für das nächste Bild
        except FileNotFoundError:
            print(f"Fehler: Bilddatei '{bildpfad}' nicht gefunden.")
        except Exception as e:
            print(f"Fehler beim Verarbeiten von '{bildpfad}': {e}")
    c.save() # PDF speichern
# Beispiel: Ihre Bilder und die Ausgabedatei
meine_bilder = ["C:/Users/Oswald Ruckriegel/Pictures/Screenshot.png          "]
# Ersetzen Sie diese durch Ihre tatsächlichen Dateipfade
pdf_dateiname = "mein erstes Bild.pdf"
# Funktion aufrufen, um die PDF zu erstellen
bilder_zu_pdf(meine_bilder, pdf_dateiname)
print(f"PDF '{pdf_dateiname}' wurde erfolgreich erstellt.")
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Sonntag 31. August 2025, 13:55
				von OSWALD
				31.8.2025
Ich habe inzwischen verstanden, dass ich mich hier 
immer nur mit Python beschäftige und nur indirekt
mit  PDF , quasi als  Ergebnis. 
Die ersten Programme waren praktisch
ohne jegliche  Attribute, wie etwa  "der Titel'  ,also anonym.
Bei dem folgenden Code wird eine Tabelle dargestellt.
Und schon sind zahlreiche neue Bibliotheken notwendig,
die wiederum    zahllose Attribute etc liefern.
Alles weitere sind kommerzielle  Projekte, .zT  open source.
Ich kann mich nur mit Python beschäftigen.
jedenfalls weiß ich jetzt, was PDF bedeutet und wie man 
PDF als "Universal.Datei "  einsetzen kann.  
OSWALD
Code: Alles auswählen
import itertools
from random import randint
from statistics import mean
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
def grouper(iterable, n):
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args)
def export_to_pdf(data):
    c = canvas.Canvas("grid-students.pdf", pagesize=A4)
     
    w, h = A4
    max_rows_per_page = 45
    # Margin.
    x_offset = 50
    y_offset = 50
    # Space between rows.
    padding = 15
    xlist = [x + x_offset for x in [0, 200, 250, 300, 350, 400, 480]]
    ylist = [h - y_offset - i*padding for i in range(max_rows_per_page + 1)]
    for rows in grouper(data, max_rows_per_page):
        rows = tuple(filter(bool, rows))
        c.grid(xlist, ylist[:len(rows) + 1])
        for y, row in zip(ylist[:-1], rows):
            for x, cell in zip(xlist, row):
                c.drawString(x + 2, y - padding + 3, str(cell))
        c.showPage()
    c.save()
data = [("NAME", "GR. 1", "GR. 2", "GR. 3", "AVG", "STATUS")]
for i in range(1, 101):
    exams = [randint(0, 10) for _ in range(3)]
    avg = round(mean(exams), 2)
    state = "Approved" if avg >= 4 else "Disapproved"
    data.append((f"Student {i}", *exams, avg, state))
export_to_pdf(data)
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Sonntag 31. August 2025, 14:19
				von OSWALD
				31.8.2025
Immer häufiger tritt im Zusammenhang    mit PDF  der Begriff  "Canvas" auf, mit dem man sich 
intensiv beschäftigen sollte.
Code: Alles auswählen
[
import tkinter as tk
root = tk.Tk()
root.geometry('800x600')
root.title('Was man hier sieht  ist  ein Canvas Demo')
canvas = tk.Canvas(root, width=600, height=400, bg='orange')
canvas.pack(anchor=tk.CENTER, expand=True)
root.mainloop()
/code]
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Sonntag 31. August 2025, 15:55
				von __blackjack__
				@OSWALD: `grouper()` ist hier ungünstig weil das die letzte Gruppe mit Werten auffüllt, die dann wieder entfernt werden müssen.  `more_itertools.chunked()` macht das nicht.  Das liefert in der letzten Gruppe einfach den Rest, ohne die aufzufüllen.
Mit `Canvas` von Tk muss man sich überhaupt nicht beschäftigen wenn es um PDF geht.
			 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Sonntag 31. August 2025, 16:30
				von snafu
				Ab Python 3.12 kann man dafür auch 
itertools.batched benutzen.
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Montag 1. September 2025, 10:22
				von OSWALD
				1.9.2025
Zum Abschluss   des Kapitels  PFD  noch
3 kleine Graphik-Programme. 
Man sieht: Python kann alles und  hat die Zukunft für sich.
OSWALD
Code: Alles auswählen
#Einfache Liniengrafik
from reportlab.graphics.shapes import Drawing, Line
from reportlab.graphics import renderPDF
#  Einfache Liniengrafik
drawing = Drawing(400, 200)
line = Line(50, 50, 350, 150)  # Linie von Punkt (50, 50) nach (350, 150)
drawing.add(line)
# PDF speichern
with open("line_chart.pdf", "wb") as pdf_file:
    renderPDF.drawToFile(drawing, pdf_file)
#############################################################
#            2. Balkendiagramm
 
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.graphics.shapes import Drawing
from reportlab.graphics import renderPDF
# Daten für das Diagramm
data = [[10, 20, 30, 40], [15, 25, 35, 45]]
# Diagramm erstellen
drawing = Drawing(400, 200)
bar_chart = VerticalBarChart()
bar_chart.x = 50
bar_chart.y = 50
bar_chart.height = 125
bar_chart.width = 300
bar_chart.data = data
bar_chart.categoryAxis.categoryNames = ['Q1', 'Q2', 'Q3', 'Q4']
drawing.add(bar_chart)
# PDF speichern
with open("bar_chart.pdf", "wb") as pdf_file:
    renderPDF.drawToFile(drawing, pdf_file)
    print(pdf_file)
##########################################################
#3. Kreisdiagramm (Pie Chart)
 
from reportlab.graphics.charts.piecharts import Pie
from reportlab.graphics.shapes import Drawing
from reportlab.graphics import renderPDF
# Daten für das Kreisdiagramm
data = [30, 20, 50]
# Diagramm erstellen
drawing = Drawing(400, 200)
pie_chart = Pie()
pie_chart.x = 150
pie_chart.y = 50
pie_chart.data = data
pie_chart.labels = ['A', 'B', 'C']
drawing.add(pie_chart)
# PDF speichern
with open("pie_chart.pdf", "wb") as pdf_file:
    renderPDF.drawToFile(drawing, pdf_file)
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Freitag 5. September 2025, 15:14
				von OSWALD
				5.9.2025
blackjack hat darauf hingewiesen, dass Canvas mit der Transformation  
von Text etc zu PDF nichts zu tun hat.
Das ist   absolut korrekt. Trotzdem habe ich mich
mit Canvas näher befasst.
Hier stelle ich ein Programm vor, das zunächst eine neue 
Oberfläche erzeugt, die einige   Grafik-Objekte  zeigt. Das Ganze
wird dann  nach PDF transferiert.
Auf dieser 'Schiefertafel' kann man dann  auch fröhlich malen.
Einfach probieren : Pinsel, Farben etc alles vorhanden , 
zum Schluss     kann alles wieder gelöscht werden.
Fehler ?
OSWALD
Code: Alles auswählen
from reportlab.pdfgen import canvas
c = canvas.Canvas("hello-world.pdf")
c.save()
c.drawString(50, 50, "Hello world!")
 
from reportlab.lib.pagesizes import A4, letter
letter
(612.0, 792.0)
A4
(595.275590551181, 841.8897637795275)
from reportlab.lib.pagesizes import letter
c = canvas.Canvas("hello-world.pdf", pagesize=letter)
 
from reportlab.lib.pagesizes import A4
c = canvas.Canvas("hello-world.pdf", pagesize=A4)
 
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
w, h = A4
c = canvas.Canvas("hello-world.pdf", pagesize=A4)
c.drawString(50, h - 50, "Hello, world!")
c.showPage()
c.save()
 
#nts angibt: x1, y1, x2, y2.
# Draw a horizontal line.
x = 50
y = h - 50
c.line(x, y, x + 200, y)
 
# Rectangle.
c.rect(50, h - 300, 300, 200)
 
# Rectangle with curved ends.
c.roundRect(50, h - 300, 300, 200, 10)
 
# Circle: position (x, y) of the center and the radius.
c.circle(100, h - 100, 50)
#Schließlich sind die Argumente für Ellipsen ähnlich wie für Linien.
c.ellipse(50, h - 50, x + 150, y - 50)
#Wenn wir all dies zusammenfügen, können wir ein PDF-Dokument wie das folgende erstellen.
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
w, h = A4
c = canvas.Canvas("shapes.pdf", pagesize=A4)
c.drawString(30, h - 50, "Line")
x = 120
y = h - 45
c.line(x, y, x + 100, y)
c.drawString(30, h - 100, "Rectangle")
c.rect(x, h - 120, 100, 50)
c.drawString(30, h - 170, "Circle")
c.circle(170, h - 165, 20)
c.drawString(30, h - 240, "Ellipse")
c.ellipse(x, y - 170, x + 100, y - 220)
c.showPage()
c.save()
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Mittwoch 10. September 2025, 09:53
				von OSWALD
				10.9.2025
Zufällig entdeckt , wie man
Barcodes mit Python in PDF-Dateien integrieren kann.
Nicht ganz einfach auf >Anhieb zu verstehen, mit dem bisher Gelernten baer möglich.
Also hoffentlich ohne Fehler.
Gute Zeit OSWALD
Code: Alles auswählen
from reportlab.graphics.barcode import code39, code128, code93
from reportlab.graphics.barcode import eanbc, qr, usps
from reportlab.graphics.shapes import Drawing 
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.graphics import renderPDF
 
#----------------------------------------------------------------------
def createBarCodes():
    """
    Create barcode examples and embed in a PDF
    """
    c = canvas.Canvas("barcodes.pdf", pagesize=letter)
 
    barcode_value = "1234567890"
 
    barcode39 = code39.Extended39(barcode_value)
    barcode39Std = code39.Standard39(barcode_value, barHeight=20, stop=1)
 
    # code93 also has an Extended and MultiWidth version
    barcode93 = code93.Standard93(barcode_value)
 
    barcode128 = code128.Code128(barcode_value)
    # the multiwidth barcode appears to be broken 
    #barcode128Multi = code128.MultiWidthBarcode(barcode_value)
 
    barcode_usps = usps.POSTNET("50158-9999")
 
    codes = [barcode39, barcode39Std, barcode93, barcode128, barcode_usps]
 
    x = 1 * mm
    y = 285 * mm                 #285
    x1 = 6.4 * mm
 
    for code in codes:
        code.drawOn(c, x, y)
        y = y - 15 * mm
 
    # draw the eanbc8 code
    barcode_eanbc8 = eanbc.Ean8BarcodeWidget(barcode_value)
    bounds = barcode_eanbc8.getBounds()
    width = bounds[2] - bounds[0]
    height = bounds[3] - bounds[1]
    d = Drawing(50, 10)
    d.add(barcode_eanbc8)
    renderPDF.draw(d, c, 15, 555)
 
    # draw the eanbc13 code
    barcode_eanbc13 = eanbc.Ean13BarcodeWidget(barcode_value)
    bounds = barcode_eanbc13.getBounds()
    width = bounds[2] - bounds[0]
    height = bounds[3] - bounds[1]
    d = Drawing(50, 10)
    d.add(barcode_eanbc13)
    renderPDF.draw(d, c, 15, 465)
 
    # draw a QR code
    qr_code = qr.QrCodeWidget('www.mousevspython.com')
    bounds = qr_code.getBounds()
    width = bounds[2] - bounds[0]
    height = bounds[3] - bounds[1]
    d = Drawing(45, 45, transform=[45./width,0,0,45./height,0,0])
    d.add(qr_code)
    renderPDF.draw(d, c, 15, 405)
 
    c.save()
 
if __name__ == "__main__":
    createBarCodes()
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Mittwoch 10. September 2025, 12:30
				von __blackjack__
				`x1` wird nirgends verwendet und es gibt da einige Wiederholungen um Quelltext die man durch Funktion und/oder Schleife beseitigen könnte.
Code: Alles auswählen
#!/usr/bin/env python3
from reportlab.graphics import renderPDF
from reportlab.graphics.barcode import code39, code93, code128, eanbc, qr, usps
from reportlab.graphics.shapes import Drawing
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import mm
from reportlab.pdfgen.canvas import Canvas
def get_widget_size(widget):
    x_1, y_1, x_2, y_2 = widget.getBounds()
    return x_2 - x_1, y_2 - y_1
def create_bar_codes():
    """
    Create barcode examples and embed in a PDF
    """
    canvas = Canvas("barcodes.pdf", pagesize=letter)
    barcode_value = "1234567890"
    x, y = 1 * mm, 285 * mm
    for code in [
        code39.Extended39(barcode_value),
        code39.Standard39(barcode_value, barHeight=20, stop=1),
        code93.Standard93(barcode_value),
        code128.Code128(barcode_value),
        usps.POSTNET("50158-9999"),
    ]:
        code.drawOn(canvas, x, y)
        y -= 15 * mm
    x = 15
    for code, (drawing_width, drawing_height), y, needs_scaling in [
        (eanbc.Ean8BarcodeWidget(barcode_value), (50, 10), 555, False),
        (eanbc.Ean13BarcodeWidget(barcode_value), (50, 10), 465, False),
        (qr.QrCodeWidget("www.mousevspython.com"), (45, 45), 405, True),
    ]:
        width, height = get_widget_size(code)
        drawing = Drawing(
            drawing_width,
            drawing_height,
            code,
            **(
                {
                    "transform": (
                        [
                            drawing_width / width,
                            0,
                            0,
                            drawing_height / height,
                            0,
                            0,
                        ]
                    )
                }
                if needs_scaling
                else {}
            ),
        )
        renderPDF.draw(drawing, canvas, x, y)
    canvas.save()
if __name__ == "__main__":
    create_bar_codes()
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Samstag 13. September 2025, 16:03
				von OSWALD
				13.9.2035
Seit Jahren verwende ich  Python 3.12 , mit großer Zufriedenheit.
Zufällig wollte ich unter torch ein Programm  mit plotly  starten.
Ich erhielt allerdings zwei squeeze Dateien mit  tausenden von Zeilen.
In meinem Archiv   alle  ploty-Dateien.py  gleiches Ergebnis.
Uninstall/install Versuche  mit  pip auf Powershell führen immer zu Warnung.
In  der  Lib  glaube ich  nun  unter  ' site-packages'   feststellen zu können ,   'plotly' 
wird #von Python 3.12. nicht mehr unterstützt.
Im internet finde ich keinen Hinweis
Der Wechsel auf Python 3.13.7 endet im Chaos , allerdings konnte ich feststellen, dass
hier 'plotly' wieder finktioniert.
Fazit zurück zu nPython 3,12 Funktionieet wieder ohne  plotly. 
Liege ich richtig oder oder falsch ?  jedenfalls wieder ein wenig gelernt.
Geht auch ohne plotly
Gute Zeit Oswald
			 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Samstag 13. September 2025, 17:21
				von Dennis89
				Hallo,
was hast du denn für Warnungen bekommen? Bitte kopieren und hier im Code-Block einfügen.
Hier auf Pypi steht das Python >= 3.8 benötigt wird. Somit sollte 3.12 funktionieren.
Grüße
Dennis
 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Sonntag 14. September 2025, 08:12
				von OSWALD
				14.9.25
@DENNIS  danke für  Dein  Interesse
1.zunächst  uninstall von plotly
2.laden von plotly :pip3 install plotly
3.Inhalt der shell
4Ergebnis:
Warning:Ignoring  invalid  distribution  ~lotly C: Pfad\\ Python 312\Lib\site-packages.
dann    Successfully installed  plpty-6,3.0
soweit  aus shell
In Lib taucht    unter site-packages wieder  wieder die Tilde auf
und zwar  wieder mit  3 Dateien und der besagten Tilde, etwa   ~lotly usw.
Ich habe jetzt gelesen, dass die Tilde in Plotly   überhaupt ' nichts zu suchen hat'.
Hier meine laienhafte Beschreibung  des Problems. 
Gute Zeit
OSWALD
			 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Sonntag 14. September 2025, 09:00
				von OSWALD
				Meine Frage an die  Experten  lautet kurz:
Wie kommt die Tilde ins Geflde.
OSWALD
			 
			
					
				Re: kleine Mathe-Spielereien
				Verfasst: Sonntag 14. September 2025, 14:01
				von OSWALD
				14.9.2025
Ich bin immer mehr überzeugt, dass der Fehler in plotly  durch die Tilde  verursacht wurde.
Zunächst aber, was ist die Tilde und wie funktioniert sie.
Dann meine Theorie zur   möglichen  Entstehung  desFehlers.
Was ist die Tilde ?
In Python ist die Tilde (~) der bitweise Negationsoperator, der alle Bits einer Zahl umkehrt
(0 wird zu 1 und 1 zu 0) und das Ergebnis als ganzzahligen Wert zurückgibt.
Die Operation kann auch mithilfe der Formel ~i = -i - 1 für eine ganze Zahl i berechnet werden. 
In Python bezieht sich "Tilde-Modul" nicht auf ein Modul,
sondern auf den Tilde-Operator ()
Code: Alles auswählen
 
###########################
##~in Python wird der Wert invertiert.
#Die tatsächliche Methode hängt von der Implementierung der __invert__Methode des Arguments ab.
#Beginnen wir mit den Zahlen.
print(~-10 )                      # 9
print(~1)                              # -2
 
print(~0 )                        # -1
# Der Fall für True und  False
 
print(~True )                  # -2
print(~False)                     # -1
#  =gleich wie oben            
~1 # -2
~0 # -1