Python Turtle penceresi, dosyadan çalıştırılan kod çizim komutlarını tamamlayıp son satıra ulaştığında kapanabilir. Çizimden sonra turtle.mainloop() çağrısı eklemek, Turtle ekranının olay döngüsünü başlatır ve pencerenin açık kalıp kullanıcı etkileşimlerine yanıt vermesini sağlar. Çalıştırma ortamına göre gözlenen davranış değişebildiği için hiç açılmayan pencere ile açılıp hemen kapanan pencereyi aynı belirti olarak değerlendirmemek gerekir.
Temel Python söz dizimini ve dosyadan çalıştırma mantığını pekiştirmek için Ücretsiz Sıfırdan Temel Python video eğitimi sayfasını inceleyebilirsin.
Python Turtle penceresi neden hemen kapanır?

Bir Python dosyası çalıştırılırken çizim komutları sırayla yürütülür. turtle.forward() ve turtle.left() gibi çağrılar çizimi oluşturabilir, ancak bu çağrıların tamamlanması pencerenin kullanıcıdan yeni olay beklemeye devam edeceği anlamına gelmez. Dosyada başka komut kalmadığında ve çalıştırma ortamı kendi olay döngüsünü sürdürmediğinde Python işlemi sonlanabilir. Bu sırada Turtle penceresi de kapanabilir.
Bu nedenle mainloop() çizimin kendisini yapmak için değil, çizim tamamlandıktan sonra pencerenin yaşamını sürdürmek için kullanılır. Python Turtle belgelerinde turtle.mainloop() çağrısının programın sonuna eklenmesi ve olay döngüsünü başlatması açıklanır. Ekran nesnesiyle çalışıyorsan aynı rolü screen.mainloop() üstlenir.
Buradaki ayrım teşhis için önemlidir. Hiç açılmayan bir pencerede sorun, pencerenin oluşturulması veya kodun o aşamaya ulaşmasıyla ilgili olabilir. Açılıp hemen kapanan pencerede ise çizim tamamlanmış, fakat dosya sonuna gelindiğinde pencereyi açık tutan olay döngüsü başlatılmamış olabilir. Aynı kodun farklı çalıştırma ortamlarında farklı görünmesi bu yüzden mümkündür.
mainloop() nasıl çalışır? Kare örneğiyle karşılaştır
mainloop() farkını görmek için aynı kare çizimini önce olay döngüsü olmadan, sonra olay döngüsüyle çalıştırabilirsin.
import turtle
for _ in range(4):
turtle.forward(100)
turtle.left(90)
Beklenen davranış: Turtle dört kenarlı bir kare çizer. Kodda print() bulunmadığı için programın kendi ürettiği zorunlu bir terminal metni oluşmaz. Dosyadan çalıştırıldığında pencere kapanabilir veya bazı ortamlarda açık kalabilir.
Şimdi aynı çizim kodunun sonuna turtle.mainloop() çağrısını ekleyelim:
import turtle
for _ in range(4):
turtle.forward(100)
turtle.left(90)
turtle.mainloop()
Beklenen davranış: Yine dört kenarlı bir kare çizilir ve zorunlu bir terminal metni oluşmaz. Fark, son satırdaki olay döngüsüdür. Program, Turtle penceresini etkileşimli tutmayı amaçlar ve pencere kapatılana kadar pencere olaylarının işlenmesine devam eder.
mainloop() basit bir bekleme ya da uyku komutu değildir. Tkinter, kullanıcı girdilerini ve ekran güncellemelerini etkin bir olay döngüsü çalışırken işler. mainloop() bu döngüyü başlatır; yeniden çizim, kullanıcı etkileşimleri ve pencerenin kapatılması gibi olayların işlenmesini sağlar.
Ekran nesnesini açıkça tanımladığın kodlarda screen = turtle.Screen() satırını kullanıp, çizimden sonra screen.mainloop() çağırabilirsin. Bu kullanım, olay döngüsünü doğrudan ilgili ekran nesnesi üzerinden başlatır.
Python kabuğu ile dosyadan çalıştırma arasındaki fark

Python kabuğunda komutları tek tek girersin ve her komuttan sonra komut istemi yeni girdiyi bekler. Dosyadan çalıştırılan script ise satırları sırayla yürütür ve olay döngüsü gibi bir bekleme yoksa son komuta geldiğinde tamamlanır. Bu nedenle kabukta açık kalan Turtle penceresi, dosyada mainloop() çağrısının gereksiz olduğunu göstermez.
| Çalıştırma biçimi | Süreç durumu | Pencereyi yorumlama | Neyi test eder |
|---|---|---|---|
| Etkileşimli Python kabuğu | Komut istemi sonraki komutu bekler; Python süreci etkileşimlidir. | Pencerenin açık kalıyor gibi görünmesi, kabuk veya IDE'nin olayları yönetmesiyle ilişkili olabilir. Bu, dosya için tek başına kanıt değildir. | Komutları tek tek ve küçük adımlarla denemeyi. |
| Dosyadan çalıştırılan script | Satırlar sırayla yürütülür; son komutta olay döngüsü yoksa çalışma biter. | Çizim yapılmış olsa bile süreç bitince pencere kapanabilir. mainloop() olay döngüsünü başlatır. |
Import, akış, çizim ve kapanış sırasını baştan sona sınamayı. |
Kabuk veya IDE'nin olayları yönetme biçimi her ortamda aynı olmayabilir. Dosya testinde kabuktaki pencereyi ölçüt almak yerine, dosyanın çizim koduna ulaşıp ulaşmadığını ve mainloop() çağrısına geçip geçmediğini kontrol et.
Temel Python söz dizimi ve dosya çalıştırma pratiğinde birebir desteğe ihtiyaç duyuyorsan, birebir Python dersleri seçeneğini inceleyebilirsin.
Pencere hiç açılmıyor mu, yoksa açılıp hemen kapanıyor mu?
Teşhise, pencerenin hangi aşamada kaybolduğunu ayırarak başla. Dört durumu şu sırayla kontrol edebilirsin:
mainloop()satırına ulaşılmıyor. Traceback varsa,mainloop()satırına geçmeden önce oluşan import, sözdizimi veya çalışma zamanı hatasını düzelt. Traceback yoksa dosyanın gerçekten çalıştırıldığını ve çizim koduna ulaşıldığını geçiciprint()işaretleriyle kontrol et.Beklenen çıktı:
print("mainloop öncesi")çağrıdan önce görünür.print("mainloop sonrası")ise olay döngüsü sürerken görünmez, döngü sona erdikten sonra, örneğin pencere kapandığında görünür.- Pencere hiç açılmıyor.
mainloop()yalnızca olay döngüsünü başlatır.import turtle, ekran oluşturma veya ilk Turtle oluşturma adımına gelinmediyse pencere ortaya çıkmaz. Bu durumda önce dosyanın çalıştığını, önceki çıktıları ve hata mesajını kontrol et. Sadece sonamainloop()eklemek yeterli olmayabilir. - Pencere açılıp hemen kapanıyor. Çizim tamamlanıp dosya sona eriyor ve olay döngüsü başlatılmıyorsa bu davranış oluşabilir.
turtle.mainloop()veya ekran nesnesi içinscreen.mainloop()çağrısını çizim kodundan sonra, dosyanın son satırına yerleştir. Ayrıcaturtle.bye(),screen.bye()ve başka açık kapatma çağrılarını kontrol et. - Pencere Python kabuğunda açık kalıyor. Kabuk komut isteminde beklemeye devam ederken dosyadan çalışan script son komuta ulaşıp bitebilir; bu iki davranışı aynı kabul etme.
import turtlesırasında veya pencere oluşturulurkentkinterya da Tk altyapısıyla ilgili hata varsa bunu ayrıca değerlendir. Turtle grafik penceresi bu altyapıya dayandığı içinmainloop()eklemek import veya başlatma hatasını düzeltmez.
Sık Sorulan Sorular
mainloop() çağrısı çizim kodunun hangi noktasında yer almalı?
Çizim komutları, ekran ayarları ve varsa olay tanımları tamamlandıktan sonra, dosyanın son satırında yer almalı. Böylece script önce çizimi kurar, ardından olay döngüsüne girer. Döngüden sonraki kod ancak döngü sonlandığında çalışır.
Pencere hiç açılmıyorsa mainloop() eklemek neden tek başına yeterli olmayabilir?
Çünkü mainloop() pencere oluşturmaz ve önceki hataları onarmaz, yalnızca olayların işlenmesini başlatır. import turtle, ekran oluşturma veya Tk altyapısının başlatılması başarısızsa bu çağrıya ulaşılamaz ya da çağrı sorunu çözmez.
Python kabuğunda açık kalan Turtle penceresi dosyadan çalıştırılınca neden farklı davranabilir?
Kabuk Python sürecini ve komut istemini açık tutar. Kullandığın ortam pencere olaylarını da yönetebilir. Dosyadan çalıştırmada ise satırların sonuna gelindiğinde, olay döngüsü yoksa script biter. Bu yüzden kabuktaki sonuç, dosyanın sonucu için kesin ölçüt değildir.
turtle.mainloop() ile screen.mainloop() arasında nasıl seçim yapılır?
Modül düzeyinde komutlar kullanıyorsan turtle.mainloop() okunaklı bir seçimdir. Bir ekran nesnesi oluşturduysan screen.mainloop(), nesne yönelimli kullanımda da ilgili ekran nesnesinin metodu tercih edilebilir. İkisi aynı olay döngüsüne giden alternatif çağrılardır; ikisini art arda çağırma.
Özetle, önce kodun hangi satıra kadar çalıştığını, ardından olay döngüsünü ve açık kapatma çağrılarını kontrol et.