Kennt sich jeman mit python aus...?

  • Ersteller Ersteller VincentJochum
  • Erstellt am Erstellt am
V

VincentJochum

Gast
Ich versuche mich schon seit einigen Tagen an SikuliX, weil es meines Wissens nach das einzige Programm dieser Art ist, mit einer "find" Funktion, die Ich für mein Vorhaben brauche.
Nun habe ich das Problem, dass ich nicht weiß wie ich es schaffe, dass das Programm solange nach etwas auf dem Bildschirm sucht, bis es dieses etwas dann Gefunden hat, und daraufhin mit dem Ausführen des Skripts fortführt.

Wenn ich "if find ("imageXYZ.png")" eingebe und es dann das image findet, führt es auch die Folge Befehle aus, doch wenn das image erst später erscheint, dann funktioniert es nicht. Das find "sucht" nur dann wenn es gerade ausgeführt wird, und nicht die ganze Zeit.

Ich habe erst einige andere Befehle, dann soll es solange warten, bis das ("imageXYZ.png") gefunden wurde und dann weiter machen...

Ist das mit python möglich und wenn ja wie...?

Ich hoffe ich habe es einigermaßen verständlich erklärt....Danke im Voraus für eure Hilfe! :)
 
könntest das Ganze mit einer while-(true)-Schleife umschließen.
Damit es nicht unendlich läuft, vllt einen Timer mit einem Timeout einführen, wenn es zeitlich begrenzt werden soll. Oder so 100ms Timeout vor dem nächsten Durchlauf, damit der Thread nicht die ganze Zeit vollgas gibt.

Das wäre eine allgemeine (und hässliche) Lösung. Ich habe keine Ahnung von Python, aber rein programmiertechnisch ist das eine logische Lösung.

Solltest du das machen und auf die Idee kommen mit i++ Abbruch nach 1000 Durchläufen, verwerfe das bitte wieder. Das ist Abhängig von dem System und kann zeitlich variieren, sodass man nicht abschätzen kann, ob das Script sich aus versehen schon beendet hat oder nicht. Baue alternativ einen Abbruch ein, der eindeutig ist.
 
auf die schnelle fällt mir nur eins ein:
Bei der rekursiven Programmierung ruft sich eine Prozedur, Funktion oder Methode in einem Computerprogramm selbst wieder auf

das soll deine Methode solange machen bis Bild x gefunden wird
 
VincentJochum schrieb:
Tut mir leid, bin noch ein Blutiger Anfänger...also das heißt dann genau was...? :O

Im Grunde ruft deine Methode sich selber auf, in Pseudocode würde das so aussehen:

methodeZumBilderSuchen(){ //tue was.. if (kein Bild gefunden oder andere sinnvolle Bedingung){ methodeZumBilderSuchen(); } }


so ganz grob :)
 
kann man nicht einfach statt einer if-Abfrage eine Schleife verwenden?

Code:
while (find("imageXYZ.png")==0)
{
    //pause
}
oder ähnlich.
 
Einfach einen timer erstellen, der beim Timeout sich wieder selbst start und nach dem Bild sucht.

Damit das Programm sich nicht einfach beendet, wartest du noch darauf, dass Eine Taste gedrückt wird.

ODER:
Einfach Eine while(true) schleife mit einer periodischen Überprüfung und ggf. einem Sleep. Strg+C oder "X" beendet das Programm ja auch.

Pille1002s Variante sucht nur solange nach dem Bild, bis es es einmal gefunden hat.
 
new Account() schrieb:
Einfach einen timer erstellen, der beim Timeout sich wieder selbst start und nach dem Bild sucht.

Damit das Programm sich nicht einfach beendet, wartest du noch darauf, dass Eine Taste gedrückt wird.

ODER:
Einfach Eine while(true) schleife mit einer periodischen Überprüfung und ggf. einem Sleep. Strg+C oder "X" beendet das Programm ja auch.

Pille1002s Variante sucht nur solange nach dem Bild, bis es es einmal gefunden hat.


Die Bedingung ist optional,, wenn keine dann wird immer "gesucht",,, so wie ich es verstand habe wird das Bild gefunden und es soll dann weiter gesucht werden (aber nach einem anderem Bild), daher auch geschrieben "oder andere sinnvolle Bedingung "
 
Je nachdem wie lange er das laufen lässt, bekommt man iwann ein Problem damit, dass der Stack immer größer wird ;)

(Generell bei frei laufender Rekursion. Auch, wenn es in bestimmten Anwendungen ausreichend funktionieren mag, würde ich sowas generell vermeiden)
 
