Turtlebefehle als Modul

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
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

Hallo liebe Leute,

ich habe folgendes Problem: ich möchte einige meiner Turtlebefehle in ein Modul verschieben. Seltsamerweise funktioniert der Aufruf von Funktionen dann nur jedes 2. Mal - sonst bekomme ist eine turtle.Terminator Exception. Kann mir jemand sagen, was ich falsch mache

Modul:

Code: Alles auswählen

from turtle import *

def rechteck(laenge,breite):
    fd(laenge)
    rt(90)
    fd(breite)
    rt(90)
    fd(laenge)
    rt(90)
    fd(breite)
    exitonclick()
Aufruf:

Code: Alles auswählen

>>> import myfigures;
>>> myfigures.rechteck(100,80)
>>> myfigures.rechteck(100,80)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/myfigures.py", line 22, in rechteck
    fd(laenge)
  File "<string>", line 5, in fd
das erste Mal ging es - das zweite Mal nicht.

bitte um Hilfe, danke,

Jochen
BlackJack

Kann ich nicht nachvollziehen, aber sag mal wie kommt denn das bitte *dort* hin: ``/usr/lib/python3.5/myfigures.py``? Das hat da nichts zu suchen.
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

BlackJack hat geschrieben:Kann ich nicht nachvollziehen, aber sag mal wie kommt denn das bitte *dort* hin: ``/usr/lib/python3.5/myfigures.py``? Das hat da nichts zu suchen.
naja, ich hab mit

Code: Alles auswählen

import sys
sys.path
nachgesehen, wo Python3 nach Modulen sucht und einfach mein myfigures.py dort angelegt.

Wo soll es denn sonst hin?
BlackJack

@jlackner: Auf jeden Fall nicht *dort*. Da ist die Standardbibliothek, und wirklich nur die. Und kopier das auch nicht einfach irgendwo selbst hin, sondern installiere es ordentlich.
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

BlackJack hat geschrieben:@jlackner: Auf jeden Fall nicht *dort*. Da ist die Standardbibliothek, und wirklich nur die. Und kopier das auch nicht einfach irgendwo selbst hin, sondern installiere es ordentlich.
Wie auch immer - das hat mit dem Thema nichts zu tun. Zusammenfassend also: keine Idee woran es liegen könnte?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@jlackner: »exitonclick« tut wirklich das, was es sagt; es verläßt die Turtle-Umgebung, so dass man danach nichts mehr Zeichnen kann/darf/soll. Was möchtest Du eigentlich damit erreichen?
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

Sirius3 hat geschrieben:@jlackner: »exitonclick« tut wirklich das, was es sagt; es verläßt die Turtle-Umgebung, so dass man danach nichts mehr Zeichnen kann/darf/soll. Was möchtest Du eigentlich damit erreichen?
Ja, sorry - ich hab nur herumgespielt. Ich hab das exitonclick in meiner Version wieder draußen.

Es wirkt für mich so, als würde irgendetwas vom Zeichenprozess hängen und beim nächsten Aufruf die Exception auslösen. Wenn ich die fange und die gleiche Funktion nochmal aufrufe, funktioniert es zwar, ist aber unsauber.

myfigures.py:

Code: Alles auswählen

import turtle

def rechteck(laenge,breite):
    try:
        alex = turtle.Turtle()
        alex.fd(laenge)
        alex.rt(90)
        alex.fd(breite)
        alex.rt(90)
        alex.fd(laenge)
        alex.rt(90)
        alex.fd(breite)
    except Exception:
        rechteck(laenge,breite)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@jlackner: und wie heißt jetzt die neue Exception? Bei mir kommt da keine.
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

turtle.Terminator

und das in Python 2.7.12 und Python 3.5.2 - ich vermute also, dass das nichts mit meinem Python zu tun hat, eher mit dem OS (Linux) oder mit der Art wie ich die Turtle instantiiere und dann dem Garbagecollector überlasse
BlackJack

@jlackner: Ich kann das hier unter Linux nicht nachvollziehen. Zeig doch mal ein komplettes Beispiel, mit Beschreibung was man eingeben muss um zum Traceback zu kommen und dann auch den kompletten Traceback der zum Beispiel passt.
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

Also myfigures.py (liegt jetzt unter /usr/local/lib/python3.5/dist-packages/) sieht so aus:

Code: Alles auswählen

import turtle

def rechteck(laenge,breite):
    fd(laenge)
    rt(90)
    fd(breite)
    rt(90)
    fd(laenge)
    rt(90)
    fd(breite)
Aufruf sieht dann so aus:

Code: Alles auswählen

jochen@sauron:~$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import myfigures
>>> myfigures.rechteck(100,80)
>>> myfigures.rechteck(100,80)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/myfigures.py", line 5, in rechteck
    fd(laenge)
  File "<string>", line 5, in fd
turtle.Terminator
Danke fürs Probieren und lG
Jochen
BlackJack

@jlackner: Das kann nicht sein: Bei dem gezeigten Code ist `fd` nicht definiert und wird deshalb zu einem `NameError` führen.
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

hast natürlich recht...

Code: Alles auswählen

from turtle import *

def rechteck(laenge,breite):
    fd(laenge)
    rt(90)
    fd(breite)
    rt(90)
    fd(laenge)
    rt(90)
    fd(breite)
falsche Version genommen, entschuldige bitte

---

Ich hatte auch versucht mit alex = turtle.Turtle() eine lokale Instanz einer Turtle in meinem Modul zu verwenden (davon ist die import-Zeile gewesen) - aber das hat nicht wirklich etwas geändert.
BlackJack

Ich kann es leider nicht nachvollziehen, egal ob ich Python 2 oder 3 nehme, und egal ob ich Python in einem Terminal starte oder die Python-Shell in IDLE verwende, ich kann die Funktion beliebig oft aufrufen. Und ich sehe auch nicht warum das nicht möglich sein sollte.
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

welche Pythonversion hast Du denn? (bei mir 3.5.2 unter Kubuntu 16.04.2)
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

jlackner hat geschrieben:welche Pythonversion hast Du denn? (bei mir 3.5.2 unter Kubuntu 16.04.2)
Kann es sein, dass 'myfigures' nicht 'turtle' aus der Standardbibliothek, sondern irgendein anderes Modul, das genau so heißt importiert?
Hast du irgendwo im Suchpfad eine Datei abgelegt, die du 'turtle' benannt hast?
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

nezzcarth hat geschrieben:
jlackner hat geschrieben:welche Pythonversion hast Du denn? (bei mir 3.5.2 unter Kubuntu 16.04.2)
Kann es sein, dass 'myfigures' nicht 'turtle' aus der Standardbibliothek, sondern irgendein anderes Modul, das genau so heißt importiert?
Hast du irgendwo im Suchpfad eine Datei abgelegt, die du 'turtle' benannt hast?
Nein, ich hab sonst an der Standardinstallation nichts verändert
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

ich hab so irgendwie den Verdacht, dass ich eine Instanz der turtle anlege durch meine Zeichnerei, die dann nicht sauber beendet wird. Beim ersten Aufruf von "rechteck" mache ich das turtle-Fenster mit Alt-F4 zu... kann das damit etwas zu tun haben?
BlackJack

@jlackner: Das gehört dann zu dem Teil der Beschreibung wie man zu der Ausnahme gelangt. Wenn ich Alt+4 nach dem zeichnen des ersten Rechtecks drücke, kann ich die Funktion problemlos ein zweites mal aufrufen. (Und auch weitere male.) Wenn ich das Fenster schliesse *während* das Rechteck gezeichnet wird, dann bekomme ich einen `TclError`, weil ich dem laufenden Programm die GUI unterm Allerwertesten weg ziehe. Aber danach kann ich die Funktion problemlos wieder aufrufen. Das ganze im Terminal und nur mit Python 2.7, weil ich keine Lust habe jetzt alle möglichen Kombinationen von Python und IDEs durch zu probieren.
jlackner
User
Beiträge: 11
Registriert: Sonntag 4. Juni 2017, 20:13
Wohnort: Vasoldsberg
Kontaktdaten:

BlackJack hat geschrieben:@jlackner: Das gehört dann zu dem Teil der Beschreibung wie man zu der Ausnahme gelangt. Wenn ich Alt+4 nach dem zeichnen des ersten Rechtecks drücke, kann ich die Funktion problemlos ein zweites mal aufrufen. (Und auch weitere male.) Wenn ich das Fenster schliesse *während* das Rechteck gezeichnet wird, dann bekomme ich einen `TclError`, weil ich dem laufenden Programm die GUI unterm Allerwertesten weg ziehe. Aber danach kann ich die Funktion problemlos wieder aufrufen. Das ganze im Terminal und nur mit Python 2.7, weil ich keine Lust habe jetzt alle möglichen Kombinationen von Python und IDEs durch zu probieren.
Neinnein, so ist es nicht - ich lasse ihn das Rechteck fertig zeichnen. Schließe das Fenster dann und möchte ein neues Rechteck zeichnen lassen - dann schmiert er ab.
Antworten