Problem mit onkey() und onclick()

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
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo
irgendwie krieg ich es nicht gebacken, dass das folgende programm läuft:

Code: Alles auswählen

from xturtle import*
x=0
def taste():
    x=x+1
    print"Sie haben die Taste",x,"mal gedrueckt!"

onkey(taste,"1")
listen()
wenn ich das programm ausführe kommt die fehlermeldung, dass das x nicht als variable erkannt wird. wenn ich x=0 in die definition der taste schreibe, macht das ja wenig sinn.

könnt ihr mir da bitte weiterhelfen???

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Wenn du die schnelle Lösung suchst, musst du "global" einsetzen, damit du die globale "Variable" x ändern kannst. Besser wäre ein klassenbasierter Entwurf, dann kommst du auch ohne global aus.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

numerix hat geschrieben:Wenn du die schnelle Lösung suchst, musst du "global" einsetzen, damit du die globale "Variable" x ändern kannst. Besser wäre ein klassenbasierter Entwurf, dann kommst du auch ohne global aus.
Ein Klassenentwurf könnte dann z.B. so aussehen (ungetestet), in den Kommentaren sind noch ein paar Tipps.

Code: Alles auswählen

from xturtle import onkey, liste
# Gewöhne dir * Importe ab!

class KeyHandler(object):
    def __init__(self):
        self.counter = 0
    def key_pressed(self):
        self.counter += 1
        print "Sie haben die Taste %s mal gedrueckt!" % self.counter
        # Generell sollte man eher Stringformatierung verwenden

key_handler = KeyHandler()
onkey(key_handler.key_pressed, "1")
listen()
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

vielen dank euch beiden
das von numerix ist perfekt :D
dier aber auch vielen dank ice2k3 :D

mfg
LP640
BlackJack

@P640: Der Vorschlag von numerix ist nicht perfekt, sondern eine Notlösung, das hat er aber auch dazu geschrieben. Gewöhn Dir ``global`` besser gar nicht erst an.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo
noch ne kurze frage:
hier erstmal der fertige code:

Code: Alles auswählen

from xturtle import* 
x=0 
def taste():
    global x
    x=x+1 
    print"Sie haben die Taste",x,"mal gedrueckt!" 

onkey(taste,"1") 
listen()
so wie mach ich es jetzt, dass ich das programm per doppelklick auf die py-datei öffnen kann? (bei programmen, wo ich raw_input() und input() benutze habe ich dieses problem nicht)

mfg
LP640
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Starte dein Programm über die Konsole. Wie das geht findest du hier beschrieben. Beachte aber das dabei Programme, die Stern(*)importe und ``global`` enthalten, schwere Fehler produzieren können. Es empfiehlt sich also die Vorschläge von ice2k3 zu beachten. :wink:
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

gkuhl, das bringt mich auch nicht weiter trotzdem danke
und zwar kann ich auch nur die selben programme öffnen, die ich auch per doppelklick öffnen kann, also programme, wo ich zum beispiel input() und raw_input() benutze.
das programm, dass ich hier geposted öffnet und schliesst sich direkt wieder wie bei doppelklick

ich bitte weiterum um unterstützung

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:das programm, dass ich hier geposted öffnet und schliesst sich direkt wieder wie bei doppelklick
Du musst deinen Code mit einem Aufruf von mainloop() beschließen, damit das Fenster offen bleibt. Vermutlich hast du ansonsten das Programm aus IDLE heraus gestartet. Da fällt das fehlende mainloop() nicht auf, weil IDLE selbst auf Tkinter basiert (wie xturtle auch) und selbst eine mainloop() enthält.

Ansonsten: Nimm dir zu Herzen, was BlackJack zu "global" gesagt hat!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Darf ich mal fragen, was dich an meiner Lösung stört? (Oder funktioniert sie nicht, habe sie nicht getestet. Wenn ja, poste doch mal den Fehler.)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

ice2k3 hat geschrieben:Darf ich mal fragen, was dich an meiner Lösung stört? (Oder funktioniert sie nicht, habe sie nicht getestet. Wenn ja, poste doch mal den Fehler.)
Auch ohne Testen kann man sehen, dass der import nicht klappt ... :wink:

Vermutlich stört bei deiner Lösung vor allem eins: Zu lang. :D
Einfach ein "global" hineingefrickelt und fertig.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ok...
Zeile 1 muss natürlich so aussehen:

Code: Alles auswählen

from xturtle import onkey, listen
Das n ist wohl verloren gegangen.

Aber vermutlich benötigst du jetzt:

Code: Alles auswählen

from xturtle import onkey, listen, mainloop
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

danke für deine antwort ice2k3
deine methode funktioniert natürlich auch
aber das ergebnis ist das gleiche (zumindest für den benutzer des programms)
aber wieso so kompliziert wenn es auch einfach geht? :wink:
numerix hat es bereits auf den punkt gebracht.

mfg
LP640
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Weil die etwas längere Lösung strukturierter ist.

Und ich denke nicht, dass numerix dazu aufgerufen hat, Code hässlich zusammenzufrickeln, so wie du das zu bevorzugen scheinst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Die Lösung mit der Klasse kannst du auch noch für mehr Sachen verwenden, z.B. wenn dokumentiert werden soll wenn eine andere Taste gedrückt wurde
the more they change the more they stay the same
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

ist da jemand beratungsresistent?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

LP640 hat geschrieben:aber wieso so kompliziert wenn es auch einfach geht? :wink:
numerix hat es bereits auf den punkt gebracht.
Ich glaube, dir ist die offensichtliche Ironie in diesem Beitrag von numerix nicht aufgefallen... :evil:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ja, ich bin schuld. Ich habe als erster das Wort "global" benutzt. Ich hätte es wissen müssen ...

Also, LP640, noch einmal ganz persönlich für dich:
Ja, es geht mit global, das hast du bereits festgestellt.

Nein, das ist keine gute Lösung, auch wenn es funktioniert und man bei so einem kleinen Codeschnipsel den Sinn einer "umständlicheren" Lösung möglicherweise nicht sieht. Aber dein Programm wird ja vermutlich ein paar Zeilen mehr haben oder noch bekommen, und mit jeder Zeile mehr wird "global" ein Stückchen schlechter, weil es irgendwann zu Code führt, der unübersichtlich ist und anfällig für Seiteneffekte.

Ein klassenbasierter Ansatz lässt sich sauber erweitern und bildet die Grundlage für besser lesbaren und wartbaren Code. In deinem konkreten Fall wäre es außerdem eine gute Übungsmöglichkeit, in die OOP mit Python einzusteigen.
Antworten