2016-10-22 2 views
0

begin_fill()/ end_fill()コマンドは、シェイプが「閉じた」場合にのみシェイプを「塗りつぶす」と思っていました。次のことを考えてみましょう: 輸入カメPython Turtle Graphics非クローズドポリゴンを塗りつぶす

turtle.color("red") 
turtle.begin_fill() 
turtle.forward(100) 
turtle.left(90) 
turtle.forward(100) 
turtle.end_fill() 

Pythonは姿を完了し、それを埋める - 私が欲しいものではありませんています。 ポリゴンのみが入力されるようにするにはどうすればよいですか?

答えて

0

私たちはカメをサブクラス化し、ルールを変えることができると思います:

from turtle import Turtle, Screen 

class Yertle(Turtle): 
    def end_fill(self): 
     if len(self._fillpath) > 3 and self._fillpath[0] == self._fillpath[-1]: 
      super().end_fill() # warning, Python3 syntax! 
     else: 
      self.end_poly() 

今、私たちが行うことができます。

turtle = Yertle() 
screen = Screen() 

turtle.color("red") 

turtle.begin_fill() 
turtle.forward(100) 
turtle.left(90) 
turtle.forward(100) 
turtle.end_fill() 

turtle.penup() 
turtle.home() 
turtle.pendown() 

turtle.color("green") 

turtle.begin_fill() 
turtle.backward(100) 
turtle.right(90) 
turtle.backward(100) 
turtle.home() 
turtle.end_fill() 

screen.exitonclick() 

enter image description here

警告、このソリューションは、脆いです!将来のリリースで変更される可能性のある基本的な実装の知識に依存します。しかし、もしあなたが絶対に持っていれば...

+0

私は「普通の」操作であると思っていたことをするためにクラスを定義する必要があると言います。閉まっている? – Simon

+0

@Simonでは、あなたのモデルは誰にとってもあまり一般的ではないかもしれません - 実際には***を入力するのに 'begin_fill()'と 'end_fill()'が期待される人もいます。 'end_poly()'が自動接続を最初の頂点に戻し、 'end_fill()'がそれを返さないというドキュメンテーションの欠陥だと私は同意します。そしておそらくそれは設定するオプションのフラグでなければなりません。しかし、あなたはOOP言語を使用しており、これを修正するために必要なクラスは最小限であり、コードと同じファイルに入れることができます。それがOOPのポイントの1つで、デフォルト動作を上書きする機能です。 – cdlane

+0

ありがとう、私はそれに応じて適応します。私はおそらく初めに私の職業について言及していたはずです - 私は先生です。私がシェイプを描き、それを塗りつぶす授業をするとき、私はPythonの寛大さのためにではなく、学生が距離と角度を正確に計算したので、プログラムが動作することを確かめたい。 – Simon