Zuletzt bearbeitet:
@new Account() : das ist korrekt! Ohne die Bedingungen usw. zu kennen war das meiner Meinung nach die elegantest Lösung.
 
Um ehrlich zu sein, blick ich gar nichts
Pille1002 schrieb:
Im Grunde ruft deine Methode sich selber auf, in Pseudocode würde das so aussehen:

methodeZumBilderSuchen(){ //tue was.. if (kein Bild gefunden oder andere sinnvolle Bedingung){ methodeZumBilderSuchen(); } }


so ganz grob :)
Und wie soll ich dieses kein Bild gefunden schreiben?
 
VincentJochum schrieb:
Um ehrlich zu sein, blick ich gar nichts
Vielleicht solltest Du doch mal konkret (an einem nachvollziehbaren Beispiel)sagen, was Du genau machen willst und wozu? Möglicherweise haben wir hier ein XY-Problem.
 
While-True ist da wohl zu bevorzugen aus Gründen die @new Account() genannt hat.
Ist zumindest ein Konstrukt dass ich auch aus der Uni so kenne.

EDIT: Oh, hätte ich wohl mal aufs Datum geschaut vor dem Posten. Sorry :D:freak:
 
new Account() schrieb:
(Generell bei frei laufender Rekursion. Auch, wenn es in bestimmten Anwendungen ausreichend funktionieren mag, würde ich sowas generell vermeiden)
Generell sind solche generellen Aussagen immer unsinnig.
"Wir" Scheme-Programmierer nutzen exzessiv Rekursion ohne damit in Probleme zu laufen.
 
new Account() schrieb:
Ihr scheme Programmierer macht Aber keine Endlosrekursion, Oder?
Doch. Auch. Das ist schon allein der Tatsache geschuldet, dass Du bei vielen Funktionen beliebig viele Argumente übergeben kannst oder auch beliebig lange Listen.
 
beliebig lange (konkreter Wert) != unendlich

beliebig lange Listen/Argumente hast auch in den meisten anderen Programmiersprachen… und das hat nichts mit Endlosrekursion zu tun.
 
new Account() schrieb:
beliebig lange (konkreter Wert) != unendlich
Beliebig lange heißt aber u.a. auch unendlich.
Und es war ja auch nur ein Beispiel, weil Du gerade bei Scheme eben oft auf Funktionen triffst die beliebig viele Argumente erlauben. Das fängt schon bei einer einfachen Addition an. + erlaubt halt beliebig viele Argumente und nicht nur Zwei.
Darüberhinaus kannst Du aber auch tatsächlich unendlich lange Listen definieren. Zum Beispiel die Liste aller geraden Zahlen.

new Account() schrieb:
beliebig lange Listen/Argumente hast auch in den meisten anderen Programmiersprachen...
Und die werden da auch rekursiv verarbeitet? Das war schließlich der Punkt.

Und idiomatisch in Scheme wäre
while true { do_something }
tatsächlich folgendermaßen zum implemenieren:

Code:
(define (meine-endlosschleife)
  do-something
  (meine-endlosschleife)   ; Rekursiver Aufruf
)

; Aufruf:
(meine-endlosschleife)
 
new Account() schrieb:
Wahlweise, streng genommen sogar immer, da jedes Programm auf dem Stack basiert.
Ähm nein. Jetzt auch nicht zwei Sachen (rekursive Programmierung & Stack) vermischen. Die können zusammengehören, müssen aber nicht.
Wo hier gerade Python Thema des Threads ist, sei auf Stackless Python verwiesen.

new Account() schrieb:
Und wie oft hast du schon die Summe aller geraden Zahlen ausgerechnet?
Auch hier vermischst du wieder zwei Sachen die nicht zusammen gehören. Es ging gar nicht darum die Summe aller geraden Zahlen zu berechnen.
Es ging darum, dass es unter Scheme üblich ist, dass sehr viele Funktionen beliebig viele (potentiell auch unendlich viele) Parameter akzeptieren. Das Beispiel nannte ich die Addition, da es in anderen Sprachen meist traditionell als Operator oder Funktion definiert ist, die genau 2 Argumente kennt.

Das Du auch unendlich lange Listen definieren kannst ist ein weiteres Merkmal was durchaus auch benutzt wird. Und auch diese Definitionen sind i.d.R. rekursiv nach dem Schema, dass man das 1 Element definiert und dann induktiv das (n+1)-ste Element.
 
Zurück
Oben