Drucken mit Nadeldrucker

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
tomkin
User
Beiträge: 12
Registriert: Sonntag 10. April 2011, 11:23

Hello! :P

Ich hab ein schönes Kassa-Programm für ein Kino geschrieben - mit Sitzplan, Reservierungen, Verkauf und allem drum und dran.. Schön.. Nun hab ich mir gedacht, naja, jetzt lass ich das Programm einfach noch mit dem Nadeldrucker die Eintrittskarten ausdrucken und fertig......

Ups... :shock:

Ups, ups...!!

Ja.. nun, bin ich draufgekommen, dass das mit Python und drucken nicht so einfach ist.

Eigentlich muss nur eine einzige Zeile pro Karte gedruckt werden. Und der Nadeldrucker muss von Karte zu Karte im richtigen Abstand weiterfahren.

Nach viel Suchen im Netz fand ich heraus, dass PyQt4, Python 3 und Drucken eine erfolgreiche Kombination sein könnten. Ich hab PyQt heruntergeladen, die Installerdatei (Win XP) ausgeführt und nun ... weiß ich keinen Meter mehr weiter. Ich mach Python noch nicht lange und PyQt überfordert mich nun völlig. Wie komm ich weiter? Kann mir irgendjemand helfen?

:K
BlackJack

@tomkin: Bei Nadeldruckern will man in der Regel eher Text als Grafik ausgeben und da würde ich wahrscheinlich versuchen den Drucker direkt anzusprechen.

Falls Grafikdruck doch okay ist, dann wäre ein GUI-Toolkit eine naheliegende Wahl. Am besten schaust Du erst einmal bei dem welches Du schon für die Anwendung verwendet hast. Oder ist der Sitzplan nicht "grafisch"?
tomkin
User
Beiträge: 12
Registriert: Sonntag 10. April 2011, 11:23

Danke für die Antwort..

Nun, ich habe den Sitzplan mit tkinter erstellt. Aber ich hab gelesen, dass man damit nicht (gut?) drucken kann.

Wie kann ich den Drucker direkt ansprechen? Und wie organisiere ich den Papierlauf in der passenden Länge?
tomkin
User
Beiträge: 12
Registriert: Sonntag 10. April 2011, 11:23

Hm.. keine Antworten.. anscheinend ist es echt etwas schwierig.

Wie mache ich mir mit PyQt ein A4-Blatt, das ich dann ausdrucken kann? Muss nämlich auch Berichte drucken.
Und wie starte ich dann den Druck?

:?:
lunar

Wieso liest Du nicht erst einmal die Dokumentation zum Drucken in Qt? Dort und in der Dokumentation der entsprechenden Klassen sind auch Beispiele zu finden.
tomkin
User
Beiträge: 12
Registriert: Sonntag 10. April 2011, 11:23

lunar hat geschrieben:Wieso liest Du nicht erst einmal die Dokumentation zum Drucken in Qt?
Weil ich die bisher nicht gekannt habe, Qt nur vom "Hörensagen" im Internet kannte, es grad mal installiert habe ohne zu wissen, was es genau ist und wie es geht ;)

Aber das hilft mir mal weiter. Danke!
BlackJack

@tomkin: Wenn da ein Nadeldrucker dran hängt, wo vorgedruckte Kinokarten mit Perforation zum Trennen der Karten und Randlochung für den Papiertransport bedruckt werden, weiss ich nicht ob das von einem der GUI-Toolkits hinreichend unterstützt wird. Endlospapier ist heutzutage ja eher exotisch.

Die meisten Nadeldrucker verstehen ESC/P. Mit den Steuercodes und `pyserial` oder `pyparallel` kann man die also direkt damit ansteuern. Wenn einfacher Text reicht, wäre das eine Lösung ohne sich in ein neues GUI-Toolkit einarbeiten zu müssen.

In einem Programm kann man sowieso nicht so einfach verschiedene GUI-Toolkits verwenden. Wenn sich zwei Hauptschleifen um die Ereignisverarbeitung des Fenstersystems streiten, kommt in der Regel Murks dabei heraus.

Wenn Du also auf Qt zum Drucken setzen würdest, solltest Du gleich die gesamte Anwendung auf Qt portieren.
lunar

@BlackJack: Zum Drucken braucht man nicht unbedingt eine Hauptschleife. Es reicht, ein "QApplication"-Objekt zu erzeugen.
tomkin
User
Beiträge: 12
Registriert: Sonntag 10. April 2011, 11:23

So, ich hab's nun geschafft, dass ich mir mit Hilfe von PyQt meine Berichte ausrucke. Einziges Problem: Das Öffnen des Print-Dialogs verursacht einen Absturz des Programms. Nach Bestätigen des Dialogs wird gedruckt, aber die tkinter-Oberfläche lässt sich nicht weiter bedienen. Vielleicht ein Konflikt PyQt <-> tkinter? Es wird aber kein PyQt-Loop verwendet, nur tkinter mainloop().

Aber nun zu Punkt 2 - ESC/P:

Ich habe versucht, anhand des Codes von http://de.wikipedia.org/wiki/ESC/P die dort angeführte Beispielgrafik zu drucken. Der Nadeldrucker tut aber leider überhaupt nichts.

Code:

Code: Alles auswählen

ser = serial.Serial(0)
text = "27 42 5 24 0 "
text += "0 7 15 31 62 124 120 113 241 225 224 224 224 224 225 241 113 120 124 62 31 15 7 0 "
text += "13 "
text += "27 74 24 "
text += "27 42 5 24 0 "
text += "255 255 255 129 0 0 0 195 195 195 1 1 1 1 195 195 195 0 0 0 129 255 255 255 "
text += "13 "
text += "27 74 24 "
text += "27 42 5 24 0 "
text += "0 224 240 248 124 62 30 142 143 199 199 199 199 199 199 143 142 30 62 124 248 240 224 0 "
text += "13 "
text += "27 74 24 "
ser.write(text.encode('utf-8'))
ser.close()
Was mache ich falsch?
lunar

Wenn Du Dialoge aus Qt verwendest, dann musst natürlich auch die Qt-Ereignisschleife laufen, und Du musst letztlich Dein ganzes Programm auf Qt portieren.
tomkin
User
Beiträge: 12
Registriert: Sonntag 10. April 2011, 11:23

Ich hab nun diese kurze Programm laufen lassen.

Code: Alles auswählen

from PyQt4.QtGui import *
from PyQt4.QtCore import *

text = "test"
app = QApplication(sys.argv)
font = QFont("Courier",12)
printer = QPrinter()
size=QSizeF(5.08, 5.08)
printer.setPaperSize(size, QPrinter.Millimeter)
doc = QTextDocument(text)
doc.setDefaultFont(font)
doc.print_(printer)
app.exec_()
Nach dem Drucken muss das Programm "gekilled" werden, damit der Curor in der Eingabezeile der Python Shell wieder blinkt. Muss ich Qt irgendwie schließen, damit von selbst alles vollständig beendet wird?
Antworten