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.
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.
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.
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.
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()
@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.
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)
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.
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
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!
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.
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.
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.