Python Turtle ile şekil boyamak için çizime başlamadan önce begin_fill(), şekil tamamlandığında end_fill() çağrılır. Dolgu rengini fillcolor() ya da kenar ve dolgu rengini birlikte ayarlayan color() belirler. İki komut arasında kaplumbağanın gittiği noktalar kaydedilir ve end_fill() bu noktalarla çevrili alanı boyar.
Kırmızı dolgulu, mavi kenarlı kare: çalışan örnek
Aşağıdaki program mavi kenarlı, içi kırmızı bir kare çizer:
import turtle
turtle.color('blue', 'red') # kenar mavi, dolgu kırmızı
turtle.begin_fill()
for _ in range(4):
turtle.forward(100)
turtle.left(90)
turtle.end_fill()
turtle.done()
Beklenen sonuç: Pencerede mavi çizgiyle çevrili, içi kırmızı bir kare görürsün. Kaplumbağa pencerenin ortasından sağa doğru ilerleyerek çizer. Kare sol alt köşeden başlar, sağa, sonra yukarı doğru tamamlanır; yani şekil başlangıç noktasının sağ üstünde kalır.
Kare dört eşit kenardan ve dört dik dönüşten oluşur. Bu yüzden forward(100) ve left(90) çiftini dört kez yazmak yerine for döngüsüyle tekrar ettirdik. Döngü yazımı sana yeniyse ücretsiz Sıfırdan Temel Python video eğitimi tekrarlı komutları adım adım gösterir.
Programın son satırındaki done() pencereyi açık tutar. done() ile mainloop() aynı işi yapar: ikisi de pencerenin olaylarını dinleyen olay döngüsünü başlatır, bu yüzden birini yazman yeterlidir. Olay döngüsü başladıktan sonra yazdığın komutlar beklediğin gibi çalışmaz; pencere kapanana kadar program bu satırda bekler. Bu nedenle done() her zaman programın son satırı olmalıdır.
begin_fill ve end_fill hangi sırayla çağrılır, şekil kapanmazsa ne olur?

begin_fill() çağrıldığında Turtle kaplumbağanın o andan sonra geçtiği noktaları kaydetmeye başlar. end_fill() bu noktaları sırayla birleştirir ve çevrelenen alanı doldurur. Sıra bozulursa kaydedilecek nokta kalmaz.
begin_fill çizimden önce, end_fill çizim tamamlandıktan sonra kullanılmalıdır.
Yanlış sıra ve doğru sıra
Yanlış sırada end_fill() çizimden önce çağrılır:
import turtle
turtle.fillcolor('red')
turtle.begin_fill()
turtle.end_fill() # kayıt boşken dolgu bitirildi
for _ in range(4):
turtle.forward(100)
turtle.left(90)
turtle.done()
Sonuç: Kare çizilir ama içi boş kalır, çünkü end_fill() çalıştığında doldurulacak bir yol yoktu.
Doğru sırada çizim iki komutun arasındadır:
import turtle
turtle.fillcolor('red')
turtle.begin_fill()
for _ in range(4):
turtle.forward(100)
turtle.left(90)
turtle.end_fill() # çizim bittikten sonra
turtle.done()
Sonuç: Karenin içi kırmızıyla dolar.
Şekil kapanmazsa
Kapalı şekil, kaplumbağanın başlangıç noktasına geri dönen yoldur. Yol tam kapanmazsa Turtle doldururken son noktayı başlangıç noktasına bağlıymış gibi kabul eder. Örneğin döngüyü dört yerine üç kez çalıştırırsan kare yine tamamen kırmızıya boyanır, fakat son kenar çizilmediği için çevresinde çizgi eksik kalır. Dolgu ile çizgi birbirini tutmuyorsa çizimi başlangıç noktasında bitirmeyi dene; böylece hem dolgu hem kenar çizgisi eksiksiz görünür.
color(), pencolor() ve fillcolor() arasındaki fark nedir?

