Seite 3 von 9

Re: Labeldruck und was draus folgt

Verfasst: Dienstag 10. März 2020, 11:12
von __blackjack__
@theoS: Da sind an einigen Stellen unnötige Klammern um Ausdrücke und zu tiefe Einrückung.

Die Frames sind mir nicht so ganz klar. In `right_frame` wird nur *ein* `Frame` angeordnet. Damit kann man sich den eigentlich sparen. Und der `button_frame` wird in der Grid-Zeile 1 angeordnet, in der Zeile 0 ist aber nichts.

`numb_fil` ist kein guter Name. `numb` ist ein englisches Wort dessen Bedeutung hier sicher keinen Sinn machen. Mir ist auch nicht so ganz klar was die Werte in dieser Liste überhaupt bedeuten soll, denn das erste Element von jedem Tupel dieser Liste wird nirgends verwendet. Das ist einfach nur unnötig kompliziert. Letztlich ist das keine gute Idee in `click()` noch mal die ganzen Daten einzulesen statt einfach auch den ausgewählten Datensatz an diese Funktion zu übergeben.

`save_rows_as_files()` ist als Name natürlich falsch wenn man da die Schleife raus nimmt und nur noch *eine* Datei aus *einem* Datensatz gemacht wird.

Die zweite Zeile in `countprints()` hat keinen Effekt.

`numhochgez` ist wieder so ein schrecklicher Name aus Abkürzungen und ohne Trenner zwischen den Worten.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import tkinter as tk
from functools import partial
from pathlib import Path

PFAD = Path.home() / ".DruckData"

ABFRAGE_FILENAME = PFAD / "TB_Ausgabe_Abfrage8StueckII.txt"
ZAEHLER_FILENAME = PFAD / "numbers.csv"


def save_row_as_file(row, first_line, file_number):
    text = "\n".join(
        [
            "^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",
            #
            # muss ich noch rauskriegen wie das in die csv kommt (vorerst statisch)
            #
            first_line,
            "^FS^FO0,110^A0,60,60^FB800,1,0,C^FD",
            row[1],
            "^FS^FO0,190^A0,70,70^FB800,1,0,C^FD",
            row[2],
            "^FS^FO0,80^BY3",
            "^BCN,170,Y,N,N",
            "^FO165,270^BY4^FD",
            #
            # das muss noch dynamisch werden
            #
            "12345667890",  ###hier soll die hochgezählte Nummer rein
            "^FS^FO0,500^A0,60,50^FB800,,0,C^FD",
            row[3],
            "^FS^FO0,580^A0,60,50^FB800,,0,C^FD",
            row[4],
            "^FS^FO0,730^A0,60,60^FB800,1,0,C^FD",
            row[5],
            "^FS",
            "^XZ",
            "",
        ]
    )
    PFAD.mkdir(exist_ok=True)
    (PFAD / f"testT{file_number}_{row[1]}.zpl").write_text(text, "utf-8")


def count_prints(file_index, einsatzstelle):
    with ZAEHLER_FILENAME.open(encoding="utf-8") as file:
        rows = list(csv.reader(file, delimiter=";"))
    #
    # Das muss jetzt noch irgendwie hoch in den zpl-code.
    #
    rows[file_index + 1] = [einsatzstelle, int(rows[file_index + 1][1]) + 1]

    with ZAEHLER_FILENAME.open("w", encoding="utf-8") as file:
        csv.writer(file, delimiter=";").writerows(rows)


def on_click(row_index, row):
    save_row_as_file(row, "PZ DingsBums", row_index)
    count_prints(row_index, row[3])


def main():
    root = tk.Tk()
    root.title("Auswahl der Label")
    root.config(background="#f2c618")
    button_frame = tk.Frame(root, width=1200, height=400)
    button_frame.grid(row=0, column=0, padx=10, pady=3)

    with ABFRAGE_FILENAME.open(encoding="utf-8") as file:
        entries = csv.reader(file, delimiter=";")
        next(entries)  # Kopfzeile überlesen.
        for index, entry in enumerate(entries):
            row_index, column_index = divmod(index, 4)
            tk.Button(
                button_frame,
                text="{}\n{}".format(entry[1], entry[2]),
                bg="#f2c618",
                width=15,
                height=10,
                command=partial(on_click, index, entry),
            ).grid(row=row_index, column=column_index, padx=0, pady=0)

    root.mainloop()


if __name__ == "__main__":
    main()
Der Code geht davon aus das es die Zählerdatei schon gibt. Und ich finde das auch recht fragil das die beiden CSV-Dateien durch den Index der Datensätze verknüpft sind. Das macht Änderungen an den Dateien unnötig fehleranfällig.

Auch ist `entry`/`row` mit den magischen Indexwerten sehr unschön. Das würde ich beim Einlesen in Objekte mit sinnvollen Attributnamen verpacken. Wenn die Daten nicht verändert werden sollen reicht da ja ein Typ der mit `collections.namedtuple` erstellt wird.

Re: Labeldruck und was draus folgt

Verfasst: Dienstag 10. März 2020, 22:45
von theoS
Danke für die weiteren Infos.
An dem Code knabbere ich jetzt erst mal ein wenig intensiver.
Verstehe noch weniger davon als vorher. (Hab den Code aber vorher zwar umbauen können für meine Bedürfnisse aber nicht 100% durchschaut)
Muss ich noch mal zerfieseln um das zu verstehen.
Ich hatte das auch so gelassen weil es das tat was ich wollte. War auch mal ein kleines Erfolgserlebnis.
Leider funzt der Code auch so nicht. Hatte zuerst gedacht, das lag daran dass du die Zeile drin hast die die erste Zeile von der CSV überspringt. Das Ding hat keine Kopfzeile, so wie das von Access kommt. (Im Gegensatz zur Nummerierungs-CSV)
Letztlich hat das Auskommentieren dazu geführt, dass wieder 8 Schaltflächen da waren, kommt aber trotzdem diese Meldung:

Code: Alles auswählen

raceback (most recent call last):
  File "/media/earl/Redbird/projekt/drucksMitKnopf.iv.py", line 96, in <module>
    main()
  File "/media/earl/Redbird/projekt/drucksMitKnopf.iv.py", line 85, in main
    text="{}\n{}".format(entry[1], entry[2]),
IndexError: list index out of range
und dann passiert gar nichts mehr.
vielleicht finde ich das ja mal selbst raus. :o)
(eigentlich unlogisch, denn es sind 8 Schaltflächen und alle beschriftet, was will das Ding denn noch haben?)
Aber, wenn ich mir das recht überlege, hab ich das gestern auch ein paar mal probiert, ohne das list vor dem enumerate auszukommen.
Das ist mir aber in keinem Fall gelungen.
Wenn ich jetzt nach der Zeile mal die Werte ausgeben lasse mit

Code: Alles auswählen

for index, entry in enumerate(entries):
            print(f"index: {index}:",f"entry: {entry[1]} \n {entry[2]}")
Dann kommt so was raus:
[quote]index: 0: entry: 6 
 Beispiel 1
index: 1: entry: 4 
 Beispiel 2
index: 2: entry: 5 
 Beispiel 2
index: 3: entry: 7 
 Beispiel 2
index: 4: entry: 8 
 Beispiel 2
index: 5: entry: 413 
 Beispiel 2
index: 6: entry: 1 
 Beispiel 2
index: 7: entry: 9 
 Beispiel 2[/quote]
 
 und auch das: [code]print(f"index: {index}:",f"entry: {entry[1]} \n {entry[2]}")
