eclipse turtle

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
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Bekomme import von turtle als unused markiert im editor und 'mode' , 'spee' ect. werden als variablen angezeigt ?

Code: Alles auswählen

from math import sin, pi
from time import sleep
from turtle import *
GA=9.80665
def main():
 einige zeilen code

def init():
     setup()           #hier im init-bereich werden die methoden als variablen verstanden , warum ?
     mode('logo')     # die bibliothek turtle wird anscheinend garnicht eingebunden.
     speed(0)         # im projekt-verzeichnis jedoch aufgelistet.
     hideturtle()
     tracer(False)

def draw():

    einige zeilen code

if __name__ == '__main__'
     init()
     main()

python habe ich bisher nur als scriptsprache genutzt und nicht in eclipse. Ich vermute daher einen Fehler in den Einstellungen. Habe einen screenshot von meinen project. Kann mir jemand weiterhelfen ?
Zuletzt geändert von Anonymous am Mittwoch 17. August 2011, 18:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hast du schon PyDev runtergeladen und Python importiert?
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Vielen Dank für die Antwort.

Ja , habe ich gemacht.
In meinem Projektverzeichnis werden auch alle Bibliotheken von python angezeigt.
Für python habe ich auch einen eigenen workspace.
Ich kann mir auch die turtle.py in den editor laden und ansehen.Weiterhin habe ich
inzwischen auch die neuere Version von turtle in mein python installiert. Ohne etwas
hiermit erreicht zu haben.
BlackJack

@wilhelmO: Kannst Du das Problem vielleicht noch einmal genauer beschreiben? Läuft das Programm oder nicht? Wenn nicht, gibt es eine Fehlermeldung? Wenn ja welche? Wenn es keine Fehlermeldung gibt, beschreibe mal den Unterschied zwischen dem was das Programm macht und dem was Du gerne hättest.

Oder geht es hier nur um irgendwelche Anzeigen in Eclipse? Kann es sein dass die Meldung beim ``import`` nicht sagt das `turtle` unbenutzt ist, sondern dass Du Dir mit dem Sternchen-Import Namen importierst die Du dann nie verwendest!?

Und was ist für Dich eine „Variable”? In Python hat man Namen die an Objekte gebunden sind. Das können Objekte wie Zahlen oder Zeichenketten sein. Aber auch Objekte die man aufrufen kann, wie Funktionen, Klassen, oder Methoden. Mit denen kann man aber ansonsten das gleiche machen wie mit Zahlen oder Zeichenketten. Also zum Beispiel an andere Namen binden, als Argumente bei Aufrufen übergeben, in Listen oder Wörterbücher stecken, und so weiter. Falls Du also erwartest, dass Namen die an Funktionen gebunden sind, eine andere Farbe haben als solche die an nicht-aufrufbare Objekte gebunden sind, dann ist Deine Erwartung falsch. Python-IDEs heben oft die Namen aus dem `__builtin__`-Modul farbig anders hervor, das war es aber auch schon.
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

In der Console bekomme ich folgenden Fehlertext angezeigt :
NameError : global name screen is not defined.

Also wird doch wie vorgegeben als erstes der init() - Teil durchlaufen. Hier jedoch screen('logo')
nicht als methode ( richtig ? ) von turtle bewertet , sondern als eine nicht definierte var , aber
warum ?

Wenn ich mit dem cursor auf die import - Anweisung von turtle gehe werden alle methoden als unused in wild import
bezeichnet. Hilft dies weiter ? Ich könnte einen screenshot senden, wenn dies weiterhilft ?

Ich habe mal pythonwin geöffnet und folgendes eingegeben :

>>>from turtle import *
>>> '# alles gut soweit
>>>screen('logo')
>>>NameError name screen is not defined '#also im Prinzip das gleiche Verhalten
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vielleicht bin ich blind, aber oben in Deinem Code taucht `screen` ja auch gar nicht auf - sondern `mode`!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Also das ist deswegen, weil ein Screen Objekt noch gar nicht initialisiert wurde (-:
Du musst zuerst:

Code: Alles auswählen

screen = Screen()
, dann kannst du die Methoden sehen, die screen hat
Edit: Du kannst nur ein Screenobjekt instanzieren, da Screen eine Singleton-klasse ist (:
BlackJack

@wilhelmO: Wie Hyperion schon schrieb kommt in Deinem gezeigten Quelltext der Name `screen` gar nicht vor. Und in dem kleinen Test in der Shell versuchst Du `screen` aufzurufen, ohne es vorher irgendwo definiert zu haben. Im `turtle`-Modul gibt es ein `Screen` mit einem grossen 'S'. Vielleicht meintest Du das!? Das erwartet aber kein Argument beim Aufruf. Das Argument 'logo' deutet auf den `mode()`-Aufruf hin, der ja auch in Deinem Quelltext steht und so funktionieren sollte.

Screenshot muss nicht sein. Die Meldungen sollte man aus der entsprechenden tabellarischen Ansicht auch als Text kopieren oder exportieren können. Die Meldungen werden so aussehen:

Code: Alles auswählen

W:  3: Unused import Canvas from wildcard import
W:  3: Unused import switchpen from wildcard import
W:  3: Unused import mainloop from wildcard import
W:  3: Unused import TNavigator from wildcard import
...
Und die sind nicht für *alle* Namen aus `turtle` sondern nur die Namen, die Du mit dem Sternchen-Import oder „wildcard import” zwar in den Namensraum vom Modul holst, sie dann aber gar nicht verwendest. Das sind keine Fehlermeldungen, sondern lediglich Warnungen. Sternchen-Importe sind in der Regel schlechter Stil. Das `turtle`-Modul könnte man als Ausnahme von der Regel sehen. Da dort fast alle Funktionen auf einem globalen Zustand operieren ist das ganze Modul aus softwaretechnischer Sicht eine Katastrophe. Das macht man mit einem Sternchen-Import auch nicht mehr schlimmer. ;-)
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Erstmal recht herzlichen Dank an alle !
Hyperion ist durchaus nicht erblindet, er hat recht.
Newcomer hat den Nagel auf den Kopf getroffen !!
Mein init sieht jetzt so aus und verursacht keine Fehlermeldung mehr :
def init():
w=Turtle()
w.speed(2)
w.hideturtle()
w.tracer(False)
w.penup

der danach aufgerufene draw teil verursacht jetzt eine Fehlermeldung

def draw(angle,length):
if w.speed() != 0 # hier wird schon abgebrochen mit der folgenden consolen - Fehlermeldung :

Name Error : global 'w' ist not defined

warum ? w wurde doch im init()-Teil abgeleitet ----> dieses unterlassene Ableiten war ja offensichtlich mein Fehler

Das Programm habe ich aus ActiveStateCode - also ein fertiges script ( recipe-577553-1) - ich dachte dies wäre eine gute Idee als Anfänger hiermit zu starten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dir scheinen noch viele Grundlagen von Python zu fehlen:

Code: Alles auswählen

>>> def foo():
...     bar = 42
...
>>> def test():
...     print bar
...
>>> foo()
>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test
NameError: global name 'bar' is not defined
In Python gibt es Gültigkeitsbereiche von Namen. Innerhalb einer Funktion ist ein Name gültig, außerhalb ist er es nicht (mehr). Wenn Du ein zentrales Turtle-Objekt benötigst, musst Du Dir es "merken". Also z.B. durch die `init`-Funktion zurückliefern lassen und den folgenden Methoden dann entsprechend übergeben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@wilhelmO: Warum erstellst Du da jetzt eigentlich ein eigenes `Turtle`-Exemplar? Und was bedeutet in dem Zusammenhang der Name `w`?

Was für eine Fehlermeldung kommt denn bei dem Rezept von der ActiveState-Webseite? Da kommt kein `screen` drin vor, also musst Du das da ja irgend wo eingebracht haben. Wo und warum? Ausserdem funktioniert das, zumindest mit Python 2.6 und 2.7 so wie es auf der Webseite steht. Du musst also irgend etwas verändert haben.
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Danke Hyperion
habe ich verstanden.
global w
w = Turtle()

Allerdings habe ich schon mal irgendwo ( Buch ? , handout ? ) global wäre schlechter Stil.
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Vielen Dank für die Rückmeldung Black Jack.
Werde mir das script nochmals genau ansehen.
Habe python 2.4 , aber daran wird es nicht liegen.
Wie mein ehemaliger Chef sagte : 99 % aller Fehler liegen(sitzen) vor dem Bildschirm.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wilhelmO hat geschrieben:Danke Hyperion
habe ich verstanden.
global w
w = Turtle()

Allerdings habe ich schon mal irgendwo ( Buch ? , handout ? ) global wäre schlechter Stil.
Ist es auch - habe ja `global` auch nie erwähnt, oder?

Stichwort: Parameterübergabe bzw. -rückgabe!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

wilhelmO hat geschrieben:habe ich verstanden.
global w
w = Turtle()
Nein, du hast es noch nicht ganz verstanden. Die Nutzung von global ist nicht schön.

Du kannst Daten mit return zurückgeben und dann weiterverwenden.

Code: Alles auswählen

def foo():
    x = 42
    return x

def bar(value):
    print value

result = foo()
bar(result)
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Programm läuft in der urprünglichen Version ( script ) wie von Black Jack geschrieben. Danke

Trotzdem habe ich noch ein Verständnisproblem - Programm läuft -- aber im editor 'rote Kringel'
def init():
setup() # rote Kringel unter setup
mode('logo') # rote Kringel unter mode
usw

def draw(angle,length):
if speed() !=0: # rote Kringel unter speed
clear() # rote Kringel unter clear
setheading(angle+pi) # rote Kringel usw.

Habe ich irgendetwas in eclipse nicht richtig eingestellt ?
BlackJack

@wilhelmO: Zu den roten Kringeln gehört ja immer auch ein Grund, den Eclipse auch verraten sollte, wenn man mit der Maus darüber geht, oder auf die dazugehörige Markierung am Rand des Texteditors, beziehungsweise auch in der Ansicht wo alle Fehler und Warnungen tabellarisch angezeigt werden.

Ich nehme mal an, dass Eclipse aus irgendwelchen Gründen nicht in das `turtle`-Modul hinein geschaut hat, was da so alles an Namen drin steckt.
wilhelmO
User
Beiträge: 34
Registriert: Mittwoch 17. August 2011, 14:40

Nochmals vielen Dank an alle die mir geholfen haben.
BlackJack wird recht haben mit der Vermutung, daß eclipse nichts von den methoden in turtle weiss.
Zumindestens nicht vor Ausführung des Programms. Wenn ich mit dem cursor auf die Stelle gehe, in
der z.B. clear() steht, kommt der Hinweis undefined variable:clear
Antworten