Python Tkinter Temel Bilgiler

ServerErr0r

uid=0(root)
Katılım
12 Eyl 2009
Mesajlar
2,330
Reaction score
0
Puanları
0
Tkinter // Temel Bilgiler Giriş

Bir programlama dilini ne kadar iyi bilirseniz bilin, bu programlama diliyle ne kadar güçlü programlar yazarsanız yazın, eğer programınız kullanışlı bir arayüze sahip değilse programınızın kullanıcı düzeyinde pek ilgi çekmeyeceği kesin... Belki bilgisayar kurtları komut satırından çalışan programları kullanmaktan gocunmayacaktır, hatta sizi takdir de edecektir, ama "son kullanıcı" denen kesime hitap etmediğiniz sürece dikkati çekmeniz güç... Bu dikkati çekme meselesi de çoğunlukla ancak cicili bicili arayüzler vasıtasıyla aşılabiliyor. Diyelim ki konsol üzerinde muhteşem işler yapan dehşetengiz bir program yazdınız ve piyasanın kucağına attınız... "Son kullanıcı", programınızı kurup çalıştırmayı denediğinde alacağınız ilk tepki: "Ama bu program çalışmıyoo!" şeklinde olacaktır... Kızsak da kızmasak da ne yazık ki durum bu.. Dost acı söyler!

Madem arayüz denen şey bu kadar önemli şu halde biz de bu bölümde Python"da nasıl grafik arayüzler tasarlayacağımızı inceleyelim.

Arayüzler tasarlamak üzere geliştirilmiş değişik alternatifler arasında biz en yaygını olan Tkinter"i kullanacağız. Aslında Tkinter Python içinde bir modül... Neyse... Lafı daha fazla uzatmadan işe koyulalım:
Pencere Oluşturmak

Arayüz denilen şey tabii ki penceresiz olmaz. Dolayısıyla arayüz programlamanın ilk adımı çalışan bir pencere yaratmak olacaktır.

Başta söylediğimiz gibi, arayüz tasarlarken Tkinter modülünden faydalanacağız. Daha önceki yazılardan, Python"da nasıl modül “import” edildiğini hatırlıyorsunuz. Şimdi hemen Python komut satırında şu komutu veriyoruz:
from Tkinter import *

Eğer hiçbir şey olmadan alt satıra geçildiyse sorun yok. Demek ki sizde Tkinter modülü yüklü. Ama eğer bu komutu verdiğinizde alt satıra düşmek yerine bir hata mesajı alıyorsanız, sebebi gerekli modülün, yani Tkinter"in sizde yüklü olmamasıdır. Eğer hal böyleyse yapacağımız işlem çok basit: Gidip paket yöneticisinden “python-tk” adlı paketi kuracağız.

Modülle ilgili kısmı sağ salim atlattıysanız, artık şu komutu verebilirsiniz:
Tk()

Eğer buraya kadar herhangi bir hata yapmadıysak, ekrana pırıl pırıl bir arayüz penceresi zıpladığını görmemiz gerekiyor. Çok güzel, değil mi? Ne yalan söyleyeyim, ben bu pencereyi ilk gördüğümde çok heyecanlanmıştım... Neyse... Konumuza dönelim...

Gördüğünüz gibi “Tk()” komutuyla önümüze atlayan pencere, bir pencerenin sahip olması gereken bütün temel özelliklere sahip. Yani pencerenin sağ üst köşesinde pencereyi kapatmaya yarayan bir çarpı işareti, onun solunda pencereyi büyütüp küçültmemizi sağlayan karecik ve en solda da pencereyi görev çubuğuna indirmemizi sağlayan eksi işareti bütün işlevselliğiyle karşımızda duruyor. Ayrıca farkedeceğiniz gibi bu pencereyi istediğimiz gibi boyutlandırmamız da mümkün.

Bu komutları hangi platformda verdiğinize bağlı olarak, pencerenin görünüşü farklı olacaktır. Yani mesela bu komutları Windows"ta verdiyseniz, Windows"un renk ve şekil şemasına uygun bir pencere oluşacaktır. Eğer Gnome kullanıyorsanız, pencerenin şekli şemali, Gnome"nin renk ve şekil şemasına uygun olarak KDE"dekinden farklı olacaktır...