IndexError: list index out of range
Die zweite Zeile in `countprints()` hat keinen Effekt.
Ja, das wusste ich ausnahmsweise, hab ich deswegen drin gelassen, weil ich ja die CSV auch dann erzeugen möchte, wenn mal keine da ist. Also wenn sie da ist, einlesen und weiterzählen, wenn die nicht da ist, neu anlegen und halt von 1 hochzählen.
(Noch eine Baustelle)
Wenn die Daten nicht verändert werden sollen reicht da ja ein Typ der mit `collections.namedtuple` erstellt wird.
nach dem hab ich prompt gegooglet und das erste was mir dazu unterkam war, dass dasdepricated ist. :shock:
Aber liest sich sehr praktisch an. Werde ich mal versuchen.
Danke schon mal für die Anregungen.

Re: Labeldruck und was draus folgt

Verfasst: Dienstag 10. März 2020, 23:12
von __blackjack__
@theoS: Ich hatte das `pop()` falsch interpretiert, nämlich als ``pop(0)``, was es ja nicht ist. Das ist dann wohl auch der Unterschied — Du hast da anscheinend einen letzten Datensatz in der Datei der nicht mit verarbeitet werden darf weil der nicht vollständig oder gar leer ist.

Okay, wenn das die zweite Zeile von `countprints()` für Dich ist, dann meinte ich die dritte Zeile. Also die hier:

Code: Alles auswählen

    (ZAEHLER_FILENAME / "numbers.csv")
Die macht keinen Sinn weil die nichts macht ausser ein bisschen Rechenzeit zu verbrauchen. Die erstellt ein `Path`-Objekt und verwirft das dann sofort wieder.

Wo ist Dir das denn untergekommen das `collections.namedtuple()` deprecated ist? Das wäre mir neu. Im `collections`-Modul ist vieles was ins `collections.abc`-Modul verschoben wurde und *das* über das `collections`-Modul anzusprechen ist deprecated. Aber `namedtuple` ist ja nichts abstraktes, das ist weiterhin über `collections` verfügbar.

Re: Labeldruck und was draus folgt

Verfasst: Mittwoch 11. März 2020, 20:36
von theoS
@__blackjack__
Woher ich das hab?
https://docs.python.org/3/library/collections.html
zumindest hab ich das so interpretiert, kann aber sein, dass mein Englisch zu eingerostet ist. Habs auf die ganze Tabelle bezogen. Vielleicht falsch, wenn du das sagst. :))
Das liest sich spannend an, ich teste das mal.

Das mit der CSV ist mir nie aufgefallen, da sind tatsächlich 2 Leerzeilen drin. Ich hab mich schon gewundert, dass das mit .pop() überhaupt funktioniert nachdem ich gelesen hab, was das tut. (Mit ein Grund warum ich an dem Code nicht herumgedoktert hab und ihn auch nicht verstanden.)
Das ist also ein todo, die Datei entweder nach dem Export von Access noch mal nachzuuntersuchen und alles unnütze rauszulöschen.
Danke für den tipp.

Re: Labeldruck und was draus folgt

Verfasst: Mittwoch 11. März 2020, 20:58
von __deets__
Das bezieht sich auf den Satz danach.

Re: Labeldruck und was draus folgt

Verfasst: Mittwoch 11. März 2020, 23:04
von theoS
OK, das konnte ich jetzt auch nicht nachvollziehen, aber egal, ich werde mir das mal näher anschauen. (hab da von dir auch ein paar Beiträge hier drin gefunden, da kann ich ja mal experimentieren.)

Hab jetzt die Datei mal versucht anlegen zu lassen falls die nicht da ist und mit dummy-Einträgen zu füllen.
Ich hab das jetzt so gelöst, weil das in der Form in der die Datei dann "unten" geschrieben wird nicht klappte.

Code: Alles auswählen

