Ein mit Tkinter erstelltes Fenster speichern

Fragen zu Tkinter.
Gesperrt
lordmyder

Hallo,
ich habe diese Frage hier im Forum zwar schon gefunden, aber leider gab es dazu bis lang keine zufriedenstellende Antwort.
Deshalb frage ich hier nocheinmal:
Ist es möglich ein mit Tkinter erstelltes Fenster als Image abzuspeichern?

Ich kann zwar einen Screenshot machen, aber das Image enthält dann meinen kompletten Desktop, ich hätte gerne ein Bild in dem nur das Fenster abgebildet ist.

Danke schon mal im Voraus,
LordMyder
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

lordmyder hat geschrieben:Hallo,
ich habe diese Frage hier im Forum zwar schon gefunden, aber leider gab es dazu bis lang keine zufriedenstellende Antwort.
Was meinst du mit "zufriedenstellend"? Eine für dich positive?
Problem ist halt, dass es keine ganz und gar positive Antwort gibt.

Konkret: Tkinter bringt keine Möglichkeiten dafür mit, evtl. lässt sich mit PIL was machen, da bin ich mir nicht ganz sicher. Eine Alternative ist die Verwendung eines externen Programms, das aus dem Skript heraus aufgerufen wird.

Das funktioniert unter Windows z.B. mit Irfanview, das sich so konfigurieren lässt, dass nur das reine Tkinter-Fenster geknipst wird, falls gewünscht auch ohne Fensterdekoration.
lordmyder

Danke für deine Antwort.
Also ich bräuchte eine Python interne Lösung.

Hat irgendjemand eine Idee?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

lordmyder hat geschrieben:Danke für deine Antwort.
Also ich bräuchte eine Python interne Lösung.
Hat irgendjemand eine Idee?
Wenn ich dich richtig verstanden habe, hast du schon eine Lösung, bei der der gesamte Desktop aufgenommen wird. Falls ja: Poste doch mal diesen Teil aus deinem Code - vielleicht kann man daran was basteln.
lordmyder

Das ist der Code-Schnippsel, mit dem ich einen Screenshot mache.

Code: Alles auswählen

import ImageGrab 
img = ImageGrab.grab() 
img.save(r"screenshot.png") 
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Die Doku zu ImageGrab verrät mir, dass man der Methode grab eine bounding-box für einen Ausschnitt des Bildschirms als Parameter mitgeben kann: http://www.pythonware.com/library/pil/h ... gegrab.htm

Das sollte doch genügen. Du bestimmst die Position deines Toplevel-Windows auf dem Bildschirm und nimmst nur diesen Ausschnitt.

Laut Doku funktioniert ImageGrab derzeit nur für Windows, so dass ich es selbst nicht testen kann.
abgdf

Unter Linux kann "ksnapshot" auch einzelne Fenster speichern.

Es ginge z.B. auch mit ImageMagick

http://tips.webdesign10.com/how-to-take ... untu-linux

Es ist nicht nachvollziehbar, warum eine python-interne Lösung benötigt werden sollte.

Gruß
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

abgdf hat geschrieben:Es ist nicht nachvollziehbar, warum eine python-interne Lösung benötigt werden sollte.
Warum nicht? Vielleicht möchte der OP sein Programm veröffentlichen und sich nicht von externen Programmen abhängig machen? Vielleicht sogar vermarkten.

Wenn es eine Python-interne Lösung für ein Problem gibt, würde ich die in der Regel auch vorziehen.

Zum Thema Linux: Es geht ja darum, aus dem Skript heraus den Screenshot zu erzeugen und nicht ein Programm aufzurufen, das dann wiederum bedient werden muss, um den Screenshot zu bekommen.

Mit knapshot ist das nur über DCOP möglich, mit ImageMagick ist es zum einen nicht so einfach gezielt nur ein Fenster zu knipsen und zum anderen lässt sich IMHO das Piepsen bei Beginn und Ende des Prozesses nicht abstellen.

Und in beiden Fällen gilt: Der Anwender braucht zusätzlich diese Programme.
lordmyder

Hey,
danke Numerix für deine Antworten. Ich habe darauf basierend eine Lösung entwickelt. Funktioniert auch sehr gut.
Zuletzt geändert von lordmyder am Dienstag 18. November 2008, 17:22, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

lordmyder hat geschrieben:Es stört mich ungemein, dass immer wenn ich irgendwas frage irgendwelche dummen Antworten kommen wie hier von abgdf.

Wenn ich eine interne Lösung suche, dann hat das seinen Grund.
Ich finde es total nervig, dass man sich immer rechtfertigen muss wenn man irgendwas spezielles sucht.
Hat mich auch schon gelegentlich genervt, sehe ich aber nicht nur negativ: Manchmal ist eine vermeintlich "dumme Antwort" vielleicht auch nur deshalb dumm, weil der, der sie als dumm empfindet nicht versteht, warum sie nicht dumm ist. Anders gesagt: Es soll ja vorkommen, dass andere in einem bestimmten Bereich einen Wissensvorsprung haben oder eine Idee, die man selbst nicht hatte und in deren Ermangelung man meint, einen bestimmten Weg gehen zu müssen, den man vielleicht aber gar nicht gehen muss, es bloß nicht besser wusste.

Und: Angesichts dessen, dass man in aller Regel auf so ziemlich alle Fragen rund um Python in diesem Forum sehr schnell und sehr kompetent geantwortet bekommt, kann man solche Dinge vielleicht einfach in Kauf nehmen und wegstecken.
abgdf

Es stört mich ungemein, dass immer wenn ich irgendwas frage irgendwelche dummen Antworten kommen wie hier von abgdf.
Ich finde es halt sehr unhöflich, wenn man etwas Bestimmtes fordert, aber nicht sagt, warum, so nach dem Motto "das braucht ihr nicht zu wissen".

Das kannst Du vielleicht mit Deinen Angestellten machen, aber nicht mit freiwilligen Helfern.

Gruß
lunar

lordmyder hat geschrieben:Eins möchte ich gerne noch los werden:
Es stört mich ungemein, dass immer wenn ich irgendwas frage irgendwelche dummen Antworten kommen wie hier von abgdf.
Zum einen hättest du den Grund nennen können, warum du eine interne Lösung benötigst, zum anderen konnte abgdf nicht wissen, dass du nur eine Windows-Lösung benötigst. Da PIL aber nur unter Windows arbeitet, hat er dir Alternativen genannt, die auch unter Linux tun.

Insofern war abgdfs Posting vielleicht nicht direkt zielführend, aber es als dumm zu bezeichnen, ist ... dumm ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Insofern war abgdfs Posting vielleicht nicht direkt zielführend, aber es als dumm zu bezeichnen, ist ... dumm ;)
Bin auch der Meinung, aber habe lordmyders Account auf dessen eigenen Wunsch gelöscht. Soll sich jeder das seine denken und für sich behalten. Mache den Thread nun zu, da die Diskussion wohl hiermit zu keinem konstruktivem Ziel führen wird.

Ich denke ich spreche für das ganze Moderatorenteam wenn ich konstruktive, aber "nicht 100% zum Thema passende" Antworten wie die von abgdf durchaus auch gutheiße. Meine Erfahrung war, dass es oft sinnvoll ist, auch noch andere Tipps und Lösungvorschläge zumindest einmal anzuhören: oft wurde eben auf diesem Wege eine bessere Lösung gefunden, als auf dem Weg der vom Threadstarter bedacht wurde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gesperrt