Formular speichern mitsamt Eingabewerten

Fragen zu Tkinter.
Antworten
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Hallo liebe Python-Gemeinde,
als Anfänger habe ich es nun geschafft, ein Formular mit Eingabe- und Berechnungsfeldern zu erstellen.
Die Buttons funktionieren (berechnen).
Aber jetzt hänge ich beim Speichern des mit Werten befüllten gesamten Formulars für die Ablage u. Doku.

Nun zu meinen Fragen:
Wie muss die Funktion "save_it()" aussehen, damit das gesamte Formular erfasst wird (ähnlich einem Screenshot)?
Ginge das als *.jpg, *.png oder *.pdf?

VIELEN DANK SCHON MAL!

Hier der Abschnitt des Codes mit "Speichern als"-Button (b5), bei dem ich leider nicht weiter weiß:

from tkinter.filedialog import asksaveasfilename

# Speichern als:
def save_it():
filename = asksaveasfilename(
filetypes=[('jpg-files', '.jpg')], initialfile='zzFeder.jpg')

# Formular erstellen:
def makeform(root, fields):
entries = {}
for field in fields:
row = Frame(root)
lab = Label(row, width=48, text=field+": ", anchor='w')
ent = Entry(row, width=32)
ent.insert(0,"0")
row.pack(side=TOP, fill=X, padx=5, pady=2)
lab.pack(side=LEFT)
ent.pack(side=RIGHT, expand=YES, fill=X)
entries[field] = ent
return entries

# Aufruf der Funktionen mit Buttons:
if __name__ == '__main__':
root = Tk()
ents = makeform(root, fields)
root.bind('<Return>', (lambda event, e=ents: fetch(e)))

b1 = Button(root, text='Federrate',
command=(lambda e=ents: springrate(e)))
b1.pack(side=LEFT, padx=5, pady=5)

b2 = Button(root, text='MaxFederhub+Block',
command=(lambda e=ents: maxspringstrokezw(e)))
b2.pack(side=LEFT, padx=5, pady=5)

b3 = Button(root, text='MaxVorspannung',
command=(lambda e=ents: maxpreload(e)))
b3.pack(side=LEFT, padx=5, pady=5)

b4 = Button(root, text='MaxAnfangs+EndkraftFeder',
command=(lambda e=ents: anfangsendkraft(e)))
b4.pack(side=LEFT, padx=5, pady=5)

b5 = Button(root, text='Speichern als',
command=(save_it))
b5.pack(side=LEFT, padx=5, pady=5)

b99 = Button(root, text='Quit', command=root.quit)
b99.pack(side=LEFT, padx=5, pady=5)

root.mainloop()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir ist doch schon mal gesagt worden, dass du die Code Tags benutzen sollst. Wieso schon wieder diese unlesbare Textwüste?

Und zu deinem Problem: du liest einfach die Werte aus & schriebst sie in eine Textdatei. So wie alle anderen Programme. Word oder excel speichern auch keine Screenshots. Sondern die eigentlichen Daten.
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Hallo deets,

ja, Du hast ja recht. Ist schon eine Weile her...
Ich hab's rauskopiert aus PyCharm und wenn's hier eingefügt wird, ist die Formatierung weg.

In den FAQs unter Textformatierung steht leider nichts, wie das sein soll und wie das korrekt funktioniert.
Der Editor übernimmt demnach die Formatierung nicht. Da hab' ich's eben so gelassen.

Aber vielen Dank für Deine Hilfe.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Firlefanzus,

um deinen Code leserlich darzustellen, musst du

[code]
vor den Anfang des Quellcodes und
[/code]

hinter das Ende des Quellcode schreiben. Dann wird es richtig dargestellt.
Noch einfacher geht es, wenn du auf den Button "Vollständiger Editor & Vorschau" und dann auf den Button mit </> klickst. Dann werden diese Formatierungscodes automatisch eingefügt.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hier der originale Code, mit originalen Einrückungen:

Code: Alles auswählen

from tkinter.filedialog import asksaveasfilename

# Speichern als:
def save_it():
    filename = asksaveasfilename(
        filetypes=[('jpg-files', '.jpg')], initialfile='zzFeder.jpg')

# Formular erstellen:
def makeform(root, fields):
    entries = {}
    for field in fields:
        row = Frame(root)
        lab = Label(row, width=48, text=field+": ", anchor='w')
        ent = Entry(row, width=32)
        ent.insert(0,"0")
        row.pack(side=TOP, fill=X, padx=5, pady=2)
        lab.pack(side=LEFT)
        ent.pack(side=RIGHT, expand=YES, fill=X)
        entries[field] = ent
    return entries

