Labeldruck und was draus folgt

Du hast eine Idee für ein Projekt?
Antworten
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Also, ich hab mir da was vorgenommen...
Mein Plan erst mal grob umrissen:
Gegeben ist:
Ein Rhaspberry-Pi mit Touchscreen,
eine CSV-Datei mit Informationen zu einem bestimmten Ziel, (kommt aus Access)
ein Labeldrucker.
kaum Ahnung. (vor 1 Monat war Python für mich eine legendäre Schauspielertruppe!)
  • Für dieses Ziel soll ein Leitetikett erstellt werden.
  • Das Ganze mit ZLP kombiniert zu einem Labeldrucker geschickt.
  • Die Anzahl der Ausdrucke soll protokolliert werden
  • dazu soll ein Ident-Code draufgedruckt werden
  • Welches der (8 verschiedenen) Label ausgedruckt wird soll per "Knopfdruck" entschieden werden. (Tkinter-Oberfläche hab ich schon :geek: )
    Das knifflige daran soll sein, dass
  • wenn jemand einen USB-Stick mit frischen Daten einsteckt (das Ganze muss offline funktionieren) sollen diese automatisch vom Stick gelesen werden und die Ausdrucke entsprechend aktualisiert.
Die Datei kann ich einlesen, daraus kann ich schon die Beschriftung der Bedienoberfläche ziehen - nur an der Automatik hapert es noch.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir fehlt da ein bisschen die konkrete Frage. Geht es dir um die Benachrichtigung, wann ein Laufwerk eingehangen wird? Die bekommst du zb mit pyudev.
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Hallo __deets__ und danke für deine Antwort.
Die Fragen kommen, verlass dich drauf. :o)
Bin ja noch bei der Idee und die Verwirklichung hakt noch.
Drum gleich eine wahrscheinlich unglaublich doofe Frage:
Ich habe einen Button mit tkinter programmiert. Die Beschriftung kommt aus einer *.csv-Datei. Das klappt.
Aber, der Wert wird mit mit Anführungszeichen angezeigt.
Kann mir jemand erklären, warum? Wenn ich das "statisch" mache und den Text in " " schreibe, kommen die ja auch nicht. Warum dann von der Variablen?
Und, natürlich die unverschämte Frage hinterher: Wie krieg ich die Gänsefüßchen weg?
Danke.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Anführungszeichen hast Du, weil Du sie entweder aus der Datei gelesen hast, die csv-Datei nicht richtig geparst hast oder sie sonst irgendwie explizit eingebaut hast.

Ohne den Code zu kennen, kann man da aber nicht sagen, was welchen der möglichen Fehler Du gemacht hast.
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Code: Alles auswählen

from tkinter import *
import sys
import os


print (os.path.dirname(sys.argv[0]))
strPf = os.path.dirname(sys.argv[0]) + "/TB_Ausgabe_Abfrage8Stueck.txtII"  #das geht auch, soll besser sein

try:

    d=open(strPf)
except:
    print("das war nichts")
    sys.exit

derText = d.read() #datei Auslesen
d.close #Datei zumachen





zListe = derText.split(chr(10))


####Hier teilel ich die csv in zwei "Listen"
li = []
liE_StZ2 =[]
liZielZ3 = []
liEinsatzstelleZ5 = []
liWellZ6 =[]
liwhatever7 = []

for zeile in zListe:
    if zeile:
        zwliste = zeile.split(";")
        li.append(zwliste[1]) #Beschriftung//das ist der Bericht mit den 8 Stück, der hat eine andere Sortierung als die Alle
        liE_StZ2.append(zwliste[1]) #E_St Zeile 2 // Tab Spalte 2 (b)
        liZielZ3.append(zwliste[2])   #Zeile 3, Tab Spalte 3(c)
        liEinsatzstelleZ5.append(zwliste[3])  #Zeile 5 Tab Spalte 4(d)
        liWellZ6.append(zwliste[4]) #Zeile 6 / Tab Spalte 5(e)
        liwhatever7.append(zwliste[5]) #Zeile 7 / Tab Spalte 6(f)

        
for i in range(0,8):
    print(li[i])
    print (liE_StZ2[i])
    print (liZielZ3[i])
    print (liEinsatzstelleZ5[i])
    print (liWellZ6[i])
    print (liwhatever7[i])
