PythonCard Schleife

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.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

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

Code: Alles auswählen

self.components.Bild1.file='Foto.jpg'
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???
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

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?
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
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.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

ä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?
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

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)?
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

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???
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
BlackJack

@Neo_Junior: Was genau spricht jetzt noch mal gegen `setattr()`?
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

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?
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
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.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

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

Code: Alles auswählen

getattr (self.components.Bild1.file , 'Bild'
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?)?
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
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`.
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

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()
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

was nimmt man anstelle dessen und -interessehalber- warum überhaupt?
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

wxPython, PyQT (PySide?), PyGTK
the more they change the more they stay the same
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Neo_Junior
User
Beiträge: 49
Registriert: Samstag 6. August 2011, 18:52

ok dann danke und eins noch:

@leonidas hast du eine empfehlung aus dieser auswahl?
Auf den Wunsch, Computer und Software zu verstehen folgt mit (nicht unbedingt kompletter Logik) der Drang nach Wissen im Programmieren.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@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.
the more they change the more they stay the same
Antworten