# Aufruf der Funktionen mit Buttons:
if __name__ == '__main__':
    root = Tk()
    ents = makeform(root, fields)
    root.bind('<Return>', (lambda event, e=ents: fetch(e)))

    b1 = Button(root, text='Federrate',
        command=(lambda e=ents: springrate(e)))
    b1.pack(side=LEFT, padx=5, pady=5)

    b2 = Button(root, text='MaxFederhub+Block',
        command=(lambda e=ents: maxspringstrokezw(e)))
    b2.pack(side=LEFT, padx=5, pady=5)

    b3 = Button(root, text='MaxVorspannung',
        command=(lambda e=ents: maxpreload(e)))
    b3.pack(side=LEFT, padx=5, pady=5)

    b4 = Button(root, text='MaxAnfangs+EndkraftFeder',
        command=(lambda e=ents: anfangsendkraft(e)))
    b4.pack(side=LEFT, padx=5, pady=5)

    b5 = Button(root, text='Speichern als',
        command=(save_it))
    b5.pack(side=LEFT, padx=5, pady=5)

    b99 = Button(root, text='Quit', command=root.quit)
    b99.pack(side=LEFT, padx=5, pady=5)

    root.mainloop()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Hallo rogerb und Dennis89,

vielen Dank für die Anleitung - sehr nett!

Sowas gehört in die FAQs, nach ganz oben.

Viele Grüße und ein schönes Wochenende
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Hallo rogerb und Dennis89,

vielleicht habt Ihr ja eine Idee, wie ich das gesamte Formular (alle Feldnamen+Eingabewertetc.) als *.jpg oder *.pdf direkt abspeichern kann?

Hier fehlt mir, wie ich mitteilen kann, dass das kpl. Formular zu speichern ist:

Code: Alles auswählen

# Speichern als:
def save_it():
    filename = asksaveasfilename(
        filetypes=[('jpg-files', '.jpg')], initialfile='zzFeder.jpg')
Bisher muss ich per Screenshot das Formular ausschneiden und abspeichern.

Vielen Dank für Eure Hilfe.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum soll das als Bild gespeichert werden? Sollen die Daten die wieder geladen werden? Oder anderweitig verarbeitet? Du gehst hier vom einem Behelf aus, statt wirklich eine vernünftiges Dateiformat zu erstellen.
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Hallo deets,

die Datenblätter werden ausgedruckt und gehen raus in die Werkstatt für die Mechaniker zum Einstellen der Federvorspannung etc..
Bisher wird ein Screenshot mit dem Snipping Tool gemacht, gespeichert in der File-Ablage, dann ausgedruckt.
Mit dem "Speichern als" Button wäre das eleganter.
Die Werte in eine Datenbank schreiben und wieder auslesen übersteigt meine Fähigkeiten bei Weitem!
Vielleicht gibt es ja jemand, der das für Geld erledigen möchte?
Am Ende brauchen wir eben ein physisches Blatt Papier für die Werkstatt.

Vielen Dank und viele Grüße
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Dazu macht man doch aber keinen Screenshot, sondern benutzt einen Report-Generator, der das ganze als PDF speichert und ausdruckt.
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Hallo Sirius3,

vielen Dank für den Tipp.
Aber ist es nicht so, dass ein Report-Generator die Werte aus einer Datenbank nimmt?
Eine Datenbank habe ich jedoch nicht.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Tut er nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Vielleicht würde auch eine Textdatei schon reichen, die man ausdrucken kann.

Ansonsten sind AFAIK die beiden verbreiteten Möglichkeiten PDFs aus Python heraus zu erzeugen Reportlab oder WeasyPrint. Ersteres ist sehr umfangreich und mächtig, letzteres etwas einfacher und weniger mächtig. Wahrscheinlich würde hier WeasyPrint ausreichen. Das HTML würde ich mit einer Template-Engine wie Jinja2 erstellen, oder zumindest ein Modul wie `markupsafe` verwenden, wenn man sich das per Zeichenkettenoperationen selber zusammenstückeln will.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Vielen Dank für Eure Hilfe!

Klar, eine Text-Datei wäre ausreichend.
Aber was muss ich bitte beim Schalter "Speichern als" noch eintragen, damit er alle Feldnamen + Werte des Formulars als *.txt speichert?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Firlefanzus: Den Code der genau das tut musst Du schreiben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Firlefanzus
User
Beiträge: 12
Registriert: Montag 18. November 2019, 11:22

Mal sehen, ob ich das zustande bringe...
Vielen Dank Euch allen!
Antworten