root = Tk()
root.wm_title("Auswahl der Label")
root.config(background = "#f2c618")
rightFrame = Frame(root, width=1200, height = 400)
rightFrame.grid(row=0, column=1, padx=0, pady=0)

buttonFrame = Frame(rightFrame)
buttonFrame.grid(row=1, column=0, padx=10, pady=3)



def callback1(a):
    strPaul=liE_StZ2[a]
    print(strPaul)

def callback2():
    strPaul=li[i]
    print(strPaul)


    
B1 = Button(buttonFrame, text=li[0]+ "\n" + liZielZ3[0], bg="#f2c618", width=15, height=10, command=lambda:callback1(0))
B1.grid(row=0, column=0, padx=0, pady=0)
 ##das lambda-Ding brauchts, weil sonst kein Parameter übergeben werden kann.
B2 = Button(buttonFrame, text=li[1]+ "\n" + liZielZ3[1], bg="#f2c618", width=15, height=10, command=lambda:callback1(1))
B2.grid(row=0, column=1, padx=0, pady=0)


B3 = Button(buttonFrame, text=li[2] + "\n" + liZielZ3[2], bg="#f2c618", width=15, height=10, command=lambda:callback1(2))
B3.grid(row=0, column=2, padx=0, pady=0)

B4 = Button(buttonFrame, text=li[3]+ "\n" + liZielZ3[3], bg="#f2c618", width=15, height=10, command=lambda:callback1(3))
B4.grid(row=0, column=3, padx=0, pady=0)

B5 = Button(buttonFrame, text=li[4]+ "\n" + liZielZ3[4], bg="#f2c618", width=15, height=10, command=lambda:callback1(4))
B5.grid(row=1, column=0, padx=0, pady=0)

B6 = Button(buttonFrame, text=li[5]+ "\n" + liZielZ3[5], bg="#f2c618", width=15, height=10, command=lambda:callback1(5))
B6.grid(row=1, column=1, padx=0, pady=0)

B7 = Button(buttonFrame, text=li[6]+ "\n" + liZielZ3[6], bg="#f2c618", width=15, height=10, command=lambda:callback1(6))
B7.grid(row=1, column=2, padx=0, pady=0)

B8 = Button(buttonFrame, text=li[7]+ "\n" + liZielZ3[7], bg="#f2c618", width=15, height=10, command=lambda:callback1(7))
B8.grid(row=1, column=3, padx=0, pady=0)
# Hier kommen die Elemente des rechten Frames rein



root.mainloop()
Das tut ja jetzt noch nicht viel und ist bestimmt ein Riesenpfusch für ein Profiauge, aber ich bin ja noch am experimentieren.

Die CSV sieht so aus:

Code: Alles auswählen

3;6;"Beispiel 1;"Dings 006";"1. Dings";"/";;"Irgendwas";"00248507";"kein";10.1.2020 00:00:00;370;0;"grün";;;
623;4;"Beispiel 2";"Dings 004";"1. Dings";;;"Irgendwas";"01004533";"kein";;0;0;"weiß";;;
624;5;"Beispiel 2";"Dings 005";"1. Dings";;;"Irgendwas";"01004533";"kein";;0;0;"weiß";;;
625;7;"Beispiel 2";"Dings 007";"1. Dings";;;"Irgendwas";"01004533";"kein";;0;0;"weiß";;;
626;8;"Beispiel 2";"Dings 008";"Dings 2(Dies Und das)";"Anderes Dings";;"Irgendwas";"00118651";"kein";10.1.2020 00:00:00;620;0;"gelb";;;
627;413;"Beispiel 2";"Dings 413";"Modul 3. 2. Dings";;;"Irgendwas";"00118651";"kein";7.8.2019 00:00:00;379;0;"weiß";;;
628;1;"Beispiel 2";"217";"1. Dings";;;"Irgendwas";"00000000";"kein";2.12.2019 00:00:00;4;0;"weiß";;;
629;9;"Beispiel 2";"Dings 009";"1. Dings";;;"Irgendwas";"00913720";"kein";22.11.2019 00:00:00;4;0;"weiß";;;
Die Beschriftung der Buttons kommt mit der Zahl, das ist sauber, die zweite Zeile, der Text, kommt mit Anführungszeichen. Die sind klar in der CSV mit drin, und ich hab als Trennzeichen das Semikolon, aber die CSV wechselt ja immer und hat als Textqualifizierer die "" drin. Muss ich die dann in der Variablen dann erst mit einem Replace-Kosntrukt rauswerfen? Oder gibt es da eine Möglichkeit, die Texte gleich ohne " zu lesen?
Danke
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die CSV Datei ist Kraut und Rüben. Die Anführungszeichen und Trennzeichen gehen wild durcheinander. Solange das nicht sauber wird, kann das nichts werden. Dann solltest du die Datei mit dem csv Modul einladen. Und den passenden Dialekt wählen. Die Anführungszeichen sind nur notwendig, wenn Semikola im Text sein sollen.

Und sowohl bei sys.exit() als auch close() fehlen die Klammern, es passiert also nichts. Statt open/close bietet sich eh das with Statement an. Wenn man Variablen durchnummeriert, will man eigentlich eine Liste. Dann schrumpft der Code auch auf einen Bruchteil ein.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

*-Importe sind böse, tkinter wird üblicherweise per `import tkinter as tk` importiert.
Statt Pfade mit + zusammenzustückeln benutzt man pathlib.Path
Nackte excepts nicht benutzen, weil damit auch viele Programmierfehler verdeckt werden und es unmöglich wird Fehler zu finden.
Funktionen muß man auch Aufrufen ().
csv-Dateien liest man mit dem csv-Modul, dann werden Anführungszeichen auch automatisch richtig interpretiert. Variablenamen sollten aussagekräftig sein und keine Abkürzungen enthalten. Was soll denn liE_stZ3 heißen?
Nicht Spalten in einzelnen Listen speichern, Zusammengehörige Daten sollten auch zusammen bleiben.
Statt Code zu kopieren, benutze Schleifen.
Code gehört in Funktionen.

Code: Alles auswählen

import tkinter as tk
from pathlib import Path
from functools import partial

ABFRAGE_FILENAME = Path(__file__).with_name("TB_Ausgabe_Abfrage8Stueck.txtII")

def click(e_st_z2):
    print(e_st_z2)

def main():
    with ABFRAGE_FILENAME.open() as lines:
        data = list(csv.reader(lines, delimiter=";"))
        data.pop()

    root = tk.Tk()
    root.wm_title("Auswahl der Label")
    root.config(background = "#f2c618")
    right_frame = tk.Frame(root, width=1200, height = 400)
    right_frame.grid(row=0, column=1, padx=0, pady=0)
    button_frame = tk.Frame(right_frame)
    button_frame.grid(row=1, column=0, padx=10, pady=3)
    for column, entry in enumerate(data):
        button = tk.Button(button_frame, text="{}\n{}".format(entry[1],entry[2]), bg="#f2c618", width=15, height=10, command=partial(click, entry[1]))
        button.grid(row=0, column=column, padx=0, pady=0)

    root.mainloop()

if __name__ == '__main__':
    main()
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Als erstes: Danke für die Tipps.
ich hab das Zeug zusammengebaut aus den Beispielen meiner 2 Bücher und dem was ich gegooglet hatte.
Offenbar taugen die Bücher nix. (btw verwirrt mich das immer wenn zwischen Python 2 und 3 hin und her gehüpft wird)
Die CSV Datei ist Kraut und Rüben. Die Anführungszeichen und Trennzeichen gehen wild durcheinander. Solange das nicht sauber wird, kann das nichts werden.
Das Ding kommt von MS Access so rüber, damit muss ich leben. Das mit dem CSV-Modul schaut gut aus. Das hab ich schon vermutet, dass es das gibt.
Variablenamen sollten aussagekräftig sein und keine Abkürzungen enthalten. Was soll denn liE_stZ3 heißen?
Das ist die Überschrift in der Datenbanktabelle. :shock:
Und weil ich die Einträge dann ja noch mal für das Zusammenbauen des ZPL-Codes brauche, war mir das als aussagekräftig erschienen. Da muss ich aber tatsächlich noch mal drüber, hab da gestern dann recht flott den Überblick verloren.
Danke für den Code, der funktioniert auch soweit ich mir das wünsche - außer dass ich die Schaltflächen in 2 Reihen brauche, aber das muss ich selbst hinkriegen.
Voraussetzung dafür ist erst mal, dass ich den Code selbst verstehe. Das braucht jetzt seine Zeit.
Mit dem file-name noch eine Frage, die du mir vielleicht besser als Tante Google erklären kannst.
ich brauch die Datei mal von einem USB-Stick geladen. Immer wenn man den einsteckt, soll die Datei dann in eine bestimmtes Verzeichnis geladen werden und dann von dort eingelesen.
So wie der Code jetzt da steht, lädt der den vom Projektverzeichnis.
Hast du für mich eine Idee, wonach ich da suchen muss?
Danke erst mal für das bisher noch mal.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann UDEV verwenden, um zu lernen, wann ein Massen-Speicher-Geraet angeschlossen ist. Oder man kann lsblk benutzen, und das Ergebnis parsen. Oder man schaut in's /sys-Verzeichnis.
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Danke, das mit UDEV hab ich schon mal getestet. UDEV versteht mich nicht so recht...
da probiere ich auch was mit dem USB-Modul von Python aus, aber soweit bin ich noch nicht.
aktuell zudem Code von Sirius3 noch eine Frage.

Code: Alles auswählen

    for column, entry in enumerate(data):
Das schleift ja die Einträge vom ersten zum letzen durch, da soll laut Dokumentation auch ein STartwert vorgegeben werden können. Hab ich das falsch übersetzt?
ich brauch ja für 2 Reihen von den Buttons auch zwei Teile der Beschriftung. Oben und unten.
Danke
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt nur den Index in column und row umrechnen. Dazu hilft divmod.

Code: Alles auswählen

for index, entry in enumerate(data):
    row, column = divmod(index, 4)
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

OK, so ganz hab ich das leider nicht verstanden.
Wenn ich mir das so augeben lasse:

Code: Alles auswählen

        for index, entry in enumerate(data):
            row, column = divmod(index, 4)
            print(entry[1],entry[2])
krieg ich exakt das gleiche wie ohne den divmod.

Sorry, aber das muss ich verstehen. Denn ich brauch ja die Einträge in der Reihenfolge der Spalten wieder aber nicht direkt hintereinander sondern in der Reihenfolge wie ich meine Listen oben aufgebaut hab. Das muss ich wie schon gesagt, in einen anderen Code für den Drucker mit reinbasteln. (die nächste Herausforderung :))
index gibt mir jetzt den Wert wieder, den Spaltenindex / 4, und einen evtl. Rest. Das heißt, ich müssten jetzt die geraden und ungeraden Zeilen bekommen?
Aber wie krieg ich das zu meinen Buttons?
Da es immer nur genau 8 Zeilen sind die hier ausgewertet werden, tu ich mich da nicht leichter mit der nicht ganz so eleganten for-Schleife die mal von 0-3 geht und mal von 4-8?
Danke für die Geduld.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was glaubst Du ist der Sinn von den Variablen `row` und `column` und wie könnten die mit den Parametern für `grid` zusammenhängen?
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Typischer Fall von Betriebsblindheit.
Danke.

Code: Alles auswählen

for column, entry in enumerate(data):
        for index, entry in enumerate(data):
            row, column = divmod(index, 4)
            button = tk.Button(button_frame, text="{}\n{}".format(entry[1],entry[2]), bg="#f2c618", width=15, height=10, command=partial(click, entry[3]))
            button.grid(row=row, column=column, padx=0, pady=0)
An dieser Stelle sollte ich das einbauen, dann funktioniert das auch.
Dass das einmal Variablen sind un einmal Parameter für den grid, das hätte ich mein Lebtag nie gesehen. :oops: :cry:
Und jetzt hab ich auch verstanden was divmod tut. glaub ich :roll:
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt ist nur noch die äußere Schleife zu viel.
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Jetzt ist nur noch die äußere Schleife zu viel.
In der Tat.
Danke
Muss noch viel lernen...
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Hab noch weiter gemacht. Die Knöpfedrückerei klappt. Letztlich soll da aber was ganz anderes ausgelöst werden, nämlich der Druck von Labels die ich mit ZPL dann direkt zum Drucker schicke.
Den Code bastelt mir das Teil jetzt schon mal zusammen.
Morgen überlege ich mir wie ich das Ding dann in einzelne Dateien pumpe.
Dazu muss ich mir noch was überlegen, wie ich den Barcode mache. Das ist ja nur eine Nummer die immer hochgezählt werden soll. Das speichert man vermutlich am einfachsten in einer Datei.
Morgen...

