Seite 1 von 2
PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 19:01
von Neo_Junior
also ich habe eine GUI mit pythoncard erstellt, sie enthält 24 "images" mit name Bild1-23 und die sollen alle erstmal das selbe bild zeigen also
so nun wäre is naturlich einfach schön, eine for schleife zu machen:
Code: Alles auswählen
for bild in range(1,24):
foto=str(bild)
self.components.Bild%s.file='Foto.jpg' % (foto)
das wäre einfach schön anzusehen meine Frage:
warum geht das nicht?
Fehlermeldung:
self.components.Bild%s.file='Foto.jpg' % (foto)
SyntaxError: can't assign to operator
Script terminated.
warum???
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 19:03
von Dav1d
Das ist kein String, % funktioniert nur auf Strings, das einfachste wäre, wenn du alle Bilder in einer Liste oder einem Dictionary speichern würdest, dann kannst du direkt über diese iterieren.
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 19:05
von Neo_Junior
was ist es dann? ich hab ma was von %d gelesn gibt es einen buchstabe, der passt?
und wenn nicht, gibt es schon eine liste mit allen components von pythoncard?
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 19:23
von BlackJack
@Neo_Junior: Verstehst Du warum der Fehler hier kommt?
Code: Alles auswählen
In [183]: a + b = c + d
------------------------------------------------------------
File "<ipython console>", line 1
SyntaxError: can't assign to operator (<ipython console>, line 1)
Wenn Du das verstehst, dann müsstest Du auch verstehen warum Du ihn bekommst wenn Du das mit dem ``%``-Operator versuchst. Auf der linken Seite der Zuweisung muss halt auch etwas stehen dem man etwas zuweisen kann.
Bei Dir steht da ``self.components.Bild % s.file``. Selbst das, ohne die Zuweisung, könnte nur funktionieren wenn 1. `self.components.Bild` existiert, das Objekt 2. den ``%``-Operator überlädt, 3. `s` existiert, und 4. ein `file`-Attribut hat, und 5. dieses dann noch als anderes Argument vom ersten Objekt für die ``%``-Operation akzeptiert wird.
Auf der rechten Seite der Zuweisung fehlt dann ganz offensichtlich in der Zeichenkette 'Foto.jpg' ein Platzhalter um `foto` dort hinein zu formatieren.
Du suchst die `setattr()`-Funktion.
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 19:29
von Neo_Junior
äh außer ein bissl was in der mitte hab ich das glaub ich verstanden
-es existiert ein self.components.Bild1-23 objekt und die ham ein file attribut nämlich is das das bild, was sie anzeigen
-ich glaube zwar es liegt wirklich wie Dav1d sagte an dem %s aber wie setzt man setattr() denn ein? könntest du das demonstrieren?
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 21:03
von darktrym
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 21:11
von Neo_Junior
ok verstanden das brauch ich aber nich, da es das ja alles schon gibt....
gibt es schon eine aufrufbare liste mit allen components in pythoncard oder muss ich da alle bilder einzeln einfügen(was ja schonma 23 zeile code braucht und nich so schön ist)?
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 21:50
von Neo_Junior
und bevor ichs vergesse gleich noch eins:
es sollte ein einfaches memory werden nun muss ich ja auf klicks achten und die dann behandeln aber ich müüste den kompletten code 23-mal schreiben, wenn ich das immer unter def_on_Bild1_mouseClick() mache gibts da was zum sameln oder kann man da ne klasse oder gruppe leicht erstellen???
Re: PythonCard Schleife
Verfasst: Montag 31. Oktober 2011, 21:53
von BlackJack
@Neo_Junior: Was genau spricht jetzt noch mal gegen `setattr()`?
Re: PythonCard Schleife
Verfasst: Dienstag 1. November 2011, 15:04
von Neo_Junior
na die ganzen objekte und attribute hab ich mir ja nicht ausgedacht, die sind schon da und die muss ich deshalb mit dieser funktion nicht erst erstellen oder hab ich da was missverstanden?
Re: PythonCard Schleife
Verfasst: Dienstag 1. November 2011, 15:21
von BlackJack
@Neo_Junior: Du willst ein Attribut setzen. Deswegen dachte ich an `setattr()`. Jetzt sehe ich gerade, dass das Attribut was Du setzen willst, gar nicht das mit dem "dynamischen" Namen ist. Also ist `getattr()` die Funktion die Du suchst, weil Du ja ein Attribut mit einem dynamischen Namen abfragen willst. Um auf dem dann das Attribut zu setzen.
Was die Klicks angeht: Wenn Du den Bildern auch irgendwie per Code einen Klickhandler verpassen kannst, brauchst Du natürlich nicht so viele `on_*_mouseClick()` schreiben. Was auch ziemlich unschön wäre.
Re: PythonCard Schleife
Verfasst: Dienstag 1. November 2011, 21:25
von Neo_Junior
ok also die erste zeile: ich kenne getattr() nicht. in der beschreibung sieht es aus, als würde es nur attribute für objekte erstellen? ich muss den wert "file" auf "bild1" setzten also
denn dieses 'Bild' wäre ja dann ein string, bei dem ich mit "%" arbeiten könnte. Funktioniert getattr() so oder anders?
zweite zeile: ich habe zuvor immer mit pygame "gearbeitet" da kann man einfach so eine sprite-gruppe oder klasse erstellen und dann könnte man ja schreiben def_on_Gruppe_mouseClick():
oder so klickhandler wäre auch ok. aber da stellen sich 2 fragen: wo sind bei pythoncard die events aufgelistet und wie teste ich, ob ein klick auf einem bild gelandet ist (irgendwie mit pos aber das rechteck vn dem image?)?
Re: PythonCard Schleife
Verfasst: Dienstag 1. November 2011, 23:07
von BlackJack
In der Dokumentation von
getattr() ist ein Beispiel wozu so ein Aufruf äquivalent ist. Die Funktion erstellt keine Attribute. Falls das nicht klar geworden sein sollte der Funktionsname steht für `get attribute`.
Re: PythonCard Schleife
Verfasst: Mittwoch 2. November 2011, 15:49
von Neo_Junior
das war mir klar
ich habs jetzt:
Code: Alles auswählen
for bild in range(1,25):
foto=str(bild)
s=foto
photo='Bild'+foto
picture=getattr(self.components,photo)
picture.file='Bild.jpg'
läuft. danke!
@ BlaclJack weist du, ob es in pythoncard eine liste mit allen events gibt für ne event schleife?
in pygame ging das immer einfach:
Code: Alles auswählen
for event in pygame.event.get():
if event.type=pygame.QUIT:
sys.exit()
Re: PythonCard Schleife
Verfasst: Montag 7. November 2011, 16:13
von Leonidas
Ich bin mal so nett und werfe ein dass PythonCard seit 5 Jahren absolut tot ist, einige Dateien wurden seit 7-10 Jahren nicht mehr angefasst.
Re: PythonCard Schleife
Verfasst: Sonntag 13. November 2011, 22:28
von Neo_Junior
was nimmt man anstelle dessen und -interessehalber- warum überhaupt?
Re: PythonCard Schleife
Verfasst: Sonntag 13. November 2011, 23:05
von Dav1d
wxPython, PyQT (PySide?), PyGTK
Re: PythonCard Schleife
Verfasst: Montag 14. November 2011, 01:18
von Leonidas
Neo_Junior hat geschrieben:was nimmt man anstelle dessen und -interessehalber- warum überhaupt?
Also was man nimmt hat Dav1d schon gesagt und warum:
Weil die Software maintained ist, also falls man auf Bugs stößt, ist es warscheinlich dass diese irgendwann behoben werden. Weil neue Features dazukommen und der Featureumfang jetzt schon größer ist als der von PythonCard. Weil tatsächlich eine Community existiert, sprich wenn du fragen hast gibt es Leute die sich mit dem Kram auskennen die man fragen kann. Alles nicht gegeben bei PythonCard.
Außerdem unterstützt PythonCard keine Sizer, das heißt dass die Buttons fest auf den Dialogen montiert sind, und diese daher Probleme machen wenn man sie vergrößert oder die Fontgrößen sich ändern oder, oder, oder...
Re: PythonCard Schleife
Verfasst: Montag 14. November 2011, 18:47
von Neo_Junior
ok dann danke und eins noch:
@leonidas hast du eine empfehlung aus dieser auswahl?
Re: PythonCard Schleife
Verfasst: Montag 14. November 2011, 18:49
von Dav1d
@Neo_Junior, da hat jeder eine andere, ich z.B. bin wxPython Fan, lunar hingegen Qt, das wurde aber hier schon des Öfteren diskutiert, einfach mal Forumssuche benutzen.