postscript() erstellt "leere" Datei

Fragen zu Tkinter.
Antworten
HannesKlarner
User
Beiträge: 7
Registriert: Montag 4. Mai 2009, 11:16
Wohnort: Berlin

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.
BlackJack

@HannesKlarner: Du musst es zum richtigen Zeitpunkt aufrufen, also erst dann, wenn die Grafik auch wirklich komplett gezeichnet ist und angezeigt wird.
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

irgendwelche anderen Vorschläfe? postscript() erzeugt bei mir einfach eine leere ps Datei.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

4bit hat geschrieben:Vorschläfe?
Falls du Vorschläge meinst: Der von BlackJack ist schon der richtige ... :wink:
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

Ich rufe postscript() erst ganz zum Schluß auf, trotzdem entsteht eine "leere" Datei.

Hat jemand andere Erfahrungen gemacht?

Grüße,
4bit.
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Ansonsten reicht einfach ein

Code: Alles auswählen

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

ohne weitere File-Operationen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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()
Antworten