Turtle'da iki ayrı renk vardır: kenar (kalem) rengi çizgiyi, dolgu rengi şeklin içini belirler. Üç fonksiyon bu iki rengi farklı biçimlerde ayarlar:
import turtle
t = turtle.Turtle()
t.color("green") # kenar ve dolgu aynı anda yeşil
t.color("blue", "red") # ilk değer kenar, ikinci değer dolgu
t.pencolor("blue") # yalnız kenar rengi
t.fillcolor("red") # yalnız dolgu rengi
Tek argümanlı color("green") iki rengi birden aynı değere çeker. İki argümanlı color("blue", "red") ise sırayla kenarı mavi, içi kırmızı yapar. pencolor() yalnız çizgiye, fillcolor() yalnız içe dokunur. Argümansız color() çağrısı ise geçerli renk çiftini geri verir.
Renkleri "red" ve "blue" gibi adlarla ya da "#RRGGBB" biçimindeki onaltılık kodlarla yazabilirsin; örneğin "#ff0000" kırmızıdır.
Aynı kare, üç ayrı renk ayarı
def kare(t):
t.begin_fill()
for _ in range(4):
t.forward(100)
t.left(90)
t.end_fill()
# A: yalnız fillcolor
t.fillcolor("red")
kare(t)
# B: yalnız pencolor
t.pencolor("blue")
kare(t)
# C: ikisi birlikte
t.color("blue", "red")
kare(t)
Her çağrıyı kendi başına düşün, çünkü ayar bir kez yapılınca sonraki çizimlere de taşınır. Ayarlar sıfırdan başlasaydı sonuçlar şöyle olurdu:
- A: İç kırmızı olur, kenar varsayılan renk olan siyah kalır.
- B: Kenar mavi olur, iç varsayılan dolgu rengi olan siyahla dolar.
- C: Mavi kenarlı, kırmızı dolgulu kare çıkar.
Dolgunun beklenmedik biçimde siyah çıkması çoğu zaman yalnızca pencolor() kullanıp fillcolor() ayarını unutmaktan kaynaklanır.
Boyama çalışmıyorsa görsel belirtiye göre hata teşhisi
Kodu baştan okumak yerine ekrandaki görüntüden geriye doğru gitmek daha hızlıdır. Aşağıdaki tablo belirtiyi olası nedene ve düzeltmeye bağlar:
| Ekrandaki belirti | Olası neden | Düzeltme |
|---|---|---|
| Çizgi çiziliyor ama içi boş | begin_fill() ya da end_fill() eksik; ya da dolgu rengi arka planla aynı | İki çağrıyı da çizimin başına ve sonuna ekle; fillcolor() değerini arka plandan farklı seç |
| Dolgu hiç görünmüyor | end_fill() çağrılmamış; dolgu, end_fill() çağrıldığı anda uygulanır | Çizim bittikten sonra end_fill() yaz |
| Şekil açık kaldı, kenarlar birleşmiyor | Dönüş açılarının toplamı 360 derece etmiyor ya da kenar sayısı eksik; çizim başlangıç noktasına dönmüyor | Kenar sayısını ve açıyı kontrol et; kare için dört kenar ve her seferinde 90 derece |
| Çağrı sırası karışık | begin_fill() çizimden sonra çağrılmış ya da end_fill() çizimden önce yazılmış | Sırayı begin_fill(), çizim, end_fill() yap |
| Şekil beklenmedik biçimde doluyor | penup() durumundaki hareketler çizgi bırakmaz ama dolgu noktalarına dahil olabilir | Konumlanmayı (penup(), goto(), pendown()) begin_fill() çağrısından önce bitir |
Üçüncü satırdaki sorun genellikle döngü ve açı mantığından doğar. Orada takılıyorsan ücretsiz Python bilgi testiyle seviyeni ölçüp hangi konuyu pekiştirmen gerektiğini görebilirsin.
Mini proje: iki renkli kareyi fonksiyonla boyamak
Aynı boyama adımlarını her kare için baştan yazmak yerine bir fonksiyona koyabilirsin. Fonksiyon konumu, boyutu, kenar rengini ve dolgu rengini parametre olarak alır.
import turtle
def kare_boya(x, y, boyut, kenar, dolgu):
turtle.penup()
turtle.goto(x, y)
turtle.pendown()
turtle.color(kenar, dolgu)
turtle.begin_fill()
for _ in range(4):
turtle.forward(boyut)
turtle.left(90)
turtle.end_fill()
turtle.pensize(3)
kare_boya(-150, 0, 100, "blue", "red")
kare_boya(50, 0, 100, "green", "yellow")
turtle.done()
Beklenen sonuç: Pencerede yan yana iki ayrı kare görürsün. Soldaki kare kırmızı dolgulu ve mavi kenarlıdır, sağdaki sarı dolgulu ve yeşil kenarlıdır. İkisinin arasında bağlayıcı bir çizgi yoktur. Konuma gitme işi penup() ile yapıldı ve begin_fill() çağrılmadan önce bitti. Böylece dolguya yalnızca karenin köşeleri girdi.
Kendin dene
boyutdeğerini 60 ya da 150 yapıp karelerin birbirine değip değmediğini gözle.- Üçgen için
range(4)yerinerange(3), dönüş açısı için90yerine120yaz. Fonksiyonun adını daucgen_boyayapabilirsin. - Üçüncü bir çağrı ekleyip konumu ve renkleri değiştir.
Böyle küçük programları kendi başına kurarken takılıyorsan, birebir Python dersleri genel Python öğrenme yolunun bir parçası olarak fonksiyon, döngü ve parametre mantığını kişiye özel bir müfredatla birlikte çalışmana imkân verir.
Sık Sorulan Sorular
Turtle'da done() ile mainloop() arasında fark var mı?
Pratikte yok. İkisi de olay döngüsünü başlatır ve pencereyi sen kapatana kadar açık tutar. done(), mainloop() için kısayol olarak kullanılır. Programın en sonuna bir kez yazman yeterlidir.
Dolgu rengi neden siyah çıkıyor?
Dolgu rengi hiç belirlenmediyse Turtle varsayılan rengi kullanır ve şekil siyah dolar. color("blue", "red") ya da fillcolor("red") çağrısını begin_fill() satırından önce yaz. Renk adını yanlış yazarsan Turtle bunu hata mesajıyla bildirir.
Daire ya da yıldız gibi şekiller de begin_fill ile boyanır mı?
Evet, mantık aynıdır. Daire için begin_fill() ile end_fill() arasına circle(50) yazarsın. Yıldız gibi kendini kesen şekillerde dolgunun ortada nasıl göründüğünü kendin deneyerek gör.
Boyamada hatanın büyük kısmı sıradan çıkar. Önce rengi seç, sonra begin_fill() ile başla, şekli çiz ve end_fill() ile bitir. Sonuç beklediğin gibi değilse görsel belirtiye bakıp hangi adımın yer değiştirdiğini bulabilirsin.