Hab ich jetzt herausgefunden, wie ich den Rechner runterfahren wenn ich einen Knopf länger drücke und auch wie ich drucke mit subprocess()
Was ich jetzt nicht hab, ist die Anbindung dieses Teils an sqlalchemy. Wobei ich das bisher "nur" für das USB-Teil brauche.
Was mir vermutlich hier noch abgeht ist die Fehlerbehandlung. Aber so richtig weiß ich nicht, was das Progg eigentlich tun soll, wenn der Printer nicht druckt. Das schiebt den Befehl ja bloß durch ans System.
Zudem habe ich mir überlegt, ob ich nicht gleich einfach den rohen Text an lp übergeben kann. Der Labeldrucker macht aus dem Kauderwelsch schöne Label wenns von der Datei kommt, warum nicht auch vom Text.
Nur da hab ich vermutlich einfach zu wenig Ahnung...
Hier mal der Code.
Vielleicht ist ja was dabei was halbwegs passt.
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf8 -*-
import sqlite3
from sqlite3 import Error
from pathlib import Path
import csv
import tkinter as tk
from tkinter import messagebox
from functools import partial
from contextlib import closing
import time
from datetime import datetime as DateTime
import subprocess
PFAD = Path.home() / ".DruckData"
BARCODE_DB_FILENAME = PFAD / "sqlite/db"
DATABASE = BARCODE_DB_FILENAME / "config8.db"
ORT = "PZ Dingsbums 14"
CHECKPOINT = "42"
SQL_UPDATE_AKTUELLE_NR = """UPDATE numbers
SET letzte_nr = (letzte_nr + 1) % 10000
WHERE id = ?"""
SQL_SELECT_KNOPFDATEN = """SELECT knd.ISPT_Nr,
num.Letzte_Nr
FROM knopfdaten as knd,
numbers as num
WHERE knd.ID = ?
AND knd.ID = num.ID"""
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",
first_line,
"^FS^FO0,110^A0,60,60^FB800,1,0,C^FD",
str(row[1]),
"^FS^FO0,190^A0,70,70^FB800,1,0,C^FD",
str(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",
str(row[3]),
"^FS^FO0,580^A0,60,50^FB800,,0,C^FD",
str(row[4]),
"^FS^FO0,730^A0,60,60^FB800,1,0,C^FD",
str(row[5]),
"^FS",
"^XZ",
"",
]
)
PFAD.mkdir(exist_ok=True)
datei_zum_druck = PFAD / f"testT_{row[3]}_{row[1]}.zpl"
(datei_zum_druck).write_text(text, "utf-8")
#hier bin ich mir nicht sicher, ob es nicht schlauer wäre
#auf das speichern zu verzichten und die Datei gleich mit
#subporcess an den Drucker zu schicken. Wenn das geht...
return datei_zum_druck
def lade_daten(conn):
curs2 = conn.cursor()
config_sql = "select ID, E_St, Zeile3, Zeile5, Zeile6, Zeile7 from knopfdaten;"
curs2.execute(config_sql)
configdaten = curs2.fetchall()
return configdaten
def zaehl_ausdrucke(connection, id):
with closing(connection.cursor()) as cursor:
cursor.execute(SQL_UPDATE_AKTUELLE_NR, [id])
cursor.execute(SQL_SELECT_KNOPFDATEN, [id])
ispt_nr, letzte_nr = cursor.fetchone()
barcode = f"{ispt_nr}{CHECKPOINT}{letzte_nr}"
cursor.execute("update knopfdaten SET Barcode = ? where id = ?", (barcode, id))
print(barcode, letzte_nr)
connection.commit()
return barcode
def datei_drucken(druckdatei):
print(f"{druckdatei}")
subprocess.run(['lp' , druckdatei])
class MainWindow(tk.Tk):
def __init__(self, conn, configdaten):
super().__init__()
self.title("Auswahl der Label")
self["background"] = "#f2c618"
button_frame = tk.Frame(self, width=1200, height=400)
button_frame.grid(row=0, column=0, padx=10, pady=3)
for index, entry in enumerate(configdaten):
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(self.on_click, entry, conn),
).grid(row=row_index, column=column_index, padx=0, pady=0)
self.bind('<ButtonPress-1>', self.start_druck)
self.bind('<ButtonRelease-1>', self.stopp_druck)
self.knopf_drueck_zeit = None
def start_druck(self, event):
self.knopf_drueck_zeit = time.monotonic()
print("start_druck", self.knopf_drueck_zeit)
def stopp_druck(self, event):
knopf_loslass_zeit = time.monotonic()
print("stopp_druck", knopf_loslass_zeit)
if knopf_loslass_zeit - self.knopf_drueck_zeit >5:
print("schalte jetzt aus")
self.ExitApplication()
def ExitApplication(self):
MsgBox = tk.messagebox.askokcancel(
title="Ausschalten",
message="Soll der Rechner ausgeschaltet werden?")
print(MsgBox)
if MsgBox == True:
self.destroy()
else:
tk.messagebox.showinfo(
'Zurück',
'Das Hauptfenster wird wieder gezeigt'
)
def on_click(self, row, conn):
count = zaehl_ausdrucke(conn, row[0])
print(count)
datei_zum_druck = save_row_as_file(count, row, ORT)
datei_drucken(datei_zum_druck)
def main():
BARCODE_DB_FILENAME.mkdir(parents=True, exist_ok=True)
print(f"{BARCODE_DB_FILENAME}/config8.db")
try:
conn = sqlite3.connect(f"{DATABASE}")
except Error as e:
print(e)
configdaten = lade_daten(conn) #lädt die Daten aus der csv nach
print(configdaten)
root = MainWindow(conn, configdaten)
root.mainloop()
if __name__ == '__main__':
main()