Re: Labeldruck und was draus folgt
Verfasst: Dienstag 10. März 2020, 11:12
@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):
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.
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()
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.