2017-05-07 2 views
1

ich eine Leinwand in $gw.sw.sf.frame.c geschaffen habe, wo $gw ist ein Fenster der oberste Ebene sw und sf ist ein ScrolledWindow und ein ScrollableFrame aus dem BWidget Paket und c ist die Leinwand (tk::canvas). In der Leinwand sind nur Text und Rechtecke mit einer Farbe gefüllt. Ich kann eine korrekte eps-Datei von der Leinwand erzeugen mit:TclTk zu bekommen Bild von der Leinwand

$can postscript -colormode color -file test.eps 

Allerdings, wenn ich ::canvas::snap $can zu verwenden, um versucht, ein Bild zu bekommen und dann in der Lage sein, eine PNG/BMP/TIFF/JPEG-Bilddatei speichern mit das Img Paket bekomme ich folgende Fehlermeldung:

Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?) 
Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?) 
    while executing 
    "image create photo -data $can" 
     (procedure "::mTKs::savegraphres" line 3) 
     invoked from within 
    "::mTKs::savegraphres .graphresults1494146100.sw.sf.frame.c" 
     (menu invoke) 

so sind die Fragen:

  1. gibt es eine Möglichkeit, dies zu beheben, so kann ich :: Leinwand :: Snap ein d dann Img um die Bilddateien zu erzeugen?

  2. Wenn nicht, gibt es eine Möglichkeit, die EPS-Datei mit nur TclTk-Code in eine Bilddatei zu konvertieren? Ich weiß, dass ich zu diesem Zweck Ghostscript oder ImageMagic verwenden kann, aber ich möchte, dass mein Programm nur TclTk verwendet.

  3. Jeder andere Weg, um das Bild von der Leinwand zu bekommen ??

Nur für den Fall: Ich bin mit OS 10.12.4 TclTk 8.6 Img 1.4.6 Tklib 0,6 und BWidget 1.9.10

NEUE ZAHLEN

fand ich, dass das Problem mit dem Betriebssystem ist X-Version. Bei meiner Arbeit verwende ich 10.10.4 und hier ist der Code in der Lage, die Figur zu erstellen, aber nach dem Erstellen der Figur wird der Leinwandinhalt vollständig weiß. Ich denke, dass canvas :: snap die Stapelreihenfolge innerhalb des Fensters ändert, was zu einer scheinbar leeren Leinwand führt, ist das korrekt?

Außerdem habe ich den Rat von Donal Fellows genommen und die Leinwand direkt in .topelevelwindow.canvas erstellt und mit 10.10.4 canvas :: snap und Img das korrekte Bild erzeugt und der Fensterinhalt wird nicht verändert. Mit 10.12.4 habe ich den gleichen Fehler wie zuvor. Irgendeine Arbeit um diese?

Antwort

0

Sie verwenden den Mechanismus, der als Teil des Img-Pakets unterstützt wird (manchmal auch tkimg genannt, um es zu unterscheiden). Die Fehlermeldung lautete:

Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?)

Das Problem ist, dass die Umwandlung von einer Leinwand zu einem Bild, indem Sie ein Bildschirm-Schnappen der Leinwand durchgeführt wird (das heißt, es ist genau die gleiche zugrunde liegende API, die jeder Bildschirmmechanismus verwendet), die anscheinend fehlgeschlagen ist. Der wahrscheinlichste Grund für den Fehler ist, dass die Arbeitsfläche zum Zeitpunkt der Erfassung nicht auf dem Bildschirm angezeigt wurde. Es muss auf dem Bildschirm und oben für die Erfassung zu arbeiten sein.

Damit eine Arbeitsfläche auf dem Bildschirm angezeigt wird, muss sie von einem Geometrie-Manager in einer übergeordneten Ebene, die selbst zugeordnet ist, entsprechend verwaltet werden. Es muss dann an den Anfang des Stapels von Fenstern, sowohl innerhalb der Toplevel und der Toplevel relativ zum Rest des Bildschirms Inhalte erhöht werden.Oft können Sie tun, mit:

pack $thecanvas; # Or “grid $thecanvas” or any of a number of other alternatives 
update 
raise $thecanvas 
raise -force [winfo toplevel $thecanvas] 
update 
# Do the capture here 

aber in Ihrem Fall es in einem komplexen Stapel von Widgets ist so diejenigen ein Problem sein könnten. (Zum Beispiel könnten sie die Leinwand auf dem Bildschirm abbilden oder so ähnlich. Alle möglichen Arten von Komplexität sind möglich!) Wenn das der Fall ist, erzeuge den Inhalt in einer anderen Leinwand (die nur für einen Moment geöffnet sein muss)) könnte ein Workaround sein. Ich weiß nicht, ob diese Leinwand auf dem Bildschirm sichtbar sein muss, obwohl ich es vermute.


Im Allgemeinen, wenn Sie wirklich eine Menge Umbauten wie dies zu tun, ist es wahrscheinlich besser, das Encapsulated Postscript zu einem Bild zu konvertieren, sondern direkt über Screen-Capture (wie immer ein bisschen flockig und unsicher). Das übliche Werkzeug dafür ist Ghostscript, oft in der ImageMagick-Suite, da es diese Konvertierungen ausführen kann, ohne auf den Bildschirm des Benutzers zugreifen zu müssen.

+0

Die Leinwand wird oben angezeigt, als ich versuchte, das Bild zu erzeugen und im Prinzip :: canvas :: snap kümmert sich darum, das Fenster mit der Leinwand nach oben zu heben. Das Problem liegt wahrscheinlich darin, dass Sie den komplexen Stapel von Widgets erwähnen, den ich verwende. Ich werde es mit einer einfachen Leinwand versuchen. Aus Ihrer Antwort sollte ich verstehen, dass es kein natives TclTk-Paket gibt, um von eps in ein anderes Bildformat zu konvertieren? – kbr85