Screenshots erstellen mit ImageGrab

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
unix
User
Beiträge: 16
Registriert: Dienstag 20. Januar 2009, 16:22

Hallo,

eine Funktion von mir soll immer aufgerufen werden um Screenshots zu erstellen.
Mein Code dazu sieht wie folgt aus:

Code: Alles auswählen

import ImageGrab 
def screenshot(language, title):
    img = ImageGrab.grab()
    #filename = "C:\screenshot.png"
    filename = "C:\PA_" + language + "_" + title + ".png"
    img.save(filename) 
Das Problem dabei für mich ist, dass der Screenshot vom gesamten Screen aufgenommen wird. Ich würde es hingegen wollen, dass nur von der entsprechende Applikation ein Screenshot erstellt wird.
Wie kann ich dies am besten realisieren?

Ein anderes Problem das ich habe, ist, dass ich gerne ein bestimmtes Programm beenden würde. Dazu soll eine Funktion aufgerufen werden die überprüft ob das Spiel Tetris.exe läuft (Taskmanager?) und dieses beenden. Wie kann ich dies am besten realisieren?

Die Lösung soll für Windows funktionieren.

Grüße,
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wenn ich den Code (PIL-Version 1.1.6) richtig verstehe, geht das nicht. Du kannst allenfalls das Gebiet vorgeben, wo der Screenshot erfolgen soll. Default ist eben der ganze Bildschirm. Bei einer selbstgeschriebenen Applikation ist das kein Problem (Du weißt ja, wo der Frame sitzt, von dem der Screenshot erfolgen soll ;-) ). Ansonsten: Keine Ahnung, ob es da Windows-Tricks gibt - sonst jemand?

HTH
Christian

PS Wäre schön, wenn Du das nächste Mal sagst, welche Pakete Du nutzt: Nicht jeder weiß auf Anhieb, daß ImageGrab aus PIL stammt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Warum zum Teufel nennst du dich unix aber suchst nach einer Windows Lösung? Den Prozess und dessen Fenster kannst du mit der Win32 API finden. Ansprechen kannst du diese mit ctypes. Beispiele dazu findest du hier im Forum. Zum Fenster finden gibt es in der win32 api FindWindowEx. Dessen Grösse/Position kannst du mit GetWindowRect finden. Zum Prozesse auflisten findest du hier ein Snippet: http://code.activestate.com/recipes/576362/.

- Jonas
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

unix hat geschrieben:Das Problem dabei für mich ist, dass der Screenshot vom gesamten Screen aufgenommen wird. Ich würde es hingegen wollen, dass nur von der entsprechende Applikation ein Screenshot erstellt wird.
Wie kann ich dies am besten realisieren?
Du könntest mal einen Blick auf bzw. in das Modul frog werfen. Dort gibt es eine Methode snapshot, die u.a. eine Variante unter Verwendung von ImageGrab enthält, um auch Teile des Bildschirms zu knipsen. Im Grunde ist das aber nichts anderes als CM schon gesagt hat.
unix
User
Beiträge: 16
Registriert: Dienstag 20. Januar 2009, 16:22

Danke für eure Vorschläge.
Frog kommt wohl nicht in Frage, da ich dies für dieses Projekt nicht installieren darf.

Der Screenshot muss nicht unbedingt nur von der Applikation sein, es reicht auch, wenn ein Screenshot von einem bestimmten Bereich (beispielsweise Mitte des Bildschirms mit der Größe 800x600 - alles was sich außerhalb befindet (quasi ein Viereck in einem Viereck), soll nicht mit auf dem Screenshot sein) gemacht wird.
Du kannst allenfalls das Gebiet vorgeben, wo der Screenshot erfolgen soll.
Die Lösung mit bbox erzielt den gewünschten Effekt, Danke. :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

unix hat geschrieben:Frog kommt wohl nicht in Frage, da ich dies für dieses Projekt nicht installieren darf.
Es ging ja auch nicht darum es zu nutzen sondern nachzuschauen wie es implementiert ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten