viele Screenshots hintereinander

Herakles

Profifragensteller
Moin allesamt!

Folgende Problemstellung: ich möchte mit ksnapshot scrrenshots machen, und zwar von immer demselben Programm, in dem ich allerdings nach jedem Screenshot ein neues Bild laden muss.

Ich mache also folgendes:

Programm datei laden
ksnapshot in den Vordergrund holen
Snapshot anklicken
Programmfenster anklicken
ksnapshot "save as"
save

und das in Endlosschleife. Das geht doch sicherlich einfacher mit einem Script, oder? Wo fange ich an, gibt es google-Suchtipps von Euch? Muss ich ein eigenes Programm schreiben, in dem Ksnapshot und mein (im Quellcode vorliegendes) Programm verankert werden?

Jede Idee ist sehr willkommen. Vor allem die rechte Klick-Hand wird es Euch danken ... entschuldigung... wie Sau!

Herakles mit klickverkrampfter Hand
 
mhm aktionen in grafischen programmen zu scripten ist schwehr. aber es gab dazu mal was auf www.kde-apps.org
dass war da um programme zu testen, indem man immerwieder die selben sachen ausführen lässt.... weiß nicht mehr wi es heißt.
ansonsten könntest du gucken ob ksnapshot per dcop ansprechen kannst und so dass verhalten "fernkontrollieren".
vielleicht bist da aber auch schneller wenn du dir die ksnapshot sourcen ziehst und per hand zu dem frickelst was du brauchst...
 
Eine Variante ist, auf die PRINT Taste den 'Screenshot vom aktuellen Fenster' Befehl zu legen. (coole Formulierung) ;) Zu finden unter kcontrol->Keyboard->Actions (o.ae.), hab grad kein KDE zur Hand. Danach sollte nur noch der Dateiname abgefragt werden.

Ne andere Variante ist, n Script, das einen Screenshot vom Fenster macht und direkt in Format XYZ umwandelt. Da brauchst dann nur 1x ins Fenster klicken.

HTH
 
oehm...

muss es unbedingt ksnapshot sein, mit dem du den screenshot machst?

installier dir mal imagemagick.

und dann guck dir mal die manpage zu import an.

um den ganzen screen zu shotten bietet sich imho dann folgendes bash-skript an:
Code:
% for I in `seq -w 1 1000` ; do import -window root $I.png ; sleep 10 ; done

dann haettest du jeweils 10 sekunden zeit um einen shot zu machen.
statt sleep 10 kannst du auch ein anderes proggie einbauen, das wartet.
zum beispiel cat >/dev/null.
 
Sämtliche KDE-Anwendungen haben ein Scripting-Backend namens DCOP. Mittels kdcop(1) kannst du sämtliche DCOP-Schnittstellen aller laufenden KDE-Programme herausfinden. Da siehst du beispielsweise, daß du mit dcop ksnapshot-915 interface "slotGrab()" (statt 915 bitte die bei dir passende PID einsetzen) einen neuen Screenshot erstellen und ihn über die Methode bool save(QString filename) abspeichern kannst. Das kann man sehr schön in ein Shell-Skript verpacken, das die PID automatisch ermittelt und die Ausgabedateien durchnummeriert.

Den oben erwähnten Kommander brauchst du im Prinzip nur, wenn du zu deinem Shell-Skript ohne großen Aufwand noch eine graphische Benutzeroberfläche erstellen willst. Für interaktive Sachen verwende ich ihn auch sehr gerne, aber ich denke, du kommst in deinem Falle auch ohne aus.
 
0815Chaot schrieb:
bool save(QString filename)
Ohne das jetzt spezifisch auf KDE zu muenzen; aber wer kommt auf die
(&*!@#(*!@ Idee ein 'save' return mit bool zurueckzuliefern.

Fehlermeldung? "It didnt work out"? Hallo errno und co?

*SEUFZ!*
 
Gibt es in C keine Exceptions? Ich hätte bei soetwas void gemacht und für Fehler Exceptions verwendet.

Ist jetzt vielleicht ein bisschen zu Off-Topic, aber ich würd's wirklich gerne wissen.
 
[LoN]Kamikaze schrieb:
Gibt es in C keine Exceptions?
Nein, Exceptions gibt es erst in C++. Das allerdings ist wieder OT (= On Topic :p), denn KDE wird in C++ programmiert... Trotzdem bringt das überhaupt nichts, denn DCOP ist ein Skripting-Interface und zur Nutzung z.B. aus einem Shell-Skript heraus gedacht. Da ist nix mit Exception-Handling.

double-p schrieb:
Fehlermeldung? "It didnt work out"? Hallo errno und co?
Wo ist denn das Problem? KSnapshot liefert doch einen schönen Fehlerdialog, wenn es save() nicht ausführen kann. Der Aufrufer muß nur noch wissen, ob die Sache gutgegangen ist oder nicht. Eventuell wird auch über $? was errno(2)-Kompatibles zurückgeliefert, weiß ich jetzt nicht, müßte ich nachgucken/ausprobieren, habe ich jetzt aber keine Zeit zu. Im Zweifel wird halt einfach 0 bzw. 1 als Boolescher Platzhalter für $? geliefert.

Im Prinzip verstehe ich sowieso nicht, warum hier wieder wegen so einer Lapalie eine Nebendiskussion aufgemacht und über guten Programmierstil und Exception-Handlung philosophiert wird - vor allem, da es um ein Interface geht, das vor allem zur Verwendung in Shell-Skripten entwickelt wurde. Das hat nun wirklich nichts mehr mit der Frage des OPs zu tun. Seufzer zurück!
 
0815Chaot schrieb:
Im Prinzip verstehe ich sowieso nicht, warum hier wieder wegen so einer Lapalie eine Nebendiskussion aufgemacht und über guten Programmierstil und Exception-Handlung philosophiert wird - vor allem, da es um ein Interface geht, das vor allem zur Verwendung in Shell-Skripten entwickelt wurde. Das hat nun wirklich nichts mehr mit der Frage des OPs zu tun. Seufzer zurück!

Weil Fehlerbehandlung so ziemlich das wichtigste ist, dass man in Software
erwarten sollte?
Ich generalisier es heute abend nicht in nem neuen Thread
 
double-p schrieb:
Weil Fehlerbehandlung so ziemlich das wichtigste ist, dass man in Software erwarten sollte?
Dem hat in diesem Thread auch keiner widersprochen. Warum diese Diskussion allerdings unpassenderweise gerade in diesem Thread stattfinden muß, leuchtet mir immer noch nicht ein.

double-p schrieb:
Ich generalisier es heute abend nicht in nem neuen Thread
Dann mach's halt morgen oder sonst wann. Oder konntest du es bis dahin wirklich nicht mehr "einhalten"?

Zum Topic, vielleicht interessiert es den OP ja: Den Rückgabewert (hier: true/false) liefert DCOP nur auf stdout. $? ist nur dann ungleich 0, wenn beispielsweise ein ungültiges Objekt o.ä. ausgewählt wird. Um Fehler, welche die DCOP-Anwendung selbst zurückliefert, zu verarbeiten, benötigt man also beispielsweise:
Code:
if [ $(dcop ksnapshot-2459 interface save file:///gibt/es/nicht.png | grep "^false$") ]
   then echo 'Fehler!'
fi
 
nochmal...

warum kde snapshot?

was spricht gegen imagemagick?

mit "xwininfo" bekommst du die id deines proggies.
mit "import -window 0xe0004 bla.jpg" macht der einen shot davon.
mit "for I in `seq -w 1 1000` ; do import -window 0xe00004 $I.jpg ; sleep 10 ; done" macht der 1000 davon.
 
Naja, wenn diese andere Anwendung, die die Bilder anzeigen soll, ebenfalls ein KDE-Programm ist (das ist allerdings nur Spekulation), dann kommt man zwecks Automatisierung ohnehin nicht um DCOP herum.

Im Übrigen kann man auch mit xwd -name Window-Name derartige Screenshots machen. xwd(1) ist schon in der X-Standard-Distribution enthalten.

Alles Geschmackssache.
 
soul_rebel schrieb:
Zitat von Bertholt Brecht
Was ist ein Einbruch in eine Bank, gegen die Gründung einer Bank?

Du schreibst seit Monaten in deiner Signatur den Vornamen von Brecht falsch: Gebürtig heißt er Eugen Berthold Friedrich Brecht, und er nannte sich erst später im Laufe seines künstlerischen Schaffens Bertolt Brecht (also ohne h in seinem Vornamen) oder einfach Bert Brecht.

:belehren: :D :D :D

Ist ja letztlich so latte wie'n umgefallener Sack Reis in China. Wollt's nur erbsenzählermäßig mal erwähnt haben.:p
 
xwd wurde ja zuvor auch schon von Mr.Fixit erwähnt und ich habe gestern mal einen kleinen Blick in die Manpage geworfen. Scheint mir das zu bieten, was meinen Vorstellungen entspricht. So wie ich das jedoch derzeit sehe, komme ich um das Geklicke bei der zweiten Anwendung nicht herum. Es handelt sich im übrigen nicht um ein KDE-spezifisches Programm, sondern ein simples Darstellungsprogramm von .stl-Files, falls die jemand kennt. Wichtig ist nur, dass es eine grafische Visualisierung von irgendwas ist, eben eine X-Anwendung, nicht KDE-spezifisch.

Abermals vielen Dank für die vielen Tipps hier. Sobald ich wieder Screenshots machen muss, solte ich nun wissen, wie ich vorgehe...

Herakles
 
Vollkommen OT:
quantumleeks schrieb:
Du schreibst seit Monaten in deiner Signatur den Vornamen von Brecht falsch: Gebürtig heißt er Eugen Berthold Friedrich Brecht, und er nannte sich erst später im Laufe seines künstlerischen Schaffens Bertolt Brecht (also ohne h in seinem Vornamen) oder einfach Bert Brecht.

Wenn das fehlende 'h' in seinem Namen die einzige Änderung war, dann hast du Bertold aber auch falsch geschrieben. ;)
 
Mal wieder kurz aufgenommen die Diskussion: gibt es nicht einfach einen Makro-Rekorder? Ein Programm, das die Position des Mauszeigers aufnimmt und diese anschliessend abspielt? Das wäre doch das Einfachste...

Herakles
 
Du hast soeben einen Eindruck bekommen, warum GUIs nicht das Maß aller Dinge sind. :D

Kann deine Anwendung denn von der Kommandozeile aus eine Datei oeffnen und anzeigen? Dann koenntest du das ganz skrupellos scripten.

forall STLs
oeffne stl
warte 20s
xwd -name foo > bar.xwd
killall ANWENDUNG
warte 10s
done
 
Zurück
Oben