Yukarıda verdiğimiz “Tk()” komutuyla aslında Tkinter modülü içindeki “Tk” adlı sınıfı çağırmış olduk. Bu sınıfın neye benzediğini merak eden arkadaşlar /usr/lib/python2.4/lib-tk/ klasörü içindeki Tkinter.py modülü içinde “class Tk” satırını arayarak bunun ne menem bir şey olduğuna bakabilir (Gereksiz bilgi: "ne menem" ifadesinin doğrusu aslında "ne mene"... Ama hep "ne menem" biçiminde kullanıla kullanıla, yanlış kullanım doğru kullanım halini almış...)

Bu arada herhangi bir hayal kırıklığı yaşamak istemiyorsanız, yukarıdaki “from Tkinter import *” ve “Tk()” komutlarını verirken büyük-küçük harfe dikkat etmenizi tavsiye ederim. Çünkü “Tkinter” ile “tkinter” aynı şeyler değildir...

Eğer bir arayüz oluşturacaksak sürekli komut satırında çalışamayız: Mutlaka yukarıda verdiğimiz komutları bir yere kaydetmemiz gerekir. Bunun için hemen boş bir kwrite belgesi açıp içine şu satırları ekleyelim:
from Tkinter import *
Tk()

Eğer bu dosyayı bu şekilde kaydeder ve çalıştırmayı denersek açılmasını beklediğimiz pencere açılmayacaktır. Burada komut satırından farklı olarak ilave bir satır daha eklememiz gerekiyor. Yani kodumuzun görünümü şu şekilde olmalı:
from Tkinter import *
Tk()
mainloop()

Buradaki “mainloop()” satırı, bir “döngü” yaratarak, kendisinden önce gelen kodlarla belirlenen özelliklere göre bir pencere oluşturulmasını sağlıyor. Bu satırla yaratılan “döngü” sayesinde de oluşturulan pencere (aksi belirtilmedikçe veya kullanıcı pencereyi kapatmadıkça) ekranda hep açık kalabiliyor.

Şimdiye kadar Python"da Tkinter yardımıyla boş bir pencere oluşturmayı öğrendik... Bu heyecan içinde bu kodları elli defa çalıştırıp elli defa boş bir pencere oluşmasını izlemiş olabilirsiniz... Ama bir süre sonra boş pencere sizi sıkmaya başlayacaktır. O yüzden, gelin isterseniz şimdi de bu boş pencereyi nasıl dolduracağımızı öğrenelim. Hemen yeni bir kwrite belgesi açarak içine şu satırları ekliyoruz:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()

İlk iki satırın ne olduğunu zaten biliyorsunuz, o yüzden açıklamaya gerek yok. Ondan sonra gelen satırda da bildiğiniz gibi Tkinter modülünü çağırdık. Bir alt satırda ise yaptığımız şey daha önce gördüğümüz “Tk()” komutuna bir ad vermekten ibaret... Biz burada “pencere” adını tercih ettik.. Tabii ki siz isterseniz emmoğlunuzun adını da verebilirsiniz... Hiç problem değil... Hatta hiç isim vermeseniz de olur. Ama kullanım kolaylığı açısından isimlendirmenin zararını değil, yararını görürsünüz... Şimdi kodlamaya kaldığımız yerden devam ediyoruz:
etiket = Label(text=”Elveda Zalim Dünya!”)
etiket.pack()
mainloop()