def count_prints(file_index, einsatzstelle):

    if not ZAEHLER_FILENAME.exists():
        
        with ZAEHLER_FILENAME.open("w", encoding="utf-8") as file:
            csv.writer(file, delimiter=";").writerow(['Einsatzstelle','Anzahl'])
            for n in range(0,8):
                csv.writer(file, delimiter=";").writerow(['Dings',f"0"])

    
    with ZAEHLER_FILENAME.open(encoding="utf-8") as file:
        rows = list(csv.reader(file, delimiter=";"))
    #
    # Das muss jetzt noch irgendwie hoch in den zpl-code.
    #
    rows[file_index + 1] = [einsatzstelle, int(rows[file_index + 1][1]) + 1]

    with ZAEHLER_FILENAME.open("w", encoding="utf-8") as file:
        csv.writer(file, delimiter=";").writerows(rows)
(wenn wieder Einrückungen nicht stimmen, kommst wahrscheinlich davon, dass ich hier noch ein paar Kommentare rausgelöscht hab)

Re: Labeldruck und was draus folgt

Verfasst: Mittwoch 11. März 2020, 23:11
von __deets__
Was ich damit meinte war, dass nicht die Tabelle mit NamedTuple gemeint ist. Sondern der Satz der folgt mit dem abc Modul. NamedTuple und der Rest sind also nicht deprecated.

Re: Labeldruck und was draus folgt

Verfasst: Mittwoch 11. März 2020, 23:26
von Sirius3
Dass Du immer noch mit einem file_index arbeitest, ist immer noch schlecht. Man versucht kryptische Indices zu vermeiden. Was soll passieren, wenn der Index nicht existiert?
Was auch nicht schön ist, ist, dass der Code zum Schreiben doppelt ist.

Code: Alles auswählen

def count_prints(file_index, einsatzstelle):
    try:
        with ZAEHLER_FILENAME.open(encoding="utf-8") as file:
            rows = list(csv.reader(file, delimiter=";"))
    except FileNotFoundError:
        rows = [['Einsatzstelle','Anzahl']] + [["Dings", 0]] * 8
    rows[file_index + 1] = [einsatzstelle, int(rows[file_index + 1][1]) + 1]
    with ZAEHLER_FILENAME.open("w", encoding="utf-8") as file:
        csv.writer(file, delimiter=";").writerows(rows)

Re: Labeldruck und was draus folgt

Verfasst: Donnerstag 12. März 2020, 08:48
von theoS
Sirius3 hat geschrieben: Mittwoch 11. März 2020, 23:26 Dass Du immer noch mit einem file_index arbeitest, ist immer noch schlecht. Man versucht kryptische Indices zu vermeiden. Was soll passieren, wenn der Index nicht existiert?
Danke für die Antwort.
Das mit den Indices verstehe ich jetzt auch nur halb. Denn die werden ja doch im Eigentlichen durch das enumerate erzeugt und dienen einfach nur dazu die Files zu erzeugen um dann diese zum Drucker zu schicken. Wenn ich den ZPL-Text direkt zum Drucker schicken könnte, wär das schätze ich ein wenig anders, denn dann müsste ich die Dateien ja gar nicht erst anlegen/speichern etc.
Das andere was ich anlege sind Nummern die hochgezählt werden müssen. Da brauche ich ja was zum hochzählen. Die müssen dann zudem ja auch noch in den ZPL-Code mit eingearbeitet werden.
Momentan hätte ich keine Plan das ohne Index/Nummer zu machen
Was auch nicht schön ist, ist, dass der Code zum Schreiben doppelt ist.
Wa meinst du damit? dass ich die Kopzeile der csv extra anlege?
So ganz kann ich jetzt auch keine direkten Vorteil von deiner Version erkennen. Das Path-Objekt gibt mir doch zurück ob der File da ist. Wenn nicht wird er angelegt. Das ist nur eine Ausweichlösung, falls beim Anstöpseln des USB-Stick dann keine solche Datei mitgeliefert wird. Prinzipiell sollte das reichen beim ersten Mal eine draufzukopieren und dann dort immer nur gelesen werden.
Hab mir auch schon überlegt, das Hochzählen ausschließlich in einer Variablen zu machen und diese dann am Ende oder in einem bestimmten Rhytmus in den File zu pumpen. Aber leider bisher noch nichts gefunden. Python hat so viel Zeug das für mich neu ist. :o)

Re: Labeldruck und was draus folgt

Verfasst: Donnerstag 12. März 2020, 09:20
von __blackjack__
Der direkte Vorteil ist, dass das einfacher ist wenn man nicht erst Daten schreibt die man sofort danach wieder liest wenn man am Ende sowieso schon Code hat der die Daten schreibt. Zumal Dein Code zum schreiben auch noch für jeden einzelnen Datensatz ein Writer-Objekt erzeugt hat.

Das Problem am Index ist das man an keiner der beiden Dateien etwas ändern darf was Anzahl und/oder Reihenfolge der Datensätze ändert und das solche Änderungen auch nicht im Code auffallen/festgestellt werden können. Das die Datensätze in den beiden Dateien implizit durch ihre Position zusammen gehören ist fehleranfällig, führt aber nicht zu Laufzeitfehlern und man kann auch keinen Code schreiben der so ein Problem erkennen könnte. Da ist dann die Frage wann, wem, was auffällt falls das nicht mehr zusammenpasst. Sicherer wäre es wenn es pro Datensatz einen eindeutigen Wert (Schlüssel/ID) gäbe an denen man die jeweils zuordnen kann. Was ist denn beispielsweise die erste Spalte in der Zählerdatei die im momentanen Code gar keinen Sinn macht?

Wenn Du den aktuellen Zählerwert irgendwo anders brauchst, dann reicht auch nicht diese eine Funktion. Dann braucht man eher eine die einen Zähler ausliest, und eine die einen neuen Zählerwert schreibt, wobei dann auch wieder auf eine Funktion zugegriffen werden muss die die Zählerstände ausliest, weil man ja nicht gezielt einen Wert in einer CSV-Datei verändern kann. Muss das überhaupt CSV sein? JSON wäre wahrscheinlich einfacher zu handhaben und man hat da auch gleich Zahlen und nicht nur Zeichenketten. Und da wäre dann noch SQLite, damit man nicht immer alle Daten lesen/schreiben muss wenn man nur *einen* Zähler ändern möchte.

Re: Labeldruck und was draus folgt

Verfasst: Donnerstag 12. März 2020, 21:45
von theoS
Der direkte Vorteil ist, dass das einfacher ist wenn man nicht erst Daten schreibt die man sofort danach wieder liest wenn man am Ende sowieso schon Code hat der die Daten schreibt. Zumal Dein Code zum schreiben auch noch für jeden einzelnen Datensatz ein Writer-Objekt erzeugt hat.
Okay, muss zugeben, dass ich davon noch ziemlich weit weg bin, mir Gedanken zu machen Objekte zu erzeugen die ich nicht brauche, die mich aber auch nicht irgendwie im Moment belasten. Bin schon glücklich, wenn meine Shell nicht knallrot ist. :wink:
Aber, ich lese ja zum einen eine csv ein um die Knöpfe zu beschriften und die Werte daraus schreibe ich dann je nach Knopf in eine Datei.
Dabei habe ich mir dann, vor allem nach der Erkenntnis dass in der csv ja Leerzeilen drin waren und u.U. eine Kopfzeile drin sein kann, schon ein paar Gedanken gemacht, was könnte passieren, wenn Python aus irgendeinem Grund die Reihenfolge ändert.
Dann bin ich mit meinen Nummern die ja zweifelsfrei für die Knöpfe gebraucht werden im weiteren Verlauf aufgeschmissen. Andererseits habe ich ja dann die Daten an die Datei geben können aber ich hänge doch da immer von dem Knopf ab, der gedrückt wird. Oder etwa nicht?
Gut, ich könnte dann über den etwas merkwürdigen ID der Ursprungs-CSV den Dateinamen bilden, das ist mir neulich auch mal in den Sinn gekommen, dann kann man das beim Auslesen der Druckzahlen zuordnen. Vorerst war ich aber mal damit zufrieden dass die Datei überhaupt unterscheidbar gespeichert wurde.
Muss das überhaupt CSV sein? JSON wäre wahrscheinlich einfacher zu handhaben und man hat da auch gleich Zahlen und nicht nur Zeichenketten. Und da wäre dann noch SQLite, damit man nicht immer alle Daten lesen/schreiben muss wenn man nur *einen* Zähler ändern möchte.
Es muss zum »Übertragen« csv sein. Zum Weiterarbeiten wäre mir was andres auch lieber, aber ich muss das Ergebnis dann zum Ausgeben wieder in eine CSV bringen.
Momentan schau ich mir sqlite an, da ich doch für diese Zwecke genug SQL beherrsche. Das kann vermutlich auch direkt csv mit ausspucken.
Ich forsche... :shock: :shock:
Das Problem am Index ist das man an keiner der beiden Dateien etwas ändern darf was Anzahl und/oder Reihenfolge der Datensätze ändert
Zumindest was die Anzahl betrifft, hab ich keine Bange, denn die 8 Knöpfe sind gesetzt. Wenn die die CSV dann größer machen haben sie Pech gehabt.
Was mir mehr Sorgen bereitet ist, dass sie den csv-Export nicht hinkriegen.) Hab den selber nicht (gefiltert) machen können weil die DB "geschützt" ist. Da bin ich noch am Arbeiten das zu ändern und wurstle derzeit mit dem von mir aus dem Gesamtbestand der Daten verkleinerten Teil weiter)

Immerhin habe ich schon mal eine DB anlegen können. Jetzt probiere ich das aus, ob ich die csv da rein krieg.
Danke für dieTipps!

Re: Labeldruck und was draus folgt

Verfasst: Donnerstag 12. März 2020, 23:17
von __blackjack__
Bei Sqlite ging ich erst mal nur von den Zählern aus. Die müssen übertragen werden? Wobei SQLite ja auch nur *eine* Datei erzeugt die man problemlos auf andere Rechner übertragen kann.

Re: Labeldruck und was draus folgt

Verfasst: Freitag 13. März 2020, 00:36
von Sirius3
Das einfachste wäre einfach den Index wegzulassen:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import tkinter as tk
from functools import partial
from pathlib import Path

PFAD = Path.home() / ".DruckData"
ABFRAGE_FILENAME = PFAD / "TB_Ausgabe_Abfrage8StueckII.txt"
ZAEHLER_FILENAME = PFAD / "numbers.csv"

def save_row_as_file(count, row, first_line):
    text = "\n".join(
        [
            "^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",
            #
            # muss ich noch rauskriegen wie das in die csv kommt (vorerst statisch)
            #
            first_line,
            "^FS^FO0,110^A0,60,60^FB800,1,0,C^FD",
            row[1],
            "^FS^FO0,190^A0,70,70^FB800,1,0,C^FD",
            row[2],
            "^FS^FO0,80^BY3",
            "^BCN,170,Y,N,N",
            "^FO165,270^BY4^FD",
            str(count),
            "^FS^FO0,500^A0,60,50^FB800,,0,C^FD",
            row[3],
            "^FS^FO0,580^A0,60,50^FB800,,0,C^FD",
            row[4],
            "^FS^FO0,730^A0,60,60^FB800,1,0,C^FD",
            row[5],
            "^FS",
            "^XZ",
            "",
        ]
    )
    PFAD.mkdir(exist_ok=True)
    (PFAD / f"testT_{row[3]}_{row[1]}.zpl").write_text(text, "utf-8")

