Seite 1 von 1
Problem mit onkey() und onclick()
Verfasst: Dienstag 17. November 2009, 18:13
von LP640
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
Re: Problem mit onkey() und onclick()
Verfasst: Dienstag 17. November 2009, 18:19
von numerix
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.
Re: Problem mit onkey() und onclick()
Verfasst: Dienstag 17. November 2009, 18:24
von ms4py
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()
Verfasst: Dienstag 17. November 2009, 18:37
von LP640
vielen dank euch beiden
das von numerix ist perfekt
dier aber auch vielen dank ice2k3
mfg
LP640
Verfasst: Dienstag 17. November 2009, 18:48
von 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.
Verfasst: Dienstag 17. November 2009, 21:04
von LP640
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
Verfasst: Dienstag 17. November 2009, 21:17
von gkuhl
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.

Verfasst: Dienstag 17. November 2009, 21:49
von LP640
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
Verfasst: Dienstag 17. November 2009, 22:00
von numerix
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!
Verfasst: Dienstag 17. November 2009, 22:57
von ms4py
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.)
Verfasst: Dienstag 17. November 2009, 23:32
von numerix
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 ...
Vermutlich stört bei deiner Lösung vor allem eins: Zu lang.

Einfach ein "global" hineingefrickelt und fertig.
Verfasst: Dienstag 17. November 2009, 23:37
von ms4py
Ok...
Zeile 1 muss natürlich so aussehen:
Das
n ist wohl verloren gegangen.
Aber vermutlich benötigst du jetzt:
Verfasst: Mittwoch 18. November 2009, 14:33
von LP640
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?
numerix hat es bereits auf den punkt gebracht.
mfg
LP640
Verfasst: Mittwoch 18. November 2009, 15:06
von Leonidas
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.
Verfasst: Mittwoch 18. November 2009, 15:26
von Dav1d
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
Verfasst: Mittwoch 18. November 2009, 15:52
von jbs
ist da jemand beratungsresistent?
Verfasst: Mittwoch 18. November 2009, 16:40
von ms4py
LP640 hat geschrieben:aber wieso so kompliziert wenn es auch einfach geht?
numerix hat es bereits auf den punkt gebracht.
Ich glaube, dir ist die offensichtliche Ironie in diesem Beitrag von numerix nicht aufgefallen...

Verfasst: Mittwoch 18. November 2009, 21:14
von numerix
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.