Burada "etiket" adlı yeni bir değişken oluşturduk. Her zamanki gibi bu "etiket" adı zorunlu bir isimlendirme değil. İstediğiniz ismi kullanmakta serbestsiniz. Ancak değişkenin ismi önemli olmasa da, içeriği önemli... "Tk()" komutu yardımıyla en başta oluşturduğumuz pencereyi bir kutu olarak düşünürsek, "etiket" adıyla tanımladığımız değişken de bu kutu üzerine yapıştırılacak bir etiket olarak düşünülebilir. Bahsettiğimiz bu kutunun üzerine etiketini yapıştırmak için "Label" adlı özel bir işlevden faydalanıyoruz. (Bu arada "label" kelimesi İngilizce"de "etiket" anlamına geliyor) "Label" ifadesini bu adla aklımıza kazımamız gerekiyor. Daha sonra bu Label ifadesine parametre olarak bir metin işliyoruz. Metnimiz "Elveda Zalim Dünya!". Metnimizin adı ise "text". "Label" ifadesinde olduğu gibi, "text" ifadesi de aklımıza kazımamız gereken ifadelerden birisi. Bunu bu şekilde öğrenmemiz gerekiyor. Kendi kendinize bazı denemeler yaparak bu satırda neleri değiştirip neleri değiştiremeyeceğinizi incelemenizi tavsiye ederim...

Bir alt satırda "etiket.pack()" ifadesini görüyoruz. Bu satır, yukarıdaki satırın işlevli hale gelmesini sağlıyor. Yani kutu üzerine etiketi yapıştırdıktan sonra bunu alıp kargoya vermemize yarıyor. Eğer bu satırı kullanmazsak bir güzel hazırlayıp etiketlediğimiz kutu kargoya verilmemiş olacağı için kullanıcıya ulaşmayacaktır.

En sondaki "mainloop()" ifadesini ise zaten tanıyorsunuz: Yukarıda yazdığımız bütün kodların işletilerek bir pencere şeklinde sunulmasını sağlıyor.

Kodlarımızın son hali şöyle olmalı:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
etiket = Label(text="Elveda Zalim Dünya!")
etiket.pack()
mainloop()

Gördüğünüz gibi yine gayet şık, içinde "Elveda Zalim Dünya!" yazan bir pencere elde ettik.

Yukarıda yazdığımız kodları alternatif olarak şu şekilde kısaltmamız da mümkün:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
etiket = Label(Tk(), text = "GUI dediğin her eve lazım!")
etiket.pack()
mainloop()

Burada dikkat ederseniz "Tk()" satırını alıp doğrudan "Label()" ifadesi içine bir parametre olarak gömdük. Bunu yaparken "text" değişkeniyle arasına bir virgül koyduğumuza dikkat edin...
Pencere Başlığı

Bildiğiniz gibi, gündelik yaşamda karşımıza çıkan pencerelerde genellikle bir başlık olur. Mesela bilgisayarınız size bir hata mesajı gösterirken pencerenin tepesinde "Hata" ya da "Error" yazdığını görürsünüz. Mesela şu anda baktığınız pencerenin en tepesinde, "Python (10. Bölüm) – Wiki.Pardus-Linux.Org – Mozilla Firefox" yazıyor. Eğer istersek biz de oluşturduğumuz pencerelerin tepesine böyle ifadeler yerleştirebiliriz. İşte bu işi yapmak, yani penceremizin başlığını değiştirmek için "title" adlı metottan yararlanmamız gerekiyor. Yani bunun için yazdığımız kodlara şuna benzer bir satır eklemeliyiz:
pencere.title("Başlık")

Hemen bu özelliği bir örnekle gösterelim ki bu bilgi kafamızda somutlaşsın:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
baslik = pencere.title("Hiç bir işe yaramayan bir pencereyim ben...")
etiket= Label(text="...ama en azından bir başlığım var!")
etiket.pack()
mainloop()

Gördüğünüz gibi pencereye başlık eklemek son derece kolay... Tek bir satırla işi halledebiliyoruz. Üstelik herhangi bir "paketleme" işlemi yapmamız da gerekmiyor.

Pencerelerle ilgili daha karmaşık özelliklere geçmeden önce isterseniz burada bir durup şimdiye kadar öğrendiklerimizi çok kısa bir şekilde özetleyelim:

1. Öncelikle "from Tkinter import *" diyerek gerekli modülü yüklememiz gerekiyor.

2. Ardından " Tk()" yardımıyla boş bir pencere oluşturuyoruz. Kullanım kolaylığı açısından " Tk()" ifadesini isimlendirerek bir değişkene atamayı tercih edebilirsiniz. Örneğin; kebap = Tk()

3. Bundan sonra pencere içine yazmak istediğimiz ifadeyi içeren bir etiket hazırlamamız gerekiyor. Bu etiketi alıp "Tk()" isimli kutunun üzerine yapıştıracağız. Bu iş için bize "Label()" adlı araç yardımcı olacak. Bu fonksiyonun parametresi olarak yazacağımız "text" adlı değişkene istediğimiz metni girebiliriz. Mesela: oyun = label(text="Bilgisayarınıza virüs bulaşmış!")

4. Eğer istersek en baştaki "Tk()" ifadesini doğrudan "Label()" aracının bir parametresi olarak da atayabiliriz. Şöyle ki: oyun = Label(Tk(), text = "Sabit diski silmemiz gerekecek!")

5. Etiketimizi hazırladıktan sonra paketleyip kargoya vermemiz gerekiyor. Grafik arayüzün kullanıcıya ulaşması için bu gerekli... Bunun için "xxx.pack()" ifadesini kullanacağız. Buradaki "xxx" yerine, bir üst satırda hazırladığımız etiket için kullandığımız ismi yazacağız. Mesela: oyun.pack()

6. Bütün bu yazdığımız kodların işlevli hale gelebilmesi için ise en sona "mainloop()" ifadesini yerleştirmemiz gerekiyor.

7. Eğer hazırladığımız pencerenin bir de başlığı olsun istiyorsak "title" adlı metottan yararlanıyoruz.

Şu ana kadar yapabildiğimiz tek şey bir pencere oluşturup içine bir metin eklemek ve pencerede basitçe bir başlık oluşturmak. Ama tabii ki bir süre sonra bu da bizi sıkacaktır. Hem sadece bu özellikleri öğrenerek heyecan verici arayüzler hazırlamamız pek mümkün değil... En fazla, arkadaşlarımıza ufak tefek eşek şakaları yapabiliriz bu öğrendiklerimizle!

Yeri gelmişken, hazırladığımız programı, simgesi üzerine çift tıklayarak nasıl çalıştıracağımızı görelim şimdi. Gerçi daha önceki bölümlerden hatırlıyoruz bu işin nasıl yapılacağını, ama biz yine de tekrar hatırlatalım:

1. .py uzantılı dosyamızı, yani kodlarımızı hazırlarken ilk satıra #!/usr/bin/env python ifadesini mutlaka yazıyoruz.
2. Kaydettiğimiz .py uzantılı dosyaya sağ tıklayarak "özellikler"e giriyoruz
3. Burada "izinler" sekmesinde "çalıştırılabilir" ifadesinin yanındaki kutucuğu işaretliyoruz
4. "Tamam" diyerek çıkıyoruz.

Böylece artık programımızın simgesi üzerine çift tıklayarak arayüzümüzü çalıştırabiliriz.
Renkler

Dikkat ettiyseniz şimdiye dek oluşturduğumuz pencerelerde yazdığımız yazılar hep siyah renkte. Tabii ki, siz oluşturduğunuz pencereler içindeki metinlerin her daim siyah olmasını istemiyor olabilirsiniz. Öntanımlı renkleri değiştirmek sizin en doğal hakkınız. Tkinter"le çalışırken renklerle oynamak oldukça basittir. Renk işlemleri Tkinter"de birtakım ifadeler vasıtasıyla hallediliyor. Python dilinde bu ifadelere "seçenek" (option) adı veriliyor. Mesela daha önce öğrendiğimiz ve etiket içine metin yerleştirmemizi sağlayan "text" ifadesi de bir "seçenek"tir... Şimdi öğreneceğimiz seçeneklerin kullanımı da tıpkı bu "text" seçeneğinin kullanımına benzer.
fg seçeneği

Diyelim ki pencere içine yazdığımız bir metni, daha fazla dikkat çekmesi için kırmızı renkle yazmak istiyoruz. İşte bu işlem için kullanmamız gereken şey "fg" seçeneği... Bu ifade İngilizce"deki "foreground" (önplan, önalan) kelimesinin kısaltması oluyor. Hemen bir örnek verelim:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
pencere.title("Hata!")
etiket = Label(text = "Hata: Bilinmeyen Hata 404", fg="red")
etiket.pack()
mainloop()

Gördüğünüz gibi yaptığımız tek şey "fg" seçeneğini etiketin içine yerleştirmek. Burada kırmızı renk için kullandığımız kelime, İngilizce"de "kırmızı" anlamına gelen "red" sözcüğü... Yani "insan" dilinde kullanılan renkleri doğrudan Tkinter"de de kullanabiliyoruz. Tabii bu noktada biraz İngilizce bilmek işinizi bir hayli kolaylaştıracaktır. Tkinter"de kullanabileceğimiz, İngilizce renk adlarından birkaç tanesini hemen sıralayalım:

red = kırmızı
white = beyaz
black = siyah
yellow = sarı
blue = mavi
brown = kahverengi
green = yeşil
pink = pembe

Tkinter"de kullanılabilecek renk adları bunlarla sınırlı değil. Eğer mevcut renk listesini görmek isterseniz, şu adrese bir bakabilirsiniz: http://www.tcl.tk/man/tcl8.3/TkCmd/colors.htm
bg seçeneği

Bu da İngilizce"deki "background" (arkaplan, arkaalan) kelimesinin kısaltması. Adından da anlaşılacağı gibi pencereye yazdığımız metnin arkaplan rengini değiştirmeye yarıyor. Kullanımı şöyle:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
pencere.title("Hata!")
etiket = Label(text = "Hata: Bilinmeyen Hata 404", bg="blue")
etiket.pack()
mainloop()

Yukarıda verdiğimiz renkleri bu seçenek için de kullanabilirsiniz. Ayrıca bu seçenek bir önceki "fg" seçeneğiyle birlikte de kullanılabilir:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
pencere.title("Hata!")
etiket = Label(text = "Hata monitörle sandalyenin tam arasında!", fg="red", bg="black")
etiket.pack()
mainloop()
Yazı Tipleri (Fonts)

Tkinter bize renklerin yanısıra yazı tipleriyle de oynama imkanı veriyor. Hazırladığımız pencerelerdeki yazı tiplerini değiştirmek için, tıpkı renklerde olduğu gibi, yine bazı seçeneklerden faydalanacağız. Burada kullanacağımız seçeneğin adı, "font". Bunu kullanmak için kodlarımız arasına şuna benzer bir "seçenek" eklememiz gerekiyor.
font= "Helvetica 14 bold"

Burada tahmin edebileceğiniz gibi, "Helvetica" yazı tipini; "14" yazı boyutunu; "bold" ise yazının kalın olacağını gösteriyor. Örnek bir kullanım şöyledir:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
etiket = Label(text="Merhaba Dostlar!", font="Times 15 italic")
etiket.pack()
mainloop()

Burada yazı tipi olarak "Times"; yazı boyutu olarak "15"; yazı biçimi olarak ise "italic", yani "yatık" biçim seçtik. "font" seçeneği ile birlikte kullanabileceğimiz ifadeler şunlardır:

italic = yatık
underline = altı çizili
bold = kalın
overstrike = kelimenin üstü çizili

Yazı tipi olarak ise şunları kullanabilirsiniz:
Century Schoolbook L
DejaVu Sans
DejaVu Sans
DejaVu Sans Condensed
DejaVu Sans Mono
DejaVu Serif
DejaVu Serif
Dingbats
FreeMono
FreeSans
FreeSerif
Nimbus Mono L
Nimbus Roman No9 L
Nimbus Sans L
Standard Symbols L
URW Bookman L
URW Chancery L
URW Gothic L
URW Palladio L
pardus

Bu listede birden fazla kelimeden oluşan yazı tiplerini gösterirken kelimeleri birleşik yazmamız gerekiyor. Mesela "DejaVu Sans"ı seçmek için "DejaVuSans" yazmamız lazım...
Metin Biçimlendirme

Daha önceki yazılarımızda öğrendiğimiz metin biçimlemeye yarayan işaretleri Tkinter"de de kullanabiliyoruz. Yani mesela şöyle bir şey yapabiliyoruz:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
etiket = Label(text="Merhaba Dostlar!\n\tNasılsınız?", font="DejaVuSans 15 italic")
etiket.pack()
mainloop()

Gördüğünüz gibi, daha önceki yazılarımızda öğrendiğimiz "\n" ve "\t" kaçış dizilerini burada da kullanabiliyoruz.
İmleçler

Arayüzlerinizi oluştururken farklı imleç şekilleri kullanmak da isteyebilirsiniz. Bunun için kullanacağımız seçenek "cursor". Mesela:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
etiket = Label(text="Deneme 1,2,3...", cursor="bottom_side")
etiket.pack()
mainloop()

Burada, imleci pencere üzerine getirdiğimizde imlecin ters ok şekli aldığını görürüz. Kullanılabilecek imleç isimleri için şu sayfaya bakabilirsiniz: http://www.dil.univ-mrs.fr/~garreta/PythonBBSG/docs/Tkinter_ref.pdf

Burada 10. ve 11. sayfalarda hoşunuza gidebilecek imleç isimlerini seçebilirsiniz.
Pencere Boyutu

Diyelim ki içinde sadece bir "etiket" barındıran bir pencere oluşturduk:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
etiket = Label(text="Hata!")
etiket.pack()
mainloop()

Bu kodları çalıştırdığımızda karşımıza çıkan pencere çok küçük. O yüzden pencerenin tepesindeki eksi, küçük kare ve çarpı işaretleri görünmüyor. Bunları görebilmek için pencereyi elle boyutlandırmamız gerekiyor. Tabii bu her zaman arzu edilecek bir durum değil. Bu gibi durumları engellemek ve penceremizi istediğimiz boyutta oluşturabilmemiz için, Tkinter bize gayet kullanışlı bir imkan sunuyor:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
pencere.geometry("100x100+15+100")
etiket = Label(text="Hata!")
etiket.pack()
mainloop()

Gördüğünüz gibi, burada pencere.geometry ifadesinin karşısına birtakım sayılar ekleyerek penceremizi boyutlandırıyoruz. İlk iki rakam (100x100) penceremizin 100x100 boyutunda olduğunu; son iki rakam ise (+15+100) penceremizin ekrana göre soldan sağa doğru 15. pozisyonda; yukarıdan aşağıya doğru ise 100. pozisyonda açılacağını gösteriyor. Yani bu satır sayesinde penceremizin hem boyutunu hem de konumunu değiştirmiş oluyoruz. Bu dört rakamı değiştirerek kendi kendinize denemeler yapmanızı tavsiye ederim.

Şimdi son bir özellikten bahsedip bu konuyu kapatalım... Gördüğünüz gibi oluşturduğumuz bir pencere ek bir çabaya gerek kalmadan bir pencerenin sahip olabileceği bütün temel nitelikleri taşıyor. Buna pencerenin kullanıcı tarafından serbestçe boyutlandırılabilmesi de dahil... Ancak bazı uygulamalarda bu özellik anlamsız olacağı için (mesela hesap makinelerinde) kullanıcının pencereyi boyutlandırmasına engel olmak isteyebilirsiniz. Bu işi yapmak için şu kodu kullanıyoruz:
pencere.resizable(width=FALSE, height=FALSE)

Örnek bir uygulama şöyle olacaktır:
#!/usr/bin/env python
#-*-coding:utf-8-*-
from Tkinter import *
pencere = Tk()
pencere.resizable(width=FALSE, height=FALSE)
etiket = Label(text="Deneme 1,2,3...", cursor="bottom_side")
etiket.pack()
mainloop()
Gördüğünüz gibi bu kodlar çalıştırıldığında ortaya çıkan pencere hiçbir şekilde boyutlandırma kabul etmiyor...

Kaynak:wiki.pardus-linux.org
 
Geri
Üst