Aller Anfang ist schwer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@BlackJack: Ich meine bezüglich Pascal TP3 genutzt zu haben, bin mir da aber nicht mehr ganz sicher; und klar - Wirth ist nicht Borland.
@TomL: Das ist aber lässtig ...

:)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich hab in TP7 auch immer nur prozedural programmiert, in Visual Basic 6 sowieso und OOP kam erst in Python dazu. Allerdings ist das ja auch schon einige Jahre her.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
TomL
User
Beiträge: 9
Registriert: Donnerstag 7. März 2013, 08:46

Ich glaube ich hab's jetzt erstmal grundsätzlich gelöst (ohne Feinheiten).
Die zu druckende Datei muss ein Attribut haben (z.B. .txt) ohne gehts offenbar nicht.

Code: Alles auswählen

import win32api
import win32print
import os.path
#Drucken einer Textdatei
def prtf(*FN):
    if len(FN) == 0:
        filename=input("Bitte kompletten Pfad/Dateinamen eingeben: ")
    else:
        filename=os.path.join(FN[0])
    if os.path.isfile(filename):
        win32api.ShellExecute (
          0,
          "printto",
          filename,
          '"%s"' % win32print.GetDefaultPrinter (),
          ".",
          0
        )
        return(0)
    else:
        print("Datei ",filename," nicht gefunden")
        return(1)
if __name__ == '__main__':
    prtf()
Zuletzt geändert von Anonymous am Freitag 8. März 2013, 13:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@TomL: Die Parameterübergabe an die furchtbar kryptisch benannte Funktion ist eigenartig bis sinnlos. Wenn Du eine Liste übergeben bekommen willst, dann übergib eine Liste und benutze nicht die ``*``-Magie in der Funktionssignatur. Damit verbaut man sich Änderungen an der API und wenn die Benutzer eine Liste übergeben wollen, müssen sie auch beim Aufruf wieder ein ``*`` benutzen.

Allerdings benutzt Du dann immer nur das erste Element der Liste, da wird es dann sinnlos, es sei denn es muss eine Liste mit einer Liste als einzigem Argument übergeben werden. Jetzt bin ich verwirrt. Kann es sein, dass Du eigentlich so etwas hier schreiben wolltest:

Code: Alles auswählen

def print_file(path_components=None):
    if path_components is None:
        filename = input('...')
    else:
        filename = os.path.join(path_components)
    # ...
Wobei die Vermischung zwischen Programmlogik und Benutzerinteraktion nicht schön ist. Ebenso wie das unflexible behandeln von Fehlern und der Rückgabewert. Um solche speziellen Fehlercodes zu vermeiden wurden extra Ausnahmen erfunden. Falls `ShellExecute()` Ausnahmen auslösen sollte, würde ich auch den `isfile()`-Test rauswerfen.

``return`` ist keine Funktion, also sollte man sie auch nicht so schreiben als wäre es eine.

Eine Dateiendung braucht Windows damit es weiss welche Anwendung für das Drucken zuständig ist.
TomL
User
Beiträge: 9
Registriert: Donnerstag 7. März 2013, 08:46

Eigentlich wollte ich nur zeilenweise ein Protokoll drucken, wenn das nur über eine .txt Datei geht, auch gut aber etwas enttäuschend.
Das andere habe ich mir zu Herzen genommen, sprich methodische Hinweise. Inzwischen erlebe ich bei tkinter meine Stalingrade, die muss man wohl haben. wenn man eine neue Programmierwelt betritt.
BlackJack

@TomL: Drucker sind halt nicht mehr das was sie mal waren. In DOS-Zeiten hat man einfach eine der ``LPT1:``, ``LPT2:``, …, ``COM:``-Dateien geöffnet, je nach dem an welcher Schnittstelle der Drucker hing, und seinen Text, und manchmal auch EPSON-Escape-Sequenzen, dort rein geschrieben und das ging direkt an den Drucker. Heute verstehen einige Drucker ja nicht mal mehr ASCII-Text direkt und wollen von ihrem Windows-only-Treiber gerne mit irgendwelchen nicht standardisierten Grafikdaten gefüttert werden.

Wenn Du weisst, dass Dein Drucker die Daten so verarbeiten kann wie Du sie sendest, dann könntest Du auch direkt „rohe” Bytes an den Drucker schicken. Lies Dir das hier mal durch: http://timgolden.me.uk/python/win32_how_do_i/print.html
Antworten