Drucken in wxPython

Plattformunabhängige GUIs mit wxWidgets.
Antworten
JackBauer
User
Beiträge: 9
Registriert: Mittwoch 21. Juni 2006, 14:16
Wohnort: Berlin
Kontaktdaten:

Hallo,

hab das Forum durchsucht und mittlerweile auch das Internet, aber ich verstehe das Drucken in wxPython immer noch nicht.

Text drucken ist ja kein Problem, aber ich muss praktisch ein bestimmtes Bild (mit wx.Dc erstellt) und damit verbundene Zahlen, irgendwie ausdrucken.

Alles zusammen ist auf einem Panel abgebildet, aber ich habe noch nicht herausgefunden, ob oder wie man Panels drucken kann.


Hoffe irgendjemand hat eine Antwort für mich! Bin bis jetzt durch alles in WX durchgestiegen, aber drucken scheint eine Unmöglichkeit zu sein :(


Danke im voraus!


MFG Bauer
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Hallo Jack,

Irrtum, Drucken ist mit wx sogar sehr angenehm zu machen, hab aber auch ein Weilchen gebraucht bis ich das verstanden habe.

Schaue folgenden Code:

Code: Alles auswählen

class CTSPrintout( wx.Printout ):    
    def __init__(self, text, header, flag):
        wx.Printout.__init__(self)
        self.text = text
        self.header = header
        #Erg-Log (0)/ CTS-Log (1)
        self.flag = flag  
        self.anz_pages = 1
        
    def make_lines(self):
        back_lines = []
        zeilen_list = string.split(self.text,"\n")
        counter = 0
        if (self.flag == 0): #Erg Log
            erg_lines = []
            for zeile in zeilen_list:
                data_list = []
                if not "Gesamtergebnis" in zeile:
                    temp_list = string.split(zeile, " ")
                    for temp in temp_list:
                        if (temp != ""):
                            data_list.append(temp)
                else:
                    data_list.append(string.lstrip(zeile))                
                if (data_list != []):
                    erg_lines.append(data_list)          
                    counter += 1
                    if (counter == 46):
                        self.anz_pages += 1
                        counter = 0
            if (counter != 0): self.anz_pages += 1
            for erg_line in erg_lines:
                temp = ""
                for eintrag in erg_line:
                    if ((eintrag == "Testergebnis:") or (eintrag == "Dauer:")):
                        back_lines.append(temp)
                        temp = ""
                        temp = string.ljust(temp,50)             
                    if "Gesamtergebnis:" in eintrag:
                        back_lines.append("")   
                    temp += eintrag + " "
                back_lines.append(temp)
        else: #CTS log
            for zeile in zeilen_list:
                zaehler = 0
                temp = ""
                for c in zeile:
                    if (zaehler < 80): temp += c
                    else:
                        back_lines.append(temp)
                        temp = str(c)
                        zaehler = -1
                        counter += 1
                        if (counter == 46):
                            self.anz_pages += 1
                            counter = 0
                    zaehler += 1
                back_lines.append(temp)    
                counter += 1
                if (counter == 46):
                    self.anz_pages += 1
                    counter = 0               
        return back_lines     
    
    def OnBeginDocument(self, startPage, endPage):
        pass       
    
    def OnPrintPage(self, page):
        lines = self.make_lines()                
        dc = self.GetDC()   
        if (self.flag == 0):
            #Erg Log 
            dc.StartDoc("CTS_ErgebnisLog")
        else:
            #CTS Log
            dc.StartDoc("CTS_Log")
        dc.StartPage()             
        #Header schreiben
        dc.DrawText(self.header , 100, 100)
        msg = "Seite 1 von " + str(self.anz_pages)
        dc.DrawText(msg, 100, 230)
        x = 450
        y = 600
        counter = 0
        page_count = 2
        for line in lines:            
            dc.DrawText(line, x, y)
            y += 130                
            counter += 1
            if (counter == 46):
                dc.EndPage()
                dc.StartPage()
                counter = 0
                dc.DrawText(self.header , 100, 100)
                msg = "Seite " + str(page_count) + " von " + str(self.anz_pages)
                dc.DrawText(msg, 100, 230)
                page_count += 1
                y = 600
        dc.EndDoc()            
        return True
        
Im vorliegenden Fall wird der Inhalt eines TextCtrl gedruckt, geht zwar besser, aber läuft. Wichtig zum Drucken in wx sind die Klassen Printer und Printout. Schau mal in die wx Demos (PrintFramework) und in die Dokumentation, hat mir auch sehr geholfen.

Über den DC kannst du ausgeben was du möchtest und den hast du ja. Also müsstest du nur noch diesen DC auf den Printer umleiten, sollte doch gehen...

Gruß,
Markus
JackBauer
User
Beiträge: 9
Registriert: Mittwoch 21. Juni 2006, 14:16
Wohnort: Berlin
Kontaktdaten:

Danke für die schnelle Antwort.

Ich habe mir Demo angeschaut, komme aber immer noch nicht weiter, denn wie schon erwähnt:

Ich will ja nicht nur Text drucken, sondern beides zusammen! Der Befehlt für Text ist "drawText", und der kriegt nen String übergeben, soweit bin ich jetzt auch schon. Aber in der Demo wird irgendwie ein Canvas übergeben mit dem Befehl "self.canvas.DoDrawing(dc, True)".
Das ganze liegt bei mir aber auf einem "dc=wx.PaintDC(self.panel)".
Ich hab versucht der Funktioin" DoDrwaing" direkt das "PaintDC" zu übergeben, das hat aber nicht funktioniert!


MFG Bauer
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

OK! Werde mich morgen nochmal eingehend damit beschäftigen...

Gruß,
Markus
Antworten