2016-10-11 1 views
0

Ich bin ein Neuling mit Python 3.2.3Python Schildkröte für turtle.tracer aktualisiert Zeichnung (0,0)

Wenn ich das Modul in der Python IDLE lief, zog die Schildkröte, die ein Quadrat ohne Update auf dem Bildschirm , so erschien das Fenster leer, und nachdem ich einen beliebigen Schlüssel eingegeben hatte, erschienen die Schildkröte und das Quadrat aufgrund des Aufrufs von turtle.update().

Wenn ich jedoch zweimal auf die .py-Datei klickte, die den folgenden Code in meinem Dokument speicherte und direkt ausführte, tauchte das Quadrat immer auf, bevor ich einen Schlüssel eingab.

Der interessante Teil ist, dass die Schildkröte nicht gezeigt wurde, aber nur das Quadrat wurde gezeigt.

Es scheint, dass es ein Turtle Update nur für das Quadrat nach dem Zeichnen gab, auch wenn ich Turtle Tracer bereits auf (0,0) gesetzt hatte.

Ist dies ein Fehler und wie kann ich es lösen? Danke für die Hilfe.

import turtle 
 

 
def drawSquare(): 
 
    turtle.down(); 
 
    turtle.begin_fill(); 
 
    turtle.goto(10, 0); 
 
    turtle.goto(10, 10); 
 
    turtle.goto(0, 10); 
 
    turtle.goto(0, 0); 
 
    
 
    turtle.end_fill(); 
 
    turtle.up(); 
 

 
def tUpdate(): 
 
    turtle.update(); 
 

 
turtle.tracer(0,0); 
 
drawSquare(); 
 
input("Not updated. Press any key."); 
 
tUpdate(); 
 
print("Updated"); 
 
turtle.mainloop();

Antwort

1

Sie haben gegen Sie arbeiten, ein paar Dinge bekam: die Armen documenation für tracer() und die Tatsache, vorausgesetzt, dass end_fill() und up() Ursache Updates auftreten. tracer() ist nicht wirklich dazu gedacht, Dinge vor dem Benutzer zu verbergen, bis Sie bereit sind, sie anzuzeigen - es ist eine Geschwindigkeitsoptimierung, damit der Benutzer nicht jeden Zeichenschritt in einem komplizierten Bild sehen muss. Sie haben keine vollständige Kontrolle darüber, wann Updates durchgeführt werden.

Hier ist eine Überarbeitung Ihres Beispiels, die das gewünschte Verhalten zeigt, auf Kosten, dass es kein gefülltes Quadrat mehr ist. Ich habe Ihre input() Auslöser für einen Mausklick auf dem Fenster statt getauscht, aber Ihr Ansatz wird auch genauso gut hier arbeiten:

from turtle import Turtle, Screen 

def drawSquare(turtle): 
    turtle.goto(100, 0) 
    turtle.goto(100, 100) 
    turtle.goto(0, 100) 
    turtle.goto(0, 0) 

screen = Screen() 

screen.tracer(0, 0) 

screen.onclick(lambda x, y: screen.update()) 

turtle = Turtle() 

drawSquare(turtle) 

screen.mainloop() 

ich auch gemacht, die Schildkröte Methoden sind, und welcher Bildschirm Methoden, deutlicher. Das anfängliche programmiererfreundliche Design der Schildkrötenbibliothek neigt dazu, diese im Interesse der Benutzerfreundlichkeit zu verwischen.

+0

Es funktioniert. Die Erklärungen haben viele Konzepte klarer gemacht. Vielen Dank für Ihre Antwort! – eaglebrain

+0

Es gibt immer noch etwas, was ich nicht verstehe. Wie ich bereits erwähnt habe, wurde die Schildkröte nicht gezeigt, aber nur das Quadrat wurde angezeigt, als ich den alten Code direkt ausführte. Offensichtlich können die von end_fill() und up() verursachten Aktualisierungen nur die "Zeichnung" aktualisieren. Warum? – eaglebrain

+0

@dazedbrain, ich verstehe und ich stimme zu, es ist verwirrend. Ich kann nur vermuten, dass die Art der ** Füllung ** sich wesentlich von der ** Zeichnung ** unterscheidet und das Ergebnis, das wir sehen, beeinflusst. – cdlane