def count_prints(einsatzstelle):
    try:
        with ZAEHLER_FILENAME.open(encoding="utf-8") as file:
            counts = dict(csv.reader(file, delimiter=";"))
    except FileNotFoundError:
        counts = {}
    result = int(counts.get(einsatzstelle, 0)) + 1
    counts[einsatzstelle] =result
    with ZAEHLER_FILENAME.open("w", encoding="utf-8") as file:
        csv.writer(file, delimiter=";").writerows(counts.items())
    return result

def on_click(row):
    count = count_prints(row[3])
    save_row_as_file(count, row, "PZ DingsBums")

def main():
    root = tk.Tk()
    root.title("Auswahl der Label")
    root.config(background="#f2c618")
    button_frame = tk.Frame(root, width=1200, height=400)
    button_frame.grid(row=0, column=0, padx=10, pady=3)

    with ABFRAGE_FILENAME.open(encoding="utf-8") as file:
        entries = csv.reader(file, delimiter=";")
        next(entries)  # Kopfzeile überlesen.
        for index, entry in enumerate(entries):
            row_index, column_index = divmod(index, 4)
            tk.Button(
                button_frame,
                text="{}\n{}".format(entry[1], entry[2]),
                bg="#f2c618",
                width=15,
                height=10,
                command=partial(on_click, entry),
            ).grid(row=row_index, column=column_index, padx=0, pady=0)

    root.mainloop()

if __name__ == "__main__":
    main()

Re: Labeldruck und was draus folgt

Verfasst: Freitag 13. März 2020, 21:33
von theoS
@Sirius3 Danke. Das funktioniert schon fast zu gut :)
Ich durchschau zwar erst einen Teil davon, aber das macht erst mal nichts.
Das mit dem Dict wollte ich mir als nächstes anschauen nachdem ich mit dem Sqlite nicht so recht klarkam.

Jetzt hab ich dann nur das Problem, dass die Files beim Laden einer neuen CSV dann immer mehr werden. Die muss ich halt dann mit dem Skript killen das mir die CSV in den Ordner reinkopiert.

@__blackjack__
Klar ist das nur eine Datei, aber die Kollegen die das benutzen haben zum Verwalten der Daten derzeit Access. Und irgendwie ist das vermutlich jetzt nicht so einfach, die sqlite-Datei in Access einzulesen. (Ich kenn mich da eh nicht aus, weil Access mag ich nicht.)
Ich werd mir das aber trotzdem im Hinterkopf behalten, wer weiß wozu ich das noch brauchen kann.

Danke euch beiden für die Unterstützung.

Re: Labeldruck und was draus folgt

Verfasst: Freitag 13. März 2020, 21:37
von sparrow
Ich bin ja grundsätzlich von so waghalsigen Konstrukten fasziniert.
Was spricht denn eigentlich dagegen, das Gerät, dass die Etiketten druckt, auf irgend eine Weise ins Netzwerk zu bringen und die Daten direkt aus der Datenbank zu holen?
Keiner muss exportieren, dieses USB-Stöpseln enfällt. Die Medienbrüche sind minimiert.

Re: Labeldruck und was draus folgt

Verfasst: Freitag 13. März 2020, 21:51
von __deets__
Klingt seeeehr nach eine XY-Problem. Statt hier an vermeintlichen Problemen rumzufuhrwerken waere ein Ueberblick ueber die Gesamtsituation im Zweifel wesentlich hilfreicher, weil man dann funktienierende Loesungen statt diesem Gepfriemel vorschlagen koennte.

Und das SQLite nicht direkt in Access importiert werden kann ist sehr wahrscheinlich, es ist allerdings auch trivial in ein CSV zu ueberfuehren, und damit waere dann die eigene Datenhaltung losgeloest von einem Exportformat. Muss auch nicht SQLite sein, kann auch Sirius3's JSON zugrunde gelegt werden - aber das Gewuerge mit den Zeilen muss ja nun wirklich nicht sein.

Re: Labeldruck und was draus folgt

Verfasst: Freitag 13. März 2020, 23:23
von theoS
Was spricht denn eigentlich dagegen, das Gerät, dass die Etiketten druckt, auf irgend eine Weise ins Netzwerk zu bringen und die Daten direkt aus der Datenbank zu holen?
Ach, da gibts viele Gründe. Die einfachste Erklärung dürfte die sein, dass dort wo der Drucker eingesetzt wird. Strom ist, sonst keine weitere nutzbare Infrastruktur.
Das wäre vermutlich die einfachste Lösung gewesen.
Nu isses aber so.
Da haben sie das System, das ein Kollege programmiert hat, gesehen, das wollten sie umstricken. Leider konnte der Kollege mangels Lebens nicht mehr unterstützen. Sein Code ist compiliert oder/und verschlüsselt oder einfach weg.

Weil ich schon immer einen triftigen Grund gesucht hab mal eine andere Programmiersprache zu lernen als VBA (ich weiß...), hab ich, als von der Misere gehört hab, die Gelegenheit ergriffen, das zu versuchen. (Um irgendwas zu lernen brauche ich was, was dann auch einen Sinn macht. Kein "Hallo Welt"). Drum lege ich auch immer Wert drauf, was zu verstehen. Funktionierende Lösungen die ich nicht verstehe bringen mir leider wenig.

@__deets__
aber das Gewuerge mit den Zeilen muss ja nun wirklich nicht sein.
Ich habe jetzt festgestellt, dass der Code wenn ich neue 8 Zeilen der Daten verwende, diese auch als neue Zeilen in die CSV-Datei geschrieben werden. Also noch eine Datei die ich dann lösche, wenn der USB-Stick angestöpselt wird.
Es soll ja immer nur diese 8 Zeilen in denen steht, welcher Knopf wie oft gedrückt wurde und das in einem Barcode abgebildet werden. (wozu sie den brauchen wissen die Götter). Und das muss halt dann auch einer auslesen können der halt grad mal mit MS Office umgeht. Ist ja da eh schon ein Geek, wenn er Access verwendet. :geek:
Und für diese 8 Zeilen, die die Kollegen wenn sie das so hochgezählt haben wollen, dann mit der nächsten fälligen Nummer (die sie wohl momentan auch schon in der DB mit drin haben, zum Betanken des Druckkonstruktes mit herstellen müssen. Da ist csv halt das Einfachste das ich kenne. Vielleicht eignet sich da json besser? Ich weiß es nicht.

Um noch mal eine Gesamtüberblick zu geben, der eigentlich auf dem ersten Post steht:
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.

Re: Labeldruck und was draus folgt

Verfasst: Samstag 14. März 2020, 10:43
von Sirius3
Die Datei mit den Zählern soll auch aus Access kommen? Aber wie kommen die Zählstände wieder nach Access zurück? Wenn man zwei unabhängige Zähler hat, dann gibt das garantiert Chaos.

Re: Labeldruck und was draus folgt

Verfasst: Samstag 14. März 2020, 12:36
von theoS
Ja, wie die das handlen ist mir auch noch nicht klar. Da ich da jetzt auch von einem Gebastel ausgehe, versuche ich das so einfach wie möglich zu halten.
Denn mit einer csv können die das bei 8 Zeilen auch händisch in ihre Datenbank einpflegen. Soweit ich das verstanden hab, würde denen das erst mal reichen.
Wahrscheinlich ist das dann sogar das einfachste die Zähler immer bei Datenwechsel komplett neu anzulegen.

Re: Labeldruck und was draus folgt

Verfasst: Samstag 14. März 2020, 13:45
von sparrow
Power-LAN, Netzwerk über die Steckdose zum Gerät, direkt auf die Datenbank zugreifen.
Ganz viele Probleme gelöst.