Turtle Fuktionen

Fragen zu Tkinter.
Antworten
guter_hund
User
Beiträge: 19
Registriert: Montag 4. Dezember 2006, 13:25

Einen Wunder schönen Nachmittag alle zusammen.
Habe mich seit kurzem entschlossen mich mit dem Turtle-Modul aus einander zu setzen(eigentlich muss ich :wink: ).

Leider komme ich nicht so recht voran. Folgende Befehle und deren Bedeutung sind mir bereits bekannt/geläufig:

Code: Alles auswählen

width()
forward()
back()
left()
right()
up()
down()
Soweit so gut, aber wie kann man z.B. ein Rechteck 'zeichnen' ohne vier mal forward() und drei mal right() zu schreiben?
Auch das Zeichnen eines Dreiecks und anderer Formen währe sehr interessant.

Hoffe das mir jemand helfen kann (gern auch per Def, etc.)


Danke im Voraus.

Gruß.

Edit (Leonidas): Highlighting eingeschaltet.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Geht nicht, du solltest dir am besten Funktionen schreiben, die dir Rechtecke etc. zeichnen. Es sei denn Tkinter hat dazugelernt, aber das glaube ich nicht ...

MfG apollo13
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

guter_hund hat geschrieben:Auch das Zeichnen eines Dreiecks und anderer Formen währe sehr interessant.
Wenn du vor etwas Mathematik nicht zurueckschreckst, kannst du dir eine Funktion basteln, die dir ein n-Eck zeichnet. D.h. du hast dann eine while-Schleife von 1 bis n, und du musst dir dann ueberlegen, um welchen Winkel sich die Turtle in jedem Schritt drehen muss, damit sie nach n Schritten wieder an ihrem Ausgangspunkt angelangt.

Als Extra kannst du dir auch noch ueberlegen, wie man die Groesse eines n-Ecks steuern kann.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

apollo13 hat geschrieben: Es sei denn Tkinter hat dazugelernt, aber das glaube ich nicht ...
was hat das mit Tkinter zu tun?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

pyStyler hat geschrieben:
apollo13 hat geschrieben: Es sei denn Tkinter hat dazugelernt, aber das glaube ich nicht ...
was hat das mit Tkinter zu tun?
Wie meinen? Ich meinte es in die Richtung, dass Tkinter vlt. inzwischen schon eine Funktion um N-Ecke zu zeichnen bereitstellt (auch wenn ich denn Sinn nicht sehe...).

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

apollo13 hat geschrieben:Wie meinen? Ich meinte es in die Richtung, dass Tkinter vlt. inzwischen schon eine Funktion um N-Ecke zu zeichnen bereitstellt (auch wenn ich denn Sinn nicht sehe...).
Das hat doch nichts mit Tkinter zu tun.

Turtle implementiert Turtle-Grafik und dieses ist auch gar nicht dazu gedacht, n-Ecke zu zeichnen. Das ist nicht der Sinn der Turtle-Grafik, wenn man programmatorisch auf Tk-Fenstern zeichnen will nimmt man Canvas. Daher ist es auch nur richtig so, dass weder turtle, noch xturtle noch sdlturtle n-Ecke zeichnen können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ah verdammt jetzt verstehe ich^^
Das war weil er im Tkinter Forum geschrieben hat. Meine Antwort war ja eh auf Turtle bezogen. Alles klar *gg*
BlackJack

Leonidas hat geschrieben:Turtle implementiert Turtle-Grafik und dieses ist auch gar nicht dazu gedacht, n-Ecke zu zeichnen.
Macht als Aufgabe aber schon Sinn. Man muss sich ja nur überlegen wieviele Schritte man für ein N-Eck braucht, wie lang die sein müssen und um wieviel Grad sich die Schildkröte an jeder Ecke drehen muss.
guter_hund
User
Beiträge: 19
Registriert: Montag 4. Dezember 2006, 13:25

apollo13 hat geschrieben:...du solltest dir am besten Funktionen schreiben...
Okay. Nur bin ich in Python noch nicht so weit um Funktionen zu schreiben. Wie geht das?

Liebe Grüße...
BlackJack

Arbeite am besten mal das Tutorial aus der Dokumentation durch.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Code: Alles auswählen

>>> def meine_funktion():
...     print "Ich bin eine wichtige Funktion"
...
>>> # Nun koennen wir die Funktion aufrufen:
... meine_funktion()
Ich bin eine wichtige Funktion
>>>
>>> def meine_zweite_funktion(param):
...     print "Ich habe einen Parameter bekommen:", param
...
>>> # Dieser Funktion koennen wir einen Parameter uebergeben:
... meine_zweite_funktion(5)
Ich habe einen Parameter bekommen: 5
Versuche erstmal, eine Funktion zu schreiben, die ein Viereck macht:

Code: Alles auswählen

>>>def viereck():
...     while i in range(1, 4):
...         # Hier kommen jetzt Turtle-Befehle hin...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Rebecca hat geschrieben:

Code: Alles auswählen

>>>def viereck():
...     while i in range(1, 4):
...         # Hier kommen jetzt Turtle-Befehle hin...
Eher:

Code: Alles auswählen

for i in range(4):
oder

Code: Alles auswählen

for i in range(1,5):
MfG
HWK
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:
Leonidas hat geschrieben:Turtle implementiert Turtle-Grafik und dieses ist auch gar nicht dazu gedacht, n-Ecke zu zeichnen.
Macht als Aufgabe aber schon Sinn. Man muss sich ja nur überlegen wieviele Schritte man für ein N-Eck braucht, wie lang die sein müssen und um wieviel Grad sich die Schildkröte an jeder Ecke drehen muss.
Richtig, als Aufgabe ist das schon sinnvoll. Aber wenn Turtle das alles schon könnte, hätte es eigentlich keinen Sinn mehr es zu benutzen. Ich sehe Turtle jedenfalls als etwas an, womit man Programmieren lernen kann und von seinen Programmen visuelles Feedback bekommt.

Also ähnlich wie Robot Karol, Kara oder Robocode, wobei letzteres schon auch noch einige andere Sachen lehrt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
guter_hund
User
Beiträge: 19
Registriert: Montag 4. Dezember 2006, 13:25

Hi.
Also ich bin schon relativ weit gekommen:

Code: Alles auswählen

from turtle import *

def viereck():
    a = 1
    b = 5
    okay = True
    while okay:
        if a < b:
            forward(pot)
            right(90)
            a = a + 1
            okay = True
        if a == b:
            okay = False
            break
             
width(2)
pot = 100
viereck()
pot ist hierbei die Variable mit der man bestimmen kann wie lang die Linie werden so(hier 100 Pixel). Aber was ist wenn ich keine Rechteck will in dem die Seite 'a' = 'b' ist, sondern die Seite 'a' 40 und die Seite 'b' 20 Pixel lang sein soll???

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

Ungetestet hätte ich sowas anzubieten:

Code: Alles auswählen

import turtle

def quadrilateral(side_a, side_b):
    next_side = side_a
    for i in range(4):
        turtle.forward(next_side)
        turtle.right(90)
        
        if next_side == side_a:
            next_side = side_b
        else:
            next_side = side_a
         
turtle.width(2)
quadliteral(40, 20)
Ist warscheinlich selbsterklärend.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Das mit der ``while``-Schleife ist recht kompliziert. ``for``-Schleifen wurden hier doch schon gezeigt:

Code: Alles auswählen

from turtle import forward, right, width

def viereck(size):
    for dummy in xrange(4):
        forward(size)
        right(90)

def main():
    width(2)
    viereck(100)

if __name__ == '__main__':
    main()
Ausserdem sollte man in Funktionen möglichst nicht auf Werte im Modulnamensraum zugreifen, die man besser als Argument übergeben kann. Dann lassen sich Funktionen nicht mehr benutzen oder testen ohne dass man im gesamten Programm suchen muss, wo die benötigten Werte eigentlich herkommen.

Für ein Rechteck musst Du zwei Seiten in der einen Länge zeichnen und zwei in der anderen. Jeweils abwechselnd. Wenn man eine Schleife über die Zahlen 0 bis 3 hat, wie im Beispiel oben, kann man beispielsweise unter Verwendung des Modulo-Operators (``%``) testen, ob die Nummer der aktuellen Seite gerade oder ungerade ist, und entsprechend die erste oder zweite Längenangabe benutzen.
guter_hund
User
Beiträge: 19
Registriert: Montag 4. Dezember 2006, 13:25

Ich habe es jetzt erst mal so gemacht:

Code: Alles auswählen

from turtle import *
def quadrilateral(side_a, side_b):
    next_side = side_a
    for i in range(4):
        forward(next_side)
        right(90)

        if next_side == side_a:
            next_side = side_b
        else:
            next_side = side_a        
width(2)
quadrilateral(100, 100)
up()
goto(40, -100)
left(90)
down()
quadrilateral(40, 20)             
up()
goto(20, -40)
down()
quadrilateral(20, 20)
up()
goto(60, -40)
down()
quadrilateral(20, 20)
up()
goto(0, 0)
down()
right(45)
forward(71)
left(90)
up()
goto(100, 0)
down()
forward(71)
right(45)
up()
goto(30, 40)

Aber ich versuche es mal mit deiner Variante wenn ich ein bisschen mehr Zeit habe...

MFG.

Edit (Leonidas): Code-Highlighting eingeschaltet.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Könntest du das mit dem *-Import lassen? Das ist schon Absicht, dass weder BlackJack noch ich *-Imports benutzt haben.

Infos gibts unter [wiki]Module[/wiki].
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten