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 ...
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...)
yipyip
Verfasst: Freitag 8. Mai 2009, 16:26
von yipyip
Ansonsten reicht einfach ein
ohne weitere File-Operationen.
Verfasst: Freitag 8. Mai 2009, 16:49
von numerix
Wie BlackJack schon sagte: Es kommt auf den richtigen Zeitpunkt an ...
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()