Code: Alles auswählen

import csv
from pathlib import Path
from functools import partial

ABFRAGE_FILENAME = Path(__file__).with_name("TB_Ausgabe_Abfrage8StueckII.txt")

def main():
    with ABFRAGE_FILENAME.open() as lines:
        data = list(csv.reader(lines, delimiter=";"))
        data.pop()

        printDat(data)

def printDat(a):


    for column, entry in enumerate(a):

        textINDatis =""#Variable für die zu druckende Datei

        textINDatis ='''^XA
            ^FO15,90^GB780,0,8,^FS
            ^FO15,250^GB780,0,8,^FS
            ^FO15,700^GB780,0,8,^FS
            ^FO0,0^GB600,200,2 
            ^FO15,20^GB780,785,4^FS  
            ^FO0,40^A0,50,50^FB800,1,0,C^FD'''
        textINDatis += "ABC Dingsbums"  #muss ich noch rauskriegen wie das in die csv kommt
        textINDatis +='''^FS
            ^FO0,110^A0,60,60^FB800,1,0,C^FD'''
        textINDatis += entry[1]
        textINDatis +='''^FS
            ^FO0,190^A0,70,70^FB800,1,0,C^FD'''
        textINDatis += entry[2]
        textINDatis +='''^FS
            ^FO0,80^BY3
            ^BCN,170,Y,N,N
            ^FO130,270^BY4^FD'''
        textINDatis += "12345667890" #das muss noch dynamisch werden
        textINDatis +='''^FS
            ^FO0,500^A0,60,50^FB800,,0,C^FD'''
        textINDatis += entry[3]
        textINDatis +='''^FS
            ^FO0,580^A0,60,50^FB800,,0,C^FD'''
        textINDatis += entry[4]
        textINDatis +='''^FS
            ^FO0,730^A0,60,60^FB800,1,0,C^FD'''
        textINDatis += entry[5] 
        textINDatis +='''^FS
            ^XZ'''


        print(textINDatis)
#### hier muss dann die Datei beschrieben und gespeichert werden




if __name__ == '__main__':
    main()
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

Also, die Dateien lassen sich speichern.
Das ging für mein Verständnis sogar recht einfach.

Code: Alles auswählen

        ausgabName = "testT{}.zpl".format(column)

        file = open(ausgabName,"w")
        file.write(textINDatis)
        file.close
Dumm dran ist nur, dass ich bei der Methode zwar für jedes Etikett einen File krieg, der richtig beschriftet ist, aber weil man zum Schluss ja wissen möchte, wieviele von den Dingern gedruckt und später gescannt worden sind, soll ja der darin enthaltene Barcode immer bei jedem Druck um 1 hochgezählt werden.
also muss ich mir das anders überlegen, vielleicht so, dass bei jedem Knopfdruck der File neu erzeugt wird und gedruckt, dabei der Zähler für den Barcode in einer extra Datei für jedes Label gespeichert.
nächste Herausforderung ist auch noch, dass diese tmp-Files nicht unbedingt im Programmverzeichnis gespeichert werden sollten.
mal sehen...
(ich bin ja für jede Idee dankbar)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@theoS: Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Bei `ausgabe_name` hat ausserdem ein `e` gefehlt. Ich habe keine Ahnung was `textINDatis` bedeuten soll.

Du hast beim `close()` schon wieder keine Klammern und die ``with``-Anweisung wurde doch bereits gezeigt. Wobei man wenn man `Path` bereits kennt in diesem Fall besser die `write_text()`-Methode davon verwenden sollte. Zudem sollte man bei Textdateien immer explizit eine Kodierung angeben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
theoS
User
Beiträge: 108
Registriert: Dienstag 5. November 2019, 21:44

@__blackjack__
dass ich die Namen noch nicht so drauf hab mag daran liegen, dass ich Unterstriche hasse wie die Pest. :|
und dazu kommt, dass mir solche Namen wie "data" oder "column" die dann u.U. gleichzeitig als Parameter oder sonst was verwendet werden mehr Fragezeichen in den Kopf machen als Klarheit schaffen. Da muss ich mich erst umstellen.

Immerhin muss ich sagen, dass die Klammern vom close() im Code drin waren. Hab mich wohl zu fest gefreut, dass da mal was geklappt hat. Dann hab ich die beim rein kopieren nicht mit markiert.
Und, ja, später hab ich das dann noch mal laufen lassen und dabei ist mir dann das fehlende "e" aufgefallen. (war mir dann aber schon zu spät, musste ja heute früh raus)

Ich hätte das ja auch gerne ein wenig anders gelöst, aber ehrlich: der Hinweis mit with stand zwar schon ganz zu Anfang da, aber geblickt habe ich dabei überhaupt nichts. Wie sollte mir das with denn hier helfen? In dem Code von Sirius3 konnte ich das zwar verwenden, aber so richtig geblickt habe ich das leider nicht.
Und, ich habe ja dann das Problem, dass die Anweisung wie ich sie jetzt verwende, davon ausgeht, dass die Datei die ausgelesen bzw. geschrieben wird im Verzeichnis liegt in der der Code liegt. Das sollte denke ich nicht so der Fall sein. Andernfalls muss ich ja dann doch wieder damit anfangen, den Pfad fest vorzugeben, oder?
Die zig verschiedenen Erklärungen im Internet schaffen es leider nicht, mir das verständlich zu machen.
Danke für alle Tipps, hab das jetzt mal so probiert:

Code: Alles auswählen

import os
import csv
from pathlib import Path
from functools import partial


ABFRAGE_FILENAME = Path(__file__).with_name("TB_Ausgabe_Abfrage8StueckII.txt")

def main():
    with ABFRAGE_FILENAME.open() as lines:
        data = list(csv.reader(lines, delimiter=";"))
        data.pop()
        
        printDat(data)

def printDat(a):


    for column, entry in enumerate(a):
        #print(column)

        text_in_datei_aus_csv =""#Variable für die zu druckende Datei

        text_in_datei_aus_csv +='''^XA
        ^FO15,90^GB780,0,8,^FS
        ^FO15,250^GB780,0,8,^FS
        ^FO15,700^GB780,0,8,^FS
        ^FO0,0^GB600,200,2 
        ^FO15,20^GB780,785,4^FS  
        ^FO0,40^A0,50,50^FB800,1,0,C^FD'''
        text_in_datei_aus_csv += "ABC Dingsbums"  #muss ich noch rauskriegen wie das in die csv kommt
        text_in_datei_aus_csv +='''^FS
        ^FO0,110^A0,60,60^FB800,1,0,C^FD'''
        text_in_datei_aus_csv += entry[1]
        text_in_datei_aus_csv +='''^FS
        ^FO0,190^A0,70,70^FB800,1,0,C^FD'''
        text_in_datei_aus_csv += entry[2]
        text_in_datei_aus_csv +='''^FS
        ^FO0,80^BY3
        ^BCN,170,Y,N,N
        ^FO130,270^BY4^FD'''
        text_in_datei_aus_csv += "12345667890" #das muss noch dynamisch werden
        text_in_datei_aus_csv +='''^FS
        ^FO0,500^A0,60,50^FB800,,0,C^FD'''
        text_in_datei_aus_csv += entry[3]
        text_in_datei_aus_csv +='''^FS
        ^FO0,580^A0,60,50^FB800,,0,C^FD'''
        text_in_datei_aus_csv += entry[4]
        text_in_datei_aus_csv +='''^FS
        ^FO0,730^A0,60,60^FB800,1,0,C^FD'''
        text_in_datei_aus_csv += entry[5] 
        text_in_datei_aus_csv +='''^FS
        ^XZ'''


        #print(text_in_datei_aus_csv)


        ausgabe_name = "testT{}.zpl".format(column)
        Path(ausgabe_name).write_text(text_in_datei_aus_csv, encoding="utf-8") #hier gibts dann kein close?


if __name__ == '__main__':
    main()
EDIT:
Oder ich schreib das so, dann gehts auch (grade rausgefunden...) , aber was hat das für Vorteile?

Code: Alles auswählen

        with Path(ausgabe_name) as raus_text:
            raus_text.write_text(text_in_datei_aus_csv, encoding="utf-8")

Antworten