İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python Turtle ile Rastgele Desen Nasıl Çizilir? Adım Adım Kod

python-turtle-rastgele-desen-cizme
Bu yazıda neler var?
  1. Turtle ve random: Pencereyi ve Kalemi Hazırlama
  2. Tek Parça Çalışan Kod: Renkli Spiral Benzeri Rastgele Desen
  3. Parça 1, Rastgelelik: randint, randrange ve colormode(255)
  4. Parça 2, Döngü: Her Turda Yeni Değer Üretmek
  5. Parça 3, Sınır Kontrolü: Çizgi Pencereden Taşmasın
  6. Pencere Hemen Kapanıyor mu? done() ve Sık Yapılan Hatalar
  7. Kendi Desenini Geliştir: Denemeler ve Sonraki Adım
  8. Sık Sorulan Sorular

Python Turtle ile rastgele desen çizmek için random modülüyle uzunluk, açı ve renk değerleri üretir, bu değerleri bir döngü içinde Turtle komutlarına verirsin. Döngü her turda yeni bir sayı seti aldığı için çizgilerin yönü, boyu ve rengi değişir; desen her çalıştırmada farklı bir akışla ortaya çıkabilir. Aşağıda önce pencereyi hazırlayacak, sonra tek parça çalışan bir kod verip onu üç küçük parçaya ayırarak inceleyeceksin.

Turtle ve random: Pencereyi ve Kalemi Hazırlama

İki modülün işi ayrıdır. turtle çizimi yapar: pencereyi açar, kalemi ilerletir, döndürür, renklendirir. random ise yalnızca sayı üretir. Birinin ürettiği sayıyı diğerine vermek senin işin olacak.

Hazırlık için dört şey gerekir: iki import satırı, bir pencere, bir kalem ve birkaç kalem ayarı.

import turtle
import random

screen = turtle.Screen()
screen.setup(600, 600)
screen.bgcolor("black")

t = turtle.Turtle()
t.speed(0)
t.pensize(2)

turtle.done()

Bu kodu çalıştırdığında siyah, 600x600 boyutunda boş bir pencere ve ortada küçük bir ok biçiminde kalem görmelisin. Henüz çizim yoktur, çünkü kalemi hareket ettiren bir komut yazmadık. Satırların görevleri şöyledir:

  • turtle.Screen(): çizimin yapılacağı pencereyi temsil eden nesneyi verir.
  • screen.setup(600, 600): pencerenin genişlik ve yüksekliğini piksel olarak belirler.
  • screen.bgcolor("black"): arka plan rengini ayarlar. Koyu zemin, renkli çizgileri daha görünür kılar.
  • turtle.Turtle(): çizen kalem nesnesini oluşturur; sonraki komutların hepsini bu nesne üzerinden verirsin.
  • t.speed(0): 0 değeri animasyonsuz, en hızlı çizim anlamına gelir. 1 ile 10 arası değerler yavaştan hızlıya doğru gider.
  • t.pensize(2): çizgi kalınlığını belirler.
  • turtle.done(): pencereyi açık tutar, kapatma sorununu sonraki bölümlerde ele alacağız.

Dosyanı turtle.py diye kaydetme: Python import turtle satırında kendi dosyanı bulup modülün yerine onu yükleyebilir ve hata verir. desen.py gibi farklı bir ad seç.

Döngü ve fonksiyon çağırmayı ne kadar iyi bildiğinden emin değilsen, devam etmeden önce ücretsiz Python bilgi testini çözerek temelini ölçebilirsin.

Tek Parça Çalışan Kod: Renkli Spiral Benzeri Rastgele Desen

Tek Parça Çalışan Kod: Renkli Spiral Benzeri Rastgele Desen

Önce kodu hiç değiştirmeden çalıştır. Sonraki üç bölümde onu rastgelelik, döngü ve sınır kontrolü olarak parça parça açacağız; amaç kodu kopyalayıp geçmek değil, her parçanın çizimi nasıl etkilediğini görmek.

import turtle
import random

screen = turtle.Screen()
screen.setup(600, 600)
screen.bgcolor("black")
screen.colormode(255)

t = turtle.Turtle()
t.speed(0)
t.pensize(2)

# 1) RASTGELELİK: her çağrıda yeni uzunluk, açı ve renk üretir
def rastgele_adim():
    uzunluk = random.randint(10, 80)
    aci = random.randrange(15, 90)
    renk = (random.randint(0, 255),
            random.randint(0, 255),
            random.randint(0, 255))
    return uzunluk, aci, renk

# 2) DÖNGÜ: her turda yeni değerle bir çizgi çizer
for tur in range(150):
    uzunluk, aci, renk = rastgele_adim()
    t.pencolor(renk)
    t.forward(uzunluk)
    t.right(aci)

    # 3) SINIR KONTROLÜ: kenara yaklaşınca merkeze dön
    x, y = t.position()
    if abs(x) > 270 or abs(y) > 270:
        t.penup()
        t.goto(0, 0)
        t.pendown()

turtle.done()

Beklenen çıktı: siyah zeminde renkli, her çalıştırmada farklı bir çizgi akışı. Çizgiler çoğunlukla merkez çevresinde dönerek ilerler; kalem kenara yaklaştığında izsiz biçimde ortaya döner ve çizime oradan devam eder. İki çalıştırmanın aynı görüntüyü vermemesi normaldir.

Parça 1, Rastgelelik: randint, randrange ve colormode(255)

Rastgele desenin değişmesini sağlayan şey Turtle değil, her döngü turunda yeni değer üreten random çağrılarıdır. Kalem her seferinde aynı komutu uygular; fark, komuta verilen sayıdadır. Kodda bu sayıları rastgele_adim() fonksiyonu üretir.

randint ve randrange farkı

İkisi de tam sayı üretir, tek fark bitiş değerindedir. random.randint(10, 80) 10 ile 80 arasında, 80 dahil bir sayı verir. random.randrange(15, 90) ise 15 ile 89 arasında bir sayı verir; bitiş değeri olan 90 hariçtir, tıpkı range() fonksiyonunda olduğu gibi.

colormode(255) neden gerekli?

Turtle renk değerlerini varsayılan olarak 0 ile 1 arasında bekler. screen.colormode(255) yazmadan (120, 45, 200) gibi değerler verirsen renk hatası alırsın. Bu ayarla birlikte kırmızı, yeşil ve mavi kanalların her biri 0-255 arası tam sayı olmalıdır; bu yüzden renkte randint kullandık.

Değiştir ve gör

Aşağıdaki değişiklikleri tek tek dene ve her seferinde yalnızca bir değeri oynat:

  1. randint(10, 80) yerine randint(5, 20) yaz: çizgiler kısalır ve desen yoğunlaşır.
  2. randint(10, 80) yerine randint(10, 80)'i randint(40, 120) yap: çizgiler uzar, desen ferahlar ve kenara daha sık ulaşır.
  3. randrange(15, 90) yerine randrange(5, 30) yaz: dönüşler yumuşar, kıvrımlı bir akış oluşur.
  4. randrange(90, 180) dene: dönüşler sertleşir ve çizim zikzaklı bir görünüm alır.
  5. Kırmızı kanalı random.randint(200, 255) yap: renkler genellikle sıcak tonlara kayar.
  6. range(150) yerine range(400) yaz: aynı kurallarla daha çok çizgi çizilir, desen kalabalıklaşır.

Parça 2, Döngü: Her Turda Yeni Değer Üretmek

Döngü, kalemin aynı hareketi tekrar tekrar yapmasını sağlar. Desenin rastgele olması içinse randint çağrılarının döngünün içinde durması gerekir. Rastgele desenin değişmesini sağlayan şey Turtle değil, her döngü turunda yeniden üretilen değerlerdir.

Aşağıdaki iki kısa parça arasındaki tek fark, değerlerin üretildiği satırın yeridir. Kalemin adı t, randint ise random modülünden içe aktarılmış olsun.

Döngü dışında üretilen değerler

uzunluk = randint(10, 50)
aci = randint(20, 40)
for i in range(120):
    t.forward(uzunluk)
    t.right(aci)

Değerler yalnızca bir kez seçilir. Her tur aynı boyda çizgi çizilir ve aynı açıyla dönülür. Sonuç düzenli, kendini tekrar eden bir şekildir. Kodu yeniden çalıştırırsan şekil değişebilir, ama bir çizimin içinde çeşitlilik görmezsin.

Döngü içinde üretilen değerler

for i in range(120):
    t.pencolor(randint(0, 255), randint(0, 255), randint(0, 255))
    t.forward(randint(10, 50))
    t.right(randint(20, 40))

Her turda renk, uzunluk ve açı yeniden seçilir. Çizim renkli olur ve her çalıştırmada farklı bir çizgi akışı verir. Çizgi renkleri turdan tura değişir.

Çizimim neden hep aynı?

  1. randint satırları for satırının altında ve girintili mi?
  2. Renk de döngü içinde mi seçiliyor, yoksa yalnızca uzunluk mu rastgele?
  3. Kodda random.seed(...) var mı? Sabit bir tohum değeri her çalıştırmada aynı diziyi üretir, bu satırı silince çizim yine değişir.

Tur sayısı ve açı aralığı

range(60) yerine range(300) yazarsan çizgiler birbirinin üzerinden geçer ve desen yoğunlaşır. Açı aralığı ise desenin karakterini belirler. randint(20, 40) gibi dar bir aralık çizgileri daha düzenli, yavaş kıvrılan bir akışa sokar. randint(10, 170) gibi geniş bir aralıkta kalem sert dönüşler yapar ve çizim daha dağınık görünür.

Parça 3, Sınır Kontrolü: Çizgi Pencereden Taşmasın

Parça 3, Sınır Kontrolü: Çizgi Pencereden Taşmasın

Kalem rastgele ilerlediği için bir noktada pencere kenarına varabilir. Bunu önlemek için her adımdan sonra konumu xcor() ve ycor() ile okur, kenara yaklaştıysa kalemi çizgi bırakmadan merkeze götürürsün. Pencereyi 600x600 piksel ayarladıysan merkez (0, 0) olur ve kenarlar merkezden yaklaşık 300 piksel uzaktadır.

for i in range(120):
    t.pencolor(randint(0, 255), randint(0, 255), randint(0, 255))
    t.forward(randint(10, 50))
    t.right(randint(20, 40))

    if abs(t.xcor()) > 250 or abs(t.ycor()) > 250:
        t.penup()
        t.goto(0, 0)
        t.pendown()

abs() eksi işaretini atar. Böylece sol ve sağ kenarı tek koşulla kontrol edersin, aynısı alt ve üst kenar için de geçerlidir. Eşiği aşınca kalem kalkar, merkeze gider ve yeniden iner. Çizgi kenardan taşmak yerine merkezden yeni bir akışla devam eder.

Eşiği seçerken en uzun adımı da hesaba kat. Kenar mesafesinden en uzun adımı çıkarırsan eşiğin üst sınırını bulursun. Adımların 50 pikseli geçmediği bu örnekte 250 uygundur.

Sıra önemlidir:

  • penup() çağrılmazsa kalem kenardan merkeze uzun bir çizgi çeker.
  • pendown() unutulursa kalem merkezden sonra hiçbir şey çizmez.

Eşik değeri de desenin görünümünü değiştirir. 100 gibi küçük bir eşik, kalemi sık sık merkeze döndürdüğü için merkez çevresinde yoğun bir desen verir. 280 gibi büyük bir eşik çizginin daha geniş yayılmasına izin verir ve çizim pencerenin kenarlarına doğru uzanır.

Pencere Hemen Kapanıyor mu? done() ve Sık Yapılan Hatalar

Çizim biter bitmez program da biter ve pencere kapanır. Dosyanın son satırına yazdığın done() Turtle'ın olay döngüsünü başlatır. Pencere sen kapatana kadar açık kalır. Bu yüzden çizim komutlarından sonra t.screen.exitonclick() ya da done() gibi bir çağrı bulunmalıdır. İşler yolunda gitmiyorsa aşağıdaki listeyi sırayla kontrol et:

  • done() unutmak: Pencere bir an görünüp kapanıyorsa dosyanın sonuna done() ekle.
  • colormode(255) yazmamak: 0-255 arası tamsayılarla renk verince hata alıyorsan çizime başlamadan önce colormode(255) çağır, çünkü Turtle varsayılan olarak 0-1 arası değerler bekler.
  • random çağrılarını döngü dışına yazmak: Tüm çizgiler aynı boy ve renkteyse bu satırları döngünün içine taşı.
  • randrange'in bitiş değerini dahil sanmak: randrange(0, 255) 255'i hiç üretmez, 255 de çıksın istiyorsan randrange(0, 256) ya da randint(0, 255) kullan.
  • penup ile pendown sırasını karıştırmak: Merkeze uzun çizgi çekiliyorsa penup() goto()'dan önce, pendown() ise sonra gelmeli.
  • Dosyayı turtle.py diye kaydetmek: Python kendi dosyanı modül sanıp içe aktardığı için tuhaf hatalar çıkar, dosyayı desen.py gibi başka bir adla kaydet.
  • Girinti hatasıyla çizim komutlarını döngü dışında bırakmak: Kalem yalnızca bir kez hareket ediyorsa forward ve right satırlarının for satırından bir girinti içeride olduğunu kontrol et.

Kendi Desenini Geliştir: Denemeler ve Sonraki Adım

Çalışan kodu kendi değerlerinle oynatarak geliştirebilirsin. Aşağıdaki denemelerin her birinde tek bir değeri değiştir, çizimi çalıştır ve farkı izle:

  1. Açı aralığını daralt: Dönüş açısını küçük bir aralıkta tut. Çizgiler neredeyse düz akar, kıvrımlar yumuşar.
  2. Uzunluğu büyüt: Adım uzunluğunun üst sınırını artır. Desen daha açık ve geniş görünür, sınır kontrolü daha sık devreye girer.
  3. Turu artır: Döngüyü daha çok tekrarlat. Desen yoğunlaşır ve pencere dolmaya başlar.
  4. Pensize'ı rastgele yap: Her turda pensize() komutuna küçük bir rastgele değer ver. Çizgi kalınlığı değişir, desen daha el yapımı bir görünüm kazanır.
  5. Renk aralığını sınırla: Kırmızı kanalı yüksek tutup yeşil ve maviyi düşük aralıkta üret. Çizim yalnız kırmızı tonlarında kalır.

Fonksiyon yazmayı, listelerle çalışmayı ve kendi projeni geliştirmeyi birebir ilerlemek istersen, birebir Python dersleri bu adımları kişiye özel müfredatla işlemek için kurgulanmıştır.

Bir seferde tek değeri değiştirmek, hangi değişikliğin hangi etkiyi yarattığını görmeni kolaylaştırır. Birkaç deneme sonra kendi desenini ortaya çıkaracak değerlere ulaşırsın.

Sık Sorulan Sorular

Python Turtle'da her çalıştırmada aynı rastgele deseni nasıl elde ederim?

Çizime başlamadan önce random.seed(42) gibi bir çağrı yap; parantez içine istediğin bir sayıyı yazabilirsin. Aynı sayıyla başlayan random modülü aynı değer dizisini üretir, böylece kodu her çalıştırdığında aynı desen çıkar. Sayıyı değiştirirsen başka bir desen elde edersin. Çağrıyı kaldırırsan desen yeniden her çalıştırmada değişir.

Turtle çizimini hızlandırmak için ne yapabilirim?

En basit yol, çizime başlamadan önce speed(0) yazmaktır; bu, kalemin en hızlı hızını seçer. Daha da hızlı sonuç için tracer(0) ile ekran güncellemesini kapatıp çizim bittiğinde update() çağırabilirsin. Bu durumda çizim adım adım izlenmez, tamamlanmış hâliyle bir anda görünür.

İlk görsel projen çalışır durumda; şimdi değerlerle oynayıp kendi desenini üretme sırası sende.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara