Seite 1 von 1

postscript() erstellt "leere" Datei

Verfasst: Montag 4. Mai 2009, 18:27
von HannesKlarner
Noch eine kurze Frage zu der Methode postscript(), mit der ich einen Schnappschuß des canvas speichern möchte.

so sieht der Code aus:

Code: Alles auswählen

p = app.CAN.postscript(file = "chart_from_method.ps")
f = open("chart.ps", "wb")
f.write(p)
f.close()
Das Canvas ist gefüllt mit Linien und Text, aber beiden Dateien sehen, wenn man sie öffnet aus, wie 1x1 weiße pixl Dateien.

Fällt euch was dazu ein?

Grüße,
Hannes.

Verfasst: Montag 4. Mai 2009, 19:04
von BlackJack
@HannesKlarner: Du musst es zum richtigen Zeitpunkt aufrufen, also erst dann, wenn die Grafik auch wirklich komplett gezeichnet ist und angezeigt wird.

Verfasst: Freitag 8. Mai 2009, 15:33
von 4bit
irgendwelche anderen Vorschläfe? postscript() erzeugt bei mir einfach eine leere ps Datei.

Verfasst: Freitag 8. Mai 2009, 15:55
von numerix
4bit hat geschrieben:Vorschläfe?
Falls du Vorschläge meinst: Der von BlackJack ist schon der richtige ... :wink:

Verfasst: Freitag 8. Mai 2009, 16:04
von 4bit
Ich rufe postscript() erst ganz zum Schluß auf, trotzdem entsteht eine "leere" Datei.

Hat jemand andere Erfahrungen gemacht?

Grüße,
4bit.

Verfasst: Freitag 8. Mai 2009, 16:12
von 4bit
Ah, jetzt gehts. Man muß height und width mit angeben. Dachte die Angaben wären nur wichtig, wenn man einen Teilbereich auswählen möchte.

Verfasst: Freitag 8. Mai 2009, 16:21
von yipyip
Also bei mir funktionierts, wenn ich
das 'file'-Argument *nicht* angebe,
erst dann wird der Postscript-String
in meiner Variablen 'pic' gespeichert.
So steht es auch in
http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M60

Code: Alles auswählen

#!/usr/bin/env python

from __future__ import with_statement

####

import Tkinter as tk

####
  
class Gui(object):


  def __init__(self, width=400, height=400):

    self.root = tk.Tk()
    self.canvas = tk.Canvas(self.root, width=width, height=height, bg='white',
                            highlightthickness=None)
        
    self.canvas.pack(fill=tk.BOTH, expand=True)
    self.button = tk.Button(self.root, text='Print', command=self.print_out)
    self.button.pack()

    self.item1 = self.canvas.create_rectangle(33, 33, 99, 99, fill='red')
    self.canvas.itemconfig(self.item1, tags=('a', 'x', 't42'))

    self.item2 = self.canvas.create_rectangle(222, 222, 333, 333, fill='yellow')
    self.canvas.itemconfig(self.item2, tags=('b', 'x', 't42'))
    

  def print_out(self):

    pic = self.canvas.postscript()
    #print pic
    with open('canvas.ps', 'w') as fp:
      fp.write(pic)

     
  def run(self):

    self.root.mainloop()

####

if __name__ == '__main__':

  Gui().run()
  
(Hatte das auch noch nie ausprobiert...)

:wink:
yipyip

Verfasst: Freitag 8. Mai 2009, 16:26
von yipyip
Ansonsten reicht einfach ein

Code: Alles auswählen

self.canvas.postscript(file='c3.ps')

ohne weitere File-Operationen.

Verfasst: Freitag 8. Mai 2009, 16:49
von numerix
Wie BlackJack schon sagte: Es kommt auf den richtigen Zeitpunkt an ... :wink:

So funktioniert das einwandfrei:

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
canv = tk.Canvas(root, width=200, height=200)
canv.create_line(10,10,190,190)
canv.pack()
tk.Button(root, text="Postscript", command=lambda :canv.postscript(file="canv.ps")).pack()
root.mainloop()