You are on page 1of 104

Pygtk Klavuzu

Srm 2.x

Frat zgl (istihza)

11/01/2012

NDEKLER I I I

1 2

Temel Bilgiler Pencere lemleri 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 Pencere Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pencereye Balk Eklemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pencere Boyutunu Ayarlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pencere Konumunu Ayarlamak Pencerelere Simge Eklemek Pencereleri Salkl bir ekilde Kapatmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boyutlandrlamayan Pencereler Oluturmak . . . . . . . . . . . . . . . . . . . . Saydam/eaf Pencereler Oluturmak . . . . . . . . . . . . . . . . . . . . . . . .

1 4

4 7 8 9 10 14 14 15
18

Pygtk'de Pencere Aralar (1. Blm) 3.1 3.2 Label Pencere Arac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Button Pencere Arac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18 30
40

Pencere Aralarnn Yerleimi 4.1 4.2 4.3 4.4 4.5 4.6 Fixed() Haznesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Table() Pencere Arac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Box() Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HBox() Haznesi VBox() Haznesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

HButtonBox() ve VButtonBox() Hazneleri . . . . . . . . . . . . . . . . . . . . .

40 47 58 59 63 66
71

Pygtk'de Pencere Aralar (2. Blm) 5.1 5.2 5.3 5.4 Entry Pencere Arac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ToggleButton Pencere Arac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CheckButton Pencere Arac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RadioButton Pencere Arac . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71 86 89 90
i

Pygtk'de Resimlerle almak 6.1 6.2 6.3 Pencere Aralarna Stoktan Resim Eklemek Pencere Aralarna Dosyadan Resim Eklemek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

Pencere Aralarna Resim ve Etiket Eklemek . . . . . . . . . . . . . . . . . . . .

95 96 97

ii

BLM

Temel Bilgiler

Python programlama dilini belli bir seviyeye kadar rendikten sonra muhtemelen konsol tag banl programlar yazmak artk size yeterli gelmemeye balayacaktr. Eminim siz de yazd nz s g programlarn gzel ve ilevli bir arayze sahip olmasn isteyeceksiniz... Python ile arayz s programlamak iin elimizde bol miktarda seenek var. rne in, e er arayz programlama g g konusunda yeniyseniz, Python programlama dilinin (yar-)resmi arayztakm olan Tkinteri renmeyi seebilirsiniz. Tkinter, Pythonun Windows srmnde kurulumla birlikte gelir. g GNU/Linux kullanclar ise, kullandklar da tmn paket yneticisini kullanarak Tkinteri sisg temlerine rahatlkla kurabilirler. Tkinter arayz takmn kullanarak gayet ilevli arayzler s hazrlayabilirsiniz. stelik Tkinteri renmek ve kullanmak olduka basittir. Tkinterin mevcut g arayz takmlar iinde en kolay renileni oldu unu rahatlkla syleyebilirim. g g Ancak Tkinter baz ynlerden eksiklikler barndran bir arayz takmdr. rne in Tkinterdeki g pencere aralarnn yetersizli i herkes tarafndan bilinen ve ifade edilen bir gerek... Baz ileri g s Tkinter ile halledebilmek iin epey u ramak, bol bol kod yazmak gerekebiliyor. Ayrca Tkinter g s ile retilmi programlarn grn olarak pek cazip olmad da yine pek ok kii tarafndan s s g s sylenegelmektedir. Ancak yine de Tkinterin sadeli i ve basitli i, arayz programlamaya yeni g g balayan kimseler iin kolaylatrc etkenlerdir. Dedi im gibi, Tkinterin baz eksiklikleri olsa s s g da, bu arayz takmn kullanarak epey faydal programlar retebiliriz. E er arayz programlag maya Tkinter ile balamak isterseniz, sitemizden Tkinterin nasl kullanlaca na ilikin pek ok s g s ayrntl bilgiye eriebilirsiniz. s Elbette Pythonda arayz tasarlamak iin tek seene imiz Tkinter de il. Tkinter dnda, g g s rne in GTK adl arayz takmn da kullanmay tercih edebiliriz. Tkinterin aksine, GTK adl g arayz takm olduka gelimi zellikler barndrr. Bu takm kullanarak hem ilev hem s s s de grn olarak son derece olgun programlar yazabilirsiniz. rne in GNOME masast s g ortamnn temeli GTKdr. Ayrca GNU/Linuxun medar- iftihar GIMP (GNU Grnt Dzenleme Yazlm) bu takm kullanlarak yazlmtr. Zaten GTK da GIMP programn yazmak iin s retilmitir!.. GTKnn almna bakt mzda bu durumu net olarak grebiliriz: Gimp Toolkit s g (GIMP Ara Takm). Dedi imiz gibi GTK, arayz gelitirmek iin tamamen C dili ile yazlm bir ktphanedir. g s s GTKnn lisans (LGPL), herhangi bir lisans creti demeksizin, ticari ve ticari olmayan, zgr ve zgr olmayan programlar gelitirmeye izin verir. s GTKy Python ile birlikte kullanabilmek iin, Pygtk adl ba layc katmandan yararlanaca z. g g Pygtk, GTK ile Python arasnda iletiim kurmamz sa layan bir ktphanedir. GTKnn teki s g dillerdeki ba layclarnn listesine su adresten eriebilirsiniz: http://www.gtk.org/languageg s bindings.html

Pygtk hem Windowsta hem de GNU/Linuxta altrlabilir. Bu anlamda Pygtk, birden fazla s platforma destek veren bir yap sunar bize... Biraz sonra Pygtk ile ilgili ilk rneklerimizi vermeye balayaca z, ama Pygtkyi kullanmadan s g nce baz modlleri tanmamzda fayda var. Pygtk arayz takmn kullanrken temel olarak iki modlden faydalanaca z. Bunlardan biri Pygtk, br ise gtk adl modl. Esasnda asl g ii yapan, gtk modldr. Pygtk adl modl, temel olarak, kulland mz sistemdeki Pygtk s g srmn kontrol etmek iin kullanyoruz. Modern Pygtk uygulamalar, Pygtknin 2.x srmleri kullanlarak yazlyor. E er sistemimizde Pygtknin eski ve yeni srmleri bir arada bug lunuyorsa, Pygtk modln kullanarak, programnzn istedi iniz srmle almasn sa layag s g bilirsiniz. Biraz sonra bunun nasl olaca n grece iz. Ama isterseniz nce sistemimizdeki g g GTK ve Pygtk srmlerinin hangileri oldu unu nasl renebilece imize bakalm. Bunun iin g g g su kodlar kullanyoruz (E er aa daki kodlarda herhangi bir hata alyorsanz, okumaya devam g s g edin...): nce gtk modln ie aktaralm:
>>> import gtk

Ardndan gtk srmn kontrol edelim:


>>> gtk.gtk_version

Simdi de Pygtk srmne bakyoruz:


>>> gtk.pygtk_version

E er isterseniz do rudan Pygtk modln kullanarak da sisteminizdeki btn GTK srmlerini g g renebilirsiniz: g
>>> import pygtk >>> pygtk._get_available_versions()

Bu komut size sisteminizdeki GTK srmlerini bir szlk olarak verecektir. Bu komuttan suna benzer bir kt elde ediyoruz:
{2.0: /var/lib/python-support/python2.6/gtk-2.0}

Buradan anlad mza gre, sistemimizde GTKnin 2.0 srm kurulu. g temdeki yeri ise /var/lib/python-support/python2.6/gtk-2.0

Bu srmn sis-

Ayn komutu Windows zerinde verdi imizde ise syle bir kt elde ediyoruz: g
{2.0: c:\\python26\\lib\\site-packages\\gtk-2.0}

E er daha import gtk veya import pygtk aamasnda hata alyorsanz, sisteminizde GTK g s paketi kurulu de il demektir. E er bir GNU/Linux kullancs iseniz, paket yneticinizi kullanarak g g gtk2 paketini kurabilirsiniz... Ya da isterseniz do rudan Pygtk paketini kurmay de tercih edeg bilirsiniz. Zira Pygtk paketini kurdu unuzda, muhtemelen bu paketin ba mllklar arasnda g g gtk2 de bulunaca iin gtk2 paketi de sisteminize kurulacaktr... g Windows kullanclar ise Pygtkyi kullanabilmek iin su paketleri indirip kuracak: 1. gtk+-win32-runtime 2. Pygtk 3. pycairo 4. pygobject

Windows kullanclar yukarda verdi im ba lantlara tklayarak, ilgili paketlerin en son srmg g lerini sistemlerine kurabilir. Elbette sisteminizde Pythonun da kurulu oldu unu varsayyorum... g Not: E er Windowsta yukardaki admlar takip ederek PyGtkyi kurduktan sonra herhangi bir g PyGtk programn altrmak istedi inizde ImportError: DLL load failed: Belirtilen s g modl bulunamad. seklinde bir hata alyorsanz http://www.istihza.com/blog/windowsta-bir pygtk-hatasi.html/ adresinde gsterdi imiz yntemi uygulayn. g Grd nz gibi, GTK ve Pygtkyi kurmak GNU/Linux sistemlerinde ok basittir. g E er g GNU/Linux da tmlarndan birini kullanyorsanz paket yneticiniz aracl yla gerekli paketg g leri kurmak birka tklamalk bir itir. Pygtkyi Windowsa kurmak ise baz durumlarda bis raz u ratrabilir. Windowsta zellikle baz paketlerin birbiriyle uyuma sorunu nedeniyle g s s Pygtkyi kurmakta zorlanabilirsiniz. E er Pygtkyi kurarken altndan kalkamad nz bir sorunla g g karlarsanz kistihza [at] yahoo [nokta] com adresinden bana ulaabilirsiniz. Ben size s s s elimden geldi ince yardmc olmaya alrm... g s

BLM

Pencere slemleri I

Pygtk ile alabilmek iin gereken temel bilgileri bir nceki blmde verdi imize gre artk asl s g konumuza gelebiliriz. Bu blmde Pygtkyi kullanarak nasl pencere oluturaca mz, oluturs g s du umuz bu pencereyi nasl sekillendirebilece imizi inceleyece iz. g g g Bu blmde inceleyece imiz ilk konu, bo bir pencere oluturmak... O halde hi gecikmeden g s s yolumuza devam edelim.

2.1 Pencere Olu turmak s


Arayz programlamada en temel konu, ii bo da olsa alan bir pencere oluturabilmektir. s s s ste biz de bu blmde bu en temel konuya de inece iz. I g g Pygtk ile bo bir pencere oluturmak iin su kodlar yazyoruz: s s
import gtk pencere = gtk.Window() pencere.show() gtk.main()

Grd nz gibi, Pygtk ile sadece drt satr yazarak bo bir pencere meydana getirebiliyoruz. g s Simdi biz bu satrlar tek tek inceleyerek, durumu olabildi ince anlalr bir hale getirmeye g s alaca z... s g satrda grd mz import gtk kodu, ana modlmz olan gtkyi ie aktarmamz Ilk g sa lyor. Bu modl mutlaka ie aktarmamz gerekir. Aksi halde yazaca mz kodlar hata g g vermekten baka bir ie yaramayacaktr. s s Daha sonraki satrda pencere = gtk.Window() biiminde bir ifade gryoruz. Burada gtk modlnn Window() adl fonksiyonunu a rdk ve buna pencere adn verdik. Bu satr g bizim bo bir pencere oluturmamz sa lyor. Ama bu, oluturdu umuz pencerenin ekranda s s g s g grnmesi iin yeterli olmayacaktr. Oluturdu umuz pencerenin ekranda grnmesi iin ilk s g olarak pencere.show() satr yardmyla bir de penceremizi gstermemiz gerekiyor. Aslnda simdiye kadar penceremizi ekranda gsterebilmek iin yapmamz gereken her seyi yaptk. Ama henz programmzn kendisini balatacak kodu yazmadk. Pencerenin ekranda s

grnebilmesi iin bir adm daha atmamz gerekecek. Bir Pygtk uygulamasnn hayat bulabilmesi iin gereken kod gtk.main()dir. Bunu da yukardaki kodlarda en son satra yazdk. Burada sunu bilmemiz gerekiyor: gtk.Window(), pencere olu turmamz sa layan koddur. s g pencere.show() oluturdu umuz bu pencereyi arayz zerinde gsterebilmek iin gereks g lidir. gtk.main() satr ise genel olarak uygulamann btnne hayat verme ilevi grr. s Dolaysyla uygulamann btnne hayat vermedi iniz srece sadece pencerenin ekranda g grnmesini sa lamak iinize yaramayacaktr... g s Yukarda yazd mz kod ekrana bo bir pencere amamz sa lasa da aslnda bu ii yapmak g s g s iin standart yol de ildir. Bir Pygtk uygulamas yazarken, yapmak istedi imiz asl ii yapan g g s kodlar yazmann yansra baz baka hususlar da gz nnde bulundurmamz gerekir. Mesela s bir nceki blmde bahsetti imiz, eski Pygtk srm meselesi... Pygtk uygulamalarnda, g sistemdeki Pygtk srmn kontrol etmek olduka standartlam bir uygulamadr. O yzden s s isterseniz biz de bu standarda uyup kodlarmz biraz dzenleyelim:
import pygtk pygtk.require20() import gtk pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) pencere.show() gtk.main()

Burada yeni olarak, ilk bataki iki satr gryoruz: s


import pygtk pygtk.require20()

Bu iki satrn her zaman en baa yazlmas gerekir. Daha do rusu bunlar mutlaka gtk s g modlnden nce ie aktarmalyz... Burada ilk satr pygtk adl modl ie aktaryor. pygtk.require20() satr ise, programmz iin Pygtknin 2.x srmn kullanmak istedi imizi g belirtiyor. Bylelikle, e er sistemimizde mesela Pygtknin 1.x numaral bir srm varsa, prog grammzn yanllkla o srmle almasn engellemi oluyoruz... s s Bu iki satrn baz programlarda syle yazld n da grebilirsiniz: g
import pygtk pygtk.require("2.0")

Isterseniz bu yazm seklini de benimseyebilirsiniz, ama yeni kodlarda artk genellikle pygtk.require20() biimi tercih ediliyor. Yukardaki kodlardaki baka bir yenilik ise gtk.WINDOW_TOPLEVEL parametresi. Bu parames tre, penceremizin, bir pencerenin sahip olmas gereken btn zellikleri tamasn sa lar. Biz s g bu parametreyi yazmasak da Pygtk varsaylan olarak o parametre yazlm gibi davranacaks tr... Dolaysyla bu olmazsa penceremiz bozuk grnmez, ama yine de bu parametreyi kullanmak iimizi sa lama almamz sa lar... Bu parametrenin tam olarak ne ie yarad n anlas g g s g mak iin isterseniz gtk.WINDOW_TOPLEVEL yerine, gtk.WINDOW_POPUP yazarak program altrmay deneyebilirsiniz. Bu sekilde oluturulan pencerenin balk ubu u olmayacaktr. s s s g Dolaysyla bu pencereyi ne srkleyebilirsiniz, ne de kapatabilirsiniz... Byle bir pencere olus turmann gerekti i yerler de vardr, ama simdi de il... Bu pencereyi kapatmak iin CTRL+C g g veya CTRL+Z tularna basmanz gerekiyor... s Yukardaki kodlar kullanarak gayet baarl bir sekilde ilk penceremizi oluturduk. Ama itiraf s s etmek gerekirse, Pygtk uygulamalarnn yukardaki sekilde yazld pek grlmez. zellikle g internet zerinde bulaca mz kaynaklar, kodlar hep sn yap iinde gsteriyor. Hem kodg larmzn daha dzenli olmas, hem sonradan kodlarmzn bakmn kolaylatrmak hem de s

internet zerindeki kaynaklardan daha verimli yararlanabilmek iin biz de bu belgede kodlarmz sn yap iinde sunmay tercih edece iz. O halde yukardaki kodlar standart bir g Pygtk uygulamas haline nasl getirece imize bakalm: g
import pygtk pygtk.require20() import gtk class IlkPencere(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.show() def main(self): gtk.main() ilk = IlkPencere() ilk.main()

Grd nz gibi, snfsz kodlar sn bir yapya evirmek o kadar da zor de il... nce g g IlkPencere adnda bir snf oluturuyoruz. Snfmz, Pythondaki yeni tip snarn gerektirdi i s g sekilde object snfn miras alyor... Bu arada, e er sn yaplar konusunda eksikleriniz varsa g Nesne Tabanl Programlama konusuna gz gezdirmek isteyebilirsiniz... Snfmz tanmladktan sonra, ilk olarak bir __init__ fonksiyonu yazyoruz. Programmz als maya balar balamaz, bu fonksiyon iinde yer alan kodlar iletilecektir. Bu fonksiyon iinde s s s bo penceremizi oluturacak kodlar yazyoruz. s s Programmzn dinamosu niteli indeki gtk.main() iin ise ayr bir fonksiyon yazdk. Bu g fonksiyonu main() olarak isimlendirdik. Elbette siz bu fonksiyona daha farkl bir isim verebilirsiniz. Ama akas, bu fonksiyon ad da tpk self gibi kemiklemi bir adlandrmadr. s s Yazd nz kodlar okuyan kiilerin bir an da olsa duraksamamas iin bu fonksiyonu sizin de g s main() olarak adlandrmanz tavsiye ederim. Kapan blmnde IlkPencere() adl snfmz rnekliyoruz (instantiate). Snf rne imizin s g ad ilk. Snfmz bu sekilde rnekledikten sonra, ilk.main() ifadesi yardmyla IlkPencere adl snfmzn iindeki main() fonksiyonunu a ryoruz. Bylece programmz almaya g s balyor... s Yukarda yazd mz kodlar altrmak iin, programmzn bulundu u dizin iinde bir komut g s g satr ap, orada su komutu veriyoruz (programmz deneme.py olarak adlandrd mz g varsayarsak...)
python deneme.py

Bu arada, Pygtk henz Pythonun 3.x srmleriyle uyumlu de ildir. Dolaysyla programmz g altrmak iin Pythonun 2.x srmlerinden birini kullanaca z. zellikle Windows kuls g lanclarnn, python komutunu verdiklerinde Pythonun hangi srmnn alt na dikkat s g etmeleri gerekiyor... Bu noktada bir sey dikkatinizi ekmi olmal: Programlarmz baaryla altrabiliyoruz, ama s s s ayn baaryla kapatamyoruz!... Pencere zerinde arp iaretine tklad mzda penceremiz s s g kayboluyor, ama aslnda programmz alttan alta almaya devam ediyor. Program komut s satrndan altrdysanz, program kapattktan sonra imlecin alt satra gememi olmasndan s s bunu anlayabilirsiniz... Bu durumda program kapatmak iin CTRL+C veya CTRL+Z tularna s basmamz gerekiyor... Elbette programmz grnmedi i halde alttan alta almaya devam etmesi tercih edilecek bir g s sey de il. Yazd mz programlarn kapanmasn nasl sa layabilece imizi bir-iki blm sonra g g g g

inceleyece iz. Biz simdilik CTRL+C veya CTRL+Z tularn kullanmay srdrelim... g s

2.2 Pencereye Ba lk Eklemek s


Bir nceki blmde bo bir pencereyi nasl oluturaca mz grmtk. s s g s Isterseniz artk olus turdu umuz pencereyi biraz dzenlemeye, bu pencereye yeni zellikler eklemeye girielim. g s Mesela oluturdu umuz pencereye bir balk ekleyelim... s g s Pygtk ile yazlm bir programa balk ekleme ii set_title() metoduyla yaplr. Gelin isterss s s eniz hemen bununla ilgili kk bir rnek verelim:
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title("Bu bir balktr!") s self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

E er istedi imiz sey bir pencerenin bal n ayarlamak de il de bal n ne oldu unu bulmak g g s g g s g g ise, get_title() metodu iimize yarayacaktr: s
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title("Bu bir balktr!") s print self.pencere.get_title() self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Programmz altrd mzda, pencere bal nn konsol ekranna yazld n grece iz... E er s g s g g g g pencere bal komut satrna yazlrken Trke harer dzgn grnmyorsa ilgili satr syle s g yazabilirsiniz:

print unicode(self.pencere.get_title(), "utf-8")

Burada Trke karakterleri dzgn gsterebilmek iin pencere bal n Unicode kod zcs g lerinden biri olan utf-8 ile kodladk. E er Unicode konusu ilginizi ekiyorsa veya bu konuda g eksikleriniz oldu unu dnyorsanz http://www.istihza.com/py2/unicode.html adresindeki g s makalemizi inceleyebilirsiniz... Grd nz gibi, penceremizin bal n set_title() metodunu kullanarak kolayca beg s g lirleyebiliyoruz. get_title() metodunu kullanarak ise penceremizin bal nn ne oldu unu s g g renebiliyoruz. Ancak burada dikkatimizi eken baka bir nokta var. Pencere boyutlar tam g s istedi imiz gibi de il. Mesela pencere bal n grebilmek iin pencereyi elle boyutlandrg g s g mamz gerekiyor. ste bir sonraki blmmzn konusu pencere boyutlarn elle de il de kodlar I g yardmyla ayarlamak...

2.3 Pencere Boyutunu Ayarlamak


Pygtk ile oluturdu umuz bir pencere varsaylan olarak 200x200 piksel boyutunda olacaktr. s g Ama bizim ihtiyacmz olan pencere boyutu her zaman bu olmayabilir. E er Pygtk penceresinin g boyutunu kendimiz belirlemek istersek, resize() adl metottan yararlanaca z: g
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title("Bu bir balktr!") s self.pencere.resize(500, 500) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu sekilde, 500x500 piksel boyutunda bir pencere oluturmu olduk. resize() metodunun s s forml syledir:
pencere.resize(genilik, ykseklik) s

Dolaysyla, parantez iinde parametre olarak verece imiz ilk de er pencerenin genili ini, g g s g ikinci de er ise pencerenin yksekli ini belirleyecektir... g g E er oluturdu umuz pencerenin tam ekran olarak almasn istersek maximize() adl metotg s g tan yararlanabiliriz:
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title("Bu bir balktr!") s self.pencere.maximize() self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

E er programmzn almas esnasndaki bir aamada tam ekran halindeki bir pencereyi tam g s s ekran konumundan karmak istersek de unmaximize() metodunu kullanabiliriz... Pencerenin boyutunu de itirmeyi rendik. Peki ya bu pencerenin konumunu de itirmek gs g gs istersek ne yapaca z? g Isterseniz onu da bir sonraki blmde anlatalm...

2.4 Pencere Konumunu Ayarlamak


Pencere boyutunu ayarlamay bir nceki blmde renmitik. Gelelim penceremizin konug s munu ayarlamaya... Bu ii move() metodunu kullanarak gerekletirece iz: s s g
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title("Bu bir balktr!") s print self.pencere.get_title() self.pencere.resize(500, 500) self.pencere.move(700, 100) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada parantez iindeki ilk rakam pencerenin x dzlemindeki konumunu (soldan sa a), ikinci g rakam ise y dzlemindeki konumunu gsteriyor (yukardan aa ya). s g E er penceremizi ekrann tam ortasnda konumlandrmak istersek set_position() metodung dan yararlanaca z: g
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title("Bu bir balktr!") s print self.pencere.get_title() self.pencere.resize(500, 500) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Yukardaki kodlar, oluturdu umuz pencerenin, ekrann ortasnda almasn sa layacaktr. Bus g g rada gtk.WIN_POS_CENTER parametresi yerine sunlar da kullanabiliriz: gtk.WIN_POS_NONE: Pencere konumu zerinde herhangi bir de iiklik yaplmaygs aca n belirtir. g gtk.WIN_POS_CENTER: Pencereyi ekrann ortasna yerletirir. s gtk.WIN_POS_MOUSE: Pencere, farenin o anda bulundu u konumda alr. g gtk.WIN_POS_CENTER_ALWAYS: Pencerenin boyutu de ise de, pencereyi hep gs ekrann ortasnda tutar. gtk.WIN_POS_CENTER_ON_PARENT: E er ikinci bir pencere varsa bu pencerenin g ana pencereyi ortalamasn sa lar. g Pygtkda pencere konumunu belirlemek iin kulland mz iki farkl metot oldu una dikkat g g edin. Bunlardan birincisi move(), ikincisi ise set_position() metodudur... move() metodunu, pencereyi ekran zerinde zel bir konuma getirmek istedi imizde kullanyoruz. g set_position() metodu ise pencereyi belli konumlara yerletirmemizi sa lyor. rne in bir s g g pencereyi soldan 300, stten ise 500. piksele yerletirmek istersek move() metodunu kuls lanaca z. Ama e er pencereyi mesela ekrann ortasna yerletireceksek, set_position() g g s metodundan yararlanaca z. g

2.5 Pencereleri Saglkl bir Sekilde Kapatmak


nceki blmlerde, Pygtkyi kullanarak bo bir pencere oluturmay, pencereye bir balk ekles s s meyi, oluturdu umuz pencereyi konumlandrmay ve boyutlandrmay renmitik. Ama fars g g s kettik ki oluturdu umuz bir pencereyi kapatmaya alt mzda bir sorunla kar karyayz. s g s g s s Sorun su ki, aslnda oluturdu umuz pencereyi kapatt mzda programmz kapanmyor. Pro s g g gramdan kmak iin CTRL+C veya CTRL+Z tularna basarak program kapanmaya zorlas mamz gerekiyor... Bu blmde, bir Pygtk uygulamasn sa lkl bir sekilde nasl kapatabileg ce imizi grece iz. g g Isterseniz ncelikle tekrar bo bir pencere oluturalm: s s
import pygtk pygtk.require20() import gtk class Pencere(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL)

self.pencere.show() def main(self): gtk.main() uyg = Pencere() uyg.main()

Yazd mz bu kodlarn baarl bir sekilde bo pencere oluturaca n biliyoruz, ama ayn g s s s g baaryla kapanmayaca n da biliyoruz... Simdi bu kodlara syle bir ekleme yapalm: s g
import pygtk pygtk.require20() import gtk class Pencere(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.show() def main(self): gtk.main() uyg = Pencere() uyg.main()

Buraya self.pencere.connect("delete_event", gtk.main_quit) diye yeni bir satr ekledik. Bu kodlar altrd mzda, pencerenin arp d mesine bast mz zaman programmz s g g g dzgn bir sekilde kapanacaktr. Bu kodlarn getirdi i de iikli i konsoldaki imlecin duru g gs g mundan da grebiliriz. Artk CTRL+C veya CTRL+Z tularna basmak zorunda kalmadan pros grammz sonlandrabiliyoruz. Burada yapt mz sey, penceremizin arp tuuna bir grev atamaktan ibaret. Pencere zg s erindeki arp tuuna bast mz anda, gtk modlnn main_quit() adl metodu devrs g eye girip programmzn kapanmasn sa layacak. Pygtkda pencerenin arp tuuna basma g s hareketi, delete_event olarak adlandrlr. Dolaysyla yukardaki yeni satr Trke olarak syle ifade edebiliriz:
pencere.bala("arpya_basma_hareketi", gtk.program_kapat) g

Yukardaki Trke ifadeden anlad mz gibi, ba la kelimesine karlk gelen connect g g s ifadesi, temelde pencere aracn bir greve ba lyor... Bu grevi de parantez iinde tanmg lyoruz. Buna gre, pencere aracna ba lad mz grev, zerindeki arpya basld nda g g g (delete_event), programdan tamamen kmak (gtk.main_quit) Yukardaki kodlarda biz gtk.main_quit() metodunu do rudan satr iine yazdk. Kolay yntem g budur. Ama e er istersek bunu ayr bir fonksiyon olarak da tanmlayabiliriz: g
import pygtk pygtk.require20() import gtk class Pencere(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.pencere.show()

def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Pencere() uyg.main()

Burada kapat adl yeni bir fonksiyon tanmlayp, connect() metodu iinde do rudan bu g fonksiyona gnderme yapyoruz. Ayrca kapat fonksiyonu iinde birtakm parametreler belirledi imize de dikkat edin. Bir olay (event) tanmlarken (mesela delete_event bir olaydr), g olaya ait fonksiyonun en az iki parametre almas gerekir. Bu parametrelerden biri pencere aracna, teki ise olayn kendisine gnderme yapar. Bizim rne imizde pencere aracna g gnderme yapan parametreye penar, olaya gnderme yapan parametreye ise event adn verdik. Siz bu parametreleri istedi iniz sekilde adlandrabilirsiniz. Ama zellikle event g parametresinin adn de itirmemenizi neririm. nk bu da tpk self ve main gibi yergs lemi bir ifadedir... s s Bylelikle Pygtk kullanlarak yazlm en basit uygulamann nasl olmas gerekti ini renmi s g g s olduk. Basit bir Pygtk uygulamasnda yer alan temel aamalar syle bir gzden geirelim: s ncelikle gerekli modlleri ie aktaryoruz:
import pygtk pygtk.require20() import gtk

Burada ie aktard mz pygtk modln, srm kontrol iin kullandk. pygtk.require20() g satr, sistemimizde birden fazla pygtk srm olmas durumunda, programmz bu srmlerden hangisiyle altrmak istedi imizi belirlememizi sa lyor. Modern Pygtk uygulamalar s g g 2.x srmleri kullanlarak yazlr. Dolaysyla biz de bu satr yardmyla, kullanlacak srm 2.x olarak belirliyoruz. Son olarak da gtk modln ie aktardk. gtk, programmzda asl ii yapan modldr. s Ardndan program kodlarmz yerletirmek iin bir snf tanmlyoruz. Bu snf, Pythondaki yeni s tipte snarn gerektirdi i sekilde mutlaka bir baka snftan miras almak durumunda... Bizim g s burada zel olarak miras almak istedi imiz bir snf bulunmad iin, object snfn miras g g alarak bu aamay geiyoruz: s
class Pencere(object):

Tanmlad mz snfn bir __init__ fonksiyonu olmas gerekiyor. Programmz ilk almaya g s balad anda sahip olaca zellikleri bu __init__ fonksiyonu iinde belirliyoruz. Mesela s g g pencereyi ve teki aralar bu fonksiyon iinde tanmlayabiliriz. Henz pencerenin kendisi dnda bir ara belirlemedi imiz iin buraya simdilik sadece bo pencereyi oluturacak kodlar s g s s yazyoruz:
def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.pencere.show()

Burada pencere oluturmak iin gtk modlnn Window() fonksiyonundan yararland mza s g dikkat edin. Ayrca oluturdu umuz pencerenin, bir pencerenin sahip olmas gereken s g btn zellikleri barndraca ndan emin olmak iin yine gtk modlnn WINDOW_TOPLEVEL g niteli ini de parametre olarak gtk.Window fonksiyonu iinde belirtiyoruz. g

Ardndan, yazd mz programn dzgn kapanmasn sa lamak iin pencerenin arp tuuna g g s bir grev atyoruz. Burada connect() adl fonksiyondan faydalanarak, arp iaretini, daha s sonra tanmlayaca mz kapat() adl fonksiyona ba lyoruz. Pygtkda bu arp tuuna basma g g s hareketi delete_event olarak adlandrlr... Ayrca bu delete_event, teknik dille ifade etmek gerekirse, bir olaydr (event). Sonraki satrda grd mz self.pencere.show() ifadesi de olduka nemlidir. E er bu g g satr yazmazsak, oluturdu umuz pencere ekranda grnmez... show() metodunu kullanarak s g penceremizi ekranda gsteriyoruz. Sra geldi program kapatma fonksiyonumuzu tanmlamaya... Bu ilemi su kodlar yardmyla s yapyoruz:
def kapat(self, penar, event): gtk.main_quit()

Burada nemli nokta, kapat fonksiyonunun en az iki parametre almas... Biz birinci parametreyi penar, ikinci parametreyi ise event olarak adlandrdk. Siz istedi iniz adlar vereg bilirsiniz bu parametrelere. Ama en azndan event kelimesini de itirmemenizi tavsiye edgs erim. Burada penar parametresi, arp tuuna basma hareketinin ait oldu u pencere aracna s g iaret ediyor (yani pencerenin kendisine...). event parametresi ise olayn kendisine atfta s bulunuyor (yani delete_event adl olaya...). Programmz sonlandrmak iin ise gtk modlnn main_quit() adl metodundan yararlanyoruz. E er penar ve event parametrelerinin tam olarak neye iaret etti ini daha net bir sekilde g s g grmek isterseniz fonksiyonunuzu syle yazabilirsiniz:
def kapat(self, penar, event): print type(penar) print type(event) gtk.main_quit()

Fonksiyonunuzu bu sekilde yazp program altrd nzda ve pencerenin arp simgesine s g bast nzda komut satrnda su ktlar greceksiniz: g
<type gtk.Window> <type gtk.gdk.Event>

Demek ki gerekten de penar parametresi gtk.Window() aracn (yani penceremizi); event parametresi ise gtk.gdk.Event adl olay (bizim rne imizde delete_event adl g olay) gsteriyor... Programmzn asl itici gc olan fonksiyonu ise syle yazdk:
def main(self): gtk.main()

Bu fonksiyon, programmzn almaya balad n gsteriyor. Bir baka ifadeyle, bu fonksiyon s s g s yardmyla programmza hayat pc veriyoruz... g Son olarak, yazd mz snf rnekliyoruz: g
uyg = Pencere()

E er snf iinde belirtti imiz main() fonksiyonunu bir motor olarak dnrsek, bu motorun g g s pervanesini de su kodla dndryoruz:
uyg.main()

2.6 Pencerelere Simge Eklemek


Bildi iniz gibi, pek ok programda pencerenin sol st kesinde programa ait ufak bir simge yer g s alr. E er programc, yazd bir program iin herhangi bir simge belirlemezse pencerenin sol g g st kesi bo kalacaktr. ste simdi biz o alan nasl kendi zevkimize gre doldurabilece imizi s s I g renece iz. g g Yazd nz bir programn simgesini pencerenin sol st kesine yerletirebilmek iin Pygtkde g s s set_icon_from_file() adl bir metottan yararlanabilirsiniz. rne in: g
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.resize(500, 500) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_title("PROGRAM") self.pencere.set_icon_from_file("falanca.png") self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

set_icon_from_file() adl metot bilgisayarnzda kaytl olan bir resmi alp uygulama simgesi haline getirecektir. E er yukardaki kodlar altrd nz halde pencerenin sol st kesinde g s g s herhangi bir simge grmyorsanz, bunun sorumlusu kulland nz sistem temasdr. Mesela g Ubuntuda Human-Clearlooks adl tema uygulama simgelerini gstermez. Ama e er uygug lamanz simge durumuna kltecek olursanz, kulland nz resmi panel zerinde greg bilirsiniz... Ayrca kulland nz temay de itirerek de uygulamalarn simgelerini grnr hale g gs getirebilirsiniz.

2.7 Boyutlandrlamayan Pencereler Olu turmak s


Bir Pygtk penceresi normal sartlar altnda kullanc tarafndan boyutlandrlabilir. Yani bir pencerenin sa n solunu ekerek bu pencereyi bytebilir veya kltebilirsiniz. Ama siz g yazd nz baz programlarda kullancnn pencereyi boyutlandrmasna msaade etmek isg temiyor olabilirsiniz. Mesela bir hesap makinesi uygulamasnda programc sabit bir pencere boyutu belirleyip bu pencere boyutunun de itirilmesini engellemek isteyebilir... E er siz de gs g yazd nz programlarn boyutlandrlmasn istemiyorsanz Pygtkdeki set_resizable() adl g metottan yararlanabilirsiniz:
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object):

def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_size_request(500, 500) self.pencere.set_resizable(False) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_title("BOYUTLANDIRILAMAZ") self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada dikkatimizi eken iki nokta var. Birincisi, daha nce pencereleri boyutlandrmak iin kulland mz resize() metodu yerine burada set_size_request() adl baka bir metot kulg s landk. Ikincisi, pencerenin elle boyutlandrlmasn engellemek iin set_resizable() adl bir metoda False parametresi verdik. Bu kodlarda grd mz set_size_request() metodu Pygtkde pencere boyutlandrmann g baka bir yoludur. Burada bu metot yardmyla penceremizin boyutunu 500x500 olarak s ayarladk. resize() metodu ile set_size_request() metodu arasndaki fark Pencere Aralarnn Yerleimi adl blmde inceleyece iz. s g Burada bizi asl ilgilendiren, set_resizable() metodudur. Bu metodun varsaylan de eri g Truedir ve bu de ere sahip oldu unda pencerelerimiz elle rahatlkla boyutlandrlabilir. Ama g g e er biz bu metodun de erini False yapacak olursak, kullanclarmz artk bu pencereyi g g boyutlandramaz.

2.8 Saydam/Seffaf Pencereler Olu turmak s


Pygtkde, oluturdu unuz pencereleri saydam/effaf hale getirmek de mmkndr. Ancak bu s g s ilev her iletim sisteminde ayn sekilde almaz. Pygtkde pencereleri seffaatrmak iin s s s s set_opacity() adl bir metottan yararlanyoruz. Mesela:
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_size_request(500, 500) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_title("EFFAF") S self.pencere.set_opacity(0.5) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada seffaatrma iini yerine getiren satr self.pencere.set_opacity(0.5)tir. s s set_opacity() metodu 0 ve 1 aras bir de er alr. Bu metodun de eri 0a yaklatka g g s pencere daha da seffaaacak, 1e yaklatka ise seffa azalacaktr. s s g Dedi imiz gibi, bu metodun platformlara gre baz kstlamalar vardr. rne in Windows g g zerinde bu metot her zaman alr. Ancak GNU/Linuxta bu metodun alabilmesi iin s s masast efektlerinin veya Compiz Fusionun ak olmas gerekir. E er Ubuntu kullanyorg sanz, bu metodu altrabilmek iin Sistem > Tercihler > Grnm yolunu takip ederek Grsel s efektler sekmesinde extra ayarn semeniz gerekiyor... Bununla ilgili ufak bir rnek daha yapalm:
import pygtk pygtk.require20() import gtk import time class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title("DENEME") self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("destroy", gtk.main_quit) for i in range(11): while gtk.events_pending(): gtk.main_iteration() self.pencere.set_opacity(i*0.1) self.pencere.show() time.sleep(0.1) def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu rnekte Pygtk penceresi yava yava seffaftan grnre geecektir. Ancak set_opacity() s s metoduna ilikin olarak yukarda anlattklarmzdan yola karak, bu metoda ok fazla itibar s edilmemesi gerekti ini syleyebiliriz. g Bylece bir konuyu daha bitirmi olduk. Dilerseniz simdi bu noktaya kadar rendi imiz btn s g g metotlar ve bu metotlarn grevlerini ksaca listeleyelim: gtk.Window() Ana pencereyi oluturmamz sa lar. Su parametreleri alr: s g gtk.WINDOW_TOPLEVEL gtk.WINDOW_POPUP set_title() Pencerelere balk ekler. s get_title() Pencere bal nn ne oldu unu syler. s g g resize() Pencere boyutunu ayarlar. show() Pencere aralarn gsterir. maximize() Pencereleri tam ekran haline getirir. unmaximize() Pencereyi tam ekran konumundan karr. move() Pencereleri zel bir konuma tamamz sa lar. s g

set_position() Pencereleri belirli bir konuma tamamz sa lar. s g parametrelerden birini alr: gtk.WIN_POS_NONE, gtk.WIN_POS_CENTER, gtk.WIN_POS_MOUSE, gtk.WIN_POS_CENTER_ALWAYS, gtk.WIN_POS_CENTER_ON_PARENT

Bu metot su

connect() Pencerelere ve pencere aralarna grev atamamz sa lar. g main() Programn almasn sa lar. s g main_quit() Programdan klmasn sa lar. g set_icon_from_le() Pencerelere uygulama simgesi eklememizi sa lar. g set_size_request() Pencereleri boyutlandrmann baka bir yoludur. s set_resizable() Pencerelerin elle boyutlandrlp boyutlandrlamayaca n belirler. g set_opacity() Pencerelerin seffaamasn sa lar. s g Grd nz gibi, Pygtk ile ilgili epey sey rendik. rendi imiz bu bilgiler sayesinde artk g g g g Pygtkyi kullanarak bo bir pencere oluturabiliyor ve bu bo pencerenin baz niteliklerini s s s de itirebiliyoruz. Ama bo bir pencere oluturmann pek keyii bir i olmad ortada... O gs s s s g yzden isterseniz, oluturdu umuz pencereye baka eleri nasl ekleyece imizi de renes g s g g g lim.

BLM

Pygtkde Pencere Aralar (1. Blm)

Bu blmde Pygtkdeki pencere aralarn anlatmaya balayaca z. Peki pencere arac nedir? s g Hemen syleyelim: Bir programn arayz zerinde grnen, d me, etiket, kutucuk, men vb. aralara, pencere g arac (Window Gadget Widget) ad verilir. Pygtk; pencere aralarnn says bakmndan olduka zengin bir arayz takmdr. Bir programda ihtiya duyabilece imiz btn pencere aralarn Pygtkde bulabiliriz... g Bu blmde inceleyece imiz ilk pencere arac Label olacak. O halde yola koyulalm... g

3.1 Label Pencere Arac


Label, kelime olarak etiket anlamna gelir. Oluturdu umuz arayz zerinde kullancya bir s g not veya mesaj gstermek istedi imizde Label adl bu pencere aracndan yararlanabiliriz. g Pygtkde bir Label oluturmak istedi imizde suna benzer bir kod yazyoruz: s g
etiket = gtk.Label()

Elbette yukardaki satr, Label aracnn iskeletidir yalnzca. Gerek hayatta Labeli kullanrken, bu pencere aracna baz baka seyler de eklememiz gerekir. s Isterseniz bu arala ilgili basit bir rnek vererek balayalm ie: s s
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.pencere.show() self.etiket = gtk.Label("Merhaba") self.pencere.add(self.etiket)

18

self.etiket.show() def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, Pygtk ile bir etiket oluturmak hi de zor de il. Burada grd nz gibi, g s g g Pygtkde bir etiket oluturmak iin aamadan geiyoruz: s s
self.etiket = gtk.Label("Merhaba") self.pencere.add(self.etiket) self.etiket.show()

Dilerseniz bu aamalar tek tek inceleyelim: s ncelikle su kodu kullanarak bir etiket meydana getiriyoruz:
self.etiket = gtk.Label("Merhaba")

Burada etiketi oluturan fonksiyon, gtk.Label(). Bu fonksiyon iinde kulland mz karakter s g dizisi ise bu etiketin ieri ini gsteriyor. Biz ilk etiketimiz iin Merhaba karakter dizisini g kullandk. Etiketimizi oluturduktan sonra yapmamz gereken bir sey daha var. Pygtkde pencere s aralarn grnr hale getirebilmek iin bu aralar pencere zerine eklememiz lazm. Dolaysyla yukardaki forml aracl yla etiketimizi oluturduktan sonra yapmamz gereken g s ilk i bu etiketi pencereye eklemek olacaktr. E er etiketimizi pencereye eklemezsek, pros g grammz altrmak istedi imizde etiketimiz ekranda grnmeyecektir. s g Etiketi pencereye ekleme ilemini su kodla yapyoruz: s
self.pencere.add(self.etiket)

Oluturdu umuz etiketi pencereye eklemek iin add() adl bir metottan yararland mza s g g dikkat edin. add kelimesi Trkede eklemek anlamna gelir. Dolaysyla yukardaki satr ile self.etiketi, self.pencereye eklemi (add) olduk... s Artk etiketimizi ekranda gsterebiliriz:
self.etiket.show()

Yukardaki kodlarn geri kalannn ne ie yarad n biliyorsunuz. Bunlar nceki blmlerde s g grmtk. s Dikkat ederseniz, yukardaki kodlar kullanarak oluturdu umuz pencere yine 200x200 piksel s g boyutunda. Yani pencerenin kendisi, pencere zerine yerletirdi imiz etiketten byk. Aslnda s g tahminimce siz de grntnn byle olmasn isteyeceksiniz... Ama e er oluan pencerenin g s etiketin kaplad alanla snrl olmasn isterseniz kodlarnz su sekilde yazabilirsiniz: g
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self):

self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.etiket = gtk.Label("Merhaba") self.pencere.add(self.etiket) self.etiket.show() self.pencere.show() def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada yapt mz tek de iiklik, self.pencere.show() satrnn yerini de itirmek oldu... g gs gs Ana penceremizi etiketten sonra gstererek, penceremizin etiket boyutuyla snrl olmasn sa ladk. Peki bu nasl oluyor? g Pygtk ile bo bir pencere oluturdu umuzda, oluan bo pencerenin boyutu varsaylan olarak s s g s s 200x200 pikseldir. Yukarda verdi imiz ilk kodlarda ana pencereyi etiketten nce gsterg di imiz iin, pencere olutu u srada henz ortada bir etiket olmad ndan, oluan pencere g s g g s 200x200 piksel boyutunda oluyor. Ama ana pencereyi etiketten sonra gsterirsek, pencere olutu u srada kendisinden nce olumu bir etiket olaca iin, ana penceremiz etiketin s g s s g sahip oldu u boyuta gre kendini ayarlyor. Elbette nceki blmlerde rendi imiz sekg g g ilde, resize() veya get_size_request() metodunu kullanarak pencere boyutunu kendimiz de ayarlayabiliriz:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.resize(400, 400) #dilerseniz resize() yerine set_size_request() de #kullanabilirsiniz: #self.pencere.set_size_request(400, 400) self.pencere.connect("delete_event", self.kapat) self.etiket = gtk.Label("Merhaba") self.pencere.add(self.etiket) self.etiket.show() self.pencere.show() def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, self.pencereyi kodlarn neresinde gstermi olursak olalm, resize() g s (veya get_size_request()) metodu yardmyla pencerenin sahip olmas gereken boyutu belirledi imiz iin, penceremiz bizim istedi imiz boyutlara gre alyor... g g Bu arada, dikkat ederseniz, yukardaki kodlarda herhangi bir Trke karakter kullanmamaya zen gsterdik. Elbette istersek Pygtk uygulamalarnda Trke karakterleri de rahatlkla gsterebiliriz. Ama bunun iin ncelikle beti imizin dil kodlamasn belirlememiz gerekir. Bunu g nasl yapaca mz biliyorsunuz. Kodlarmzn en bana su satr ekleyece iz: g s g
#-*-coding: utf-8 -*-

Dolaysyla kodlarmzn son hali syle olacak:


#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.resize(400, 400) self.pencere.connect("delete_event", self.kapat) self.etiket = gtk.Label("Merhaba Trke karakterler: ") s g S G I self.pencere.add(self.etiket) self.etiket.show() self.pencere.show() def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Pygtk ile bir etiket oluturmay rendik. Simdi bu etiketi nasl dzenleyebilece imize bakas g g ca z. rne in bu etiketin yaztipi, renk, boyut, vb. zelliklerini nasl de itirebilece imizi g g gs g inceleyece iz... g

s 3.1.1 Etiket Metnini Degi tirmek


Label pencere aracnn metnini belirledikten sonra, programn ileyii srasnda baz noks s talarda bu metni de itirmek gerekebilir. Bu pencere aracnn metnini de itirmek iin gs gs set_text() adl metottan yararlanaca z: g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object):

def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.resize(400, 400) self.pencere.connect("delete_event", gtk.main_quit) self.etiket = gtk.Label() self.pencere.add(self.etiket) self.etiket.show() self.pencere.show() self.etiket.set_text("lem Tamamland!") Is def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, etiketi ilk oluturdu umuzda bu etiket herhangi bir metin iermiyor. Etiketin g s g metnini, set_text() adl metottan yararlanarak, sonradan oluturduk... s Elbette, yukardaki rnek pek ilevli de il... E er biz etiket metnini program alt srada s g g s g de itirebilirsek tabii ki rne imiz ok daha mantkl olacaktr. Mesela, programmz ilk gs g ald nda Ltfen bekleyiniz... gibi bir yaz grsek... Ardndan da bu yaz belli bir sre g sonra slem tamamland... sekline dnse ok daha iyi bir rnek vermi olaca z... nce I s s g syle bir deneme yapalm:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk import time class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.resize(500, 500) self.pencere.set_title("deneme 1, 2, 3...") self.pencere.show() self.etiket = gtk.Label("Ltfen bekleyiniz...") self.pencere.add(self.etiket) self.etiket.show() time.sleep(1) self.etiket.set_text("lem tamamland!") Is def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, bu kodlar istedi imiz ilemi yerine getiremedi. Programmz 1 saniye bekg g s ledikten sonra ald ve sadece slem tamamland! etiketini gsterdi. Halbuki bizim isteI di imiz bu de il... g g

Pygtkde bu tr ilemleri yapabilmek iin kodlarmz arasna su satrlar eklememiz gerekir: s


while gtk.events_pending(): gtk.main_iteration()

Bu kodlarn grevi, arayzn gncellenmesini sa lamaktr. E er arayz zerinde gerekg g lemeyi bekleyen olaylar varsa, bu kodlar sayesinde arayz her olaydan sonra gncellenir. s Bylelikle arayz zerinde belli bir sre zarfnda gerekleen farkl olaylar, arayzn gns cellenmesi sayesinde kullancya gsterilebilir. Isterseniz bunu bir rnekle somutlatrmaya s alalm: s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk import time class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("destroy", gtk.main_quit) self.pencere.resize(300, 300) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_title("deneme 1, 2, 3...") self.pencere.show() self.etiket = gtk.Label("Ltfen bekleyiniz...") self.pencere.add(self.etiket) self.etiket.show() while gtk.events_pending(): gtk.main_iteration() time.sleep(1) self.etiket.set_text("lem tamamland!") Is def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu defa, programmz istedi imiz ilemi gerekletirdi. Tam istedi imiz sekilde, programmz g s s g Ltfen bekleyiniz... etiketiyle ald ve 1 saniye sonra bu etiket slem tamamland! sekI line dnt. Burada while gtk.events... kodlarnn grevi, arayz takibe almak... Bu kodlar, s arayz zerinde gereklemeyi bekleyen herhangi bir olay olup olmad n srekli olarak kons g trol ediyor. Bizim rne imizde, 1 saniye sonra de imeyi bekleyen bir etiket oldu u iin, g gs g while gtk.events_pending(): gtk.main_iteration() kodlar arayzn donup kalmasn engelliyor ve tpk olmas gerekti i gibi, 1 saniye sonra etiketi de itiriyor... g gs Yukardakine benzer bir baka rnek daha verelim. Mesela bu kez bir saya rne i hazrlays g alm. Yazaca mz programda 1den 10a kadar aralksz olarak sayalm: g
#-*-coding: utf-8 -*import pygtk pygtk.require20()

import gtk import time class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.etiket = gtk.Label("balyor...") s self.pencere.add(self.etiket) self.pencere.show() self.etiket.show() for i in range(11): while gtk.events_pending(): gtk.main_iteration() time.sleep(1) self.etiket.set_text("%s" %i) def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

E er burada while gtk.events_pending(): gtk.main_iteration kodlarn yazmazsak, prog grammz altrd mzda arayzmz bir sre bekleyecek, alttan alta 10a kadar saymay s g bitirdikten sonra kendini gsterecektir...

s 3.1.2 Etiketlerin Rengini Degi tirmek


Bir Label arac zerindeki metnin rengini de itirmek konusunda Pygtk bize ok byk gs olanaklar sa lar. Metin rengini (ve metnin baka pek ok zelli ini) de itirmek iin kullang s g gs abilece imiz, Pango Markup Language (Pango saretleme Dili) adl ufak bir dil yaps sunar g I bize Pygtk... Pango saretleme Dili, HTMLye olduka benzer bir dildir. Dolaysyla temel I HTML bilgisi, biraz sonra gsterece imiz rnekleri anlamak bakmndan epey yararl olacaktr. g Bu blmde, bir etiketteki metnin yaztipi rengini nasl de itirece imizi renece iz. gs g g g Isterseniz bir nceki blmde grd mz rnek zerinden gidelim. rne imiz suydu: g g
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk import time class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.etiket = gtk.Label("balyor...") s

self.pencere.add(self.etiket) self.pencere.show() self.etiket.show() for i in range(11): while gtk.events_pending(): gtk.main_iteration() time.sleep(1) self.etiket.set_text("%s" %i) def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Simdi burada, arayz zerinde tek tek grnen saylarn rengini de itirece iz. Normalde bu gs g saylar siyah renkte, ama biz bu saylar krmzya dndrece iz: g
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk import time class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.etiket = gtk.Label("balyor...") s self.pencere.add(self.etiket) self.pencere.show() self.etiket.show() for i in range(11): while gtk.events_pending(): gtk.main_iteration() time.sleep(1) self.etiket.set_markup("<span foreground=red>%s</span>"%i) def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, program altrd mzda, arayz zerindeki saylar krmz renkte g s g grnyor. Burada kulland mz kodun forml syledir: g

pencere_arac.set_markup("<span foreground=renk>metin</span>")

Bu arada, set_markup() metodunun, etiketin metnini ayarlama grevi grd ne de dikkat g edin. Burada ayrca set_text() gibi bir metot kullanmamza gerek kalmad. Isterseniz bununla ilgili daha basit bir rnek yapalm:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.show() self.etiket = gtk.Label("Merhaba") self.etiket.set_markup("<span foreground=blue>Merhaba</span>") self.pencere.add(self.etiket) self.etiket.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada, Ingilizcedeki temel renk adlarn kullanabiliyoruz. Bu renk adlarndan bazlarn verelim:
red blue white black green brown orange purple = = = = = = = = krmz mavi beyaz siyah yeil s kahverengi kavunii eflatun

Elbette sadece bu renklerle snrl de iliz. E er isterseniz http://html-color-codes.info/ adresini g g ziyaret ederek, oradaki renk paletinden bir renk seip programnz iinde kullanabilirsiniz. O adresteki renkleri syle kullanyoruz: Renk paletinden istedi iniz bir rengin zerine tklayn. Aa da selected color code is: yazan g s g kutucuktaki kodun tamamn kopyalayn ve programnz iinde ilgili yere yaptrn. Bir rnek s verelim... Diyelim ki o renk paletinden bir renk setik ve #610B5E kodunu elde ettik. Simdi bu kodun tamamn kopyalyoruz ve gerekli yere yaptryoruz: s
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.show()

self.etiket = gtk.Label("Merhaba") self.etiket.set_markup("<span foreground=#610B5E>Merhaba</span>") self.pencere.add(self.etiket) self.etiket.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, seti imiz renk baaryla etiket rengi olarak ayarland... g g s E er etiket metnini yukarda yapt mz gibi st ste iki kez yazmak istemiyorsanz, g g get_text() metodu yardmyla otomatik olarak etiket metnini alabilirsiniz:
self.etiket.set_markup("<span foreground=<#610B5E>%s</span>"%self.etiket.get_text())

g s s E er istersek, bu yntemi kullanarak daha karmak iler de yapabiliriz. Mesela bir etiketi farkl renklere boyamak gibi...
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.show() self.etiket = gtk.Label("Merhaba") self.renkli1 = self.etiket.get_text()[:4] self.renkli2 = self.etiket.get_text()[4:] self.pml = "\ <span foreground=#610B5E>%s</span>\ <span foreground=#FF0000>%s</span>" self.etiket.set_markup(self.pml %(self.renkli1, self.renkli2)) self.pencere.add(self.etiket) self.etiket.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada yapt mz sey, karakter dizisini dilimlemekten ibaret... Karakter dizisinin ilk drt har g iin bir renk, geri kalan hareri iin ise baka bir renk belirledik. s Bu konuyla ilgili son bir rnek daha vererek yolumuza devam edelim. Bu defa, birka rnek nce gsterdi imiz saya programnda tek saylar bir renkle ift saylar baka bir renkle g s gstermeyi deneyelim:
#-*-coding: utf-8 -*import pygtk

pygtk.require20() import gtk import time class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.etiket = gtk.Label("balyor...") s self.pencere.add(self.etiket) self.pencere.show() self.etiket.show()

for i in range(11): while gtk.events_pending(): gtk.main_iteration() time.sleep(1) if i % 2 == 0: self.etiket.set_markup("<span foreground=red>%s</span>"%i) else: self.etiket.set_markup("<span foreground=blue>%s</span>"%i) def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada ok basit bir mantk kullandk. E er say 2ye blnd nde kalan 0 ise (if i % 2 == 0) g g bu say ifttir. E er kalan 0 de ilse o say tektir... Bu mant a gre, 2ye tam blnen saylar g g g iin red, yani krmz renk belirledik. Bunu su kod yardmyla yaptk:
if i % 2 == 0: self.etiket.set_markup("<span foreground=red>%s</span>"%i)

Ama e er say 2ye tam blnmyorsa, renk olarak blue yani maviyi setik: g
else: self.etiket.set_markup("<span foreground=blue>%s</span>"%i)

Bylece arayz zerindeki say de itike, bu saynn ift veya tek olmasna gre, her bir sayy gs iki farkl renkte gsterdik.

3.1.3 Etiketleri Yaslamak


Pygtk, oluturdu umuz etiketleri sa a-sola yaslamamza izin verir. Bunun iin set_justify() s g g adl bir metottan yararlanabiliriz. Bu metodu syle kullanyoruz:
etiket.set_justify(gtk.JUSTIFY_LEFT)

set_justify() metodu drt farkl parametre alabilir:

gtk.JUSTIFY_LEFT Metodun varsaylan de eri budur. Etiket metnini sola yaslar. g gtk.JUSTIFY_RIGHT Etiket metnini sa a yaslar. g gtk.JUSTIFY_CENTER Etiket metnini ortalar. gtk.JUSTIFY_FILL Etiket metnini pencere zerine dzgn olarak da tr. g Bu metot tek satrlk etiket metinleri zerinde hibir etkiye sahip de ildir. Dolaysyla g set_justify() metodunu kullanabilmek iin elimizde birden fazla satrdan oluan bir etiket s olmal. Buna ufak bir rnek verelim:
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.metin = """ Adana, Trkiyenin gneyinde, Dou Akdenizin kuzeyinde yer alan ildir. g l merkezinin ad da Adana olup, I Seyhan, Yreir, ukurova, Saram ve g Karaisal ilelerinin birleimiyle oluur. s s """ self.etiket = gtk.Label(self.metin) self.etiket.set_justify(gtk.JUSTIFY_CENTER) self.pencere.add(self.etiket) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

3.1.4 Etiketleri Seilebilir Hale Getirmek


Pygtkde Label pencere aracn kullanarak bir etiket oluturdu umuzda, varsaylan olan s g etiket metnini fare ile seemeyiz. Dolaysyla, yazd mz programdaki etiket metnini kopyg alama imkanmz da yoktur. Ancak Pygtkdeki set_selectable() adl bir metodun de erini g de itirerek bu durumu tersine evirebiliriz: gs
#-*-coding: utf-8 -*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL)

self.pencere.connect("delete_event", gtk.main_quit) self.metin = """ Adana, Trkiyenin gneyinde, Dou Akdenizin kuzeyinde yer alan ildir. g l merkezinin ad da Adana olup, I Seyhan, Yreir, ukurova, Saram ve g Karaisal ilelerinin birleimiyle oluur. s s """ self.etiket = gtk.Label(self.metin) self.etiket.set_selectable(True) self.pencere.add(self.etiket) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada set_selectable() metodunun de erini True yapt mz iin, etiket metni fare ile g g seilebilir. Ayrca bu etiket zerinde farenin sa tuu da alacak, bylece etiket metnini g s s kopyalayabileceksiniz.

3.2 Button Pencere Arac


gtk.Label() adl pencere aracyla yeterince altk. renme srecimizin skc bir hal almas g mas iin dilerseniz yeni bir pencere arac daha grelim. Hem bylece Pygtkdeki olanaklarmz da artm olur... s Simdi renece imiz pencere aracnn ad gtk.Button(). Button kelimesi d me an g g g lamna gelir. Dolaysyla bu pencere arac programlarmza d me ekleme imkan sa layacak g g bize. Button pencere aracnn kullanm az ok Label pencere aracnnkine benzer. Bir Pygtk uygulamasnda d me oluturmak iin su kodu kullanyoruz: g s
dugme = gtk.Button("dme") g

Burada gtk.Button() fonksiyonu d menin kendisidir. g Fonksiyona parametre olarak atad mz d me kelimesi ise, oluturdu umuz d me zerinde grnecek yazdr. g g s g g Isterseniz bunu bir rnek iinde kullanalm:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dugme = gtk.Button("dme") g self.dugme.show() self.pencere.add(self.dugme) self.pencere.show()

def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu sekilde, zerinde d me yazan bir d me oluturmu olduk... Yalnz burada d meyi g g s s g oluturma admlarna ok dikkat ediyoruz. D me olutururken su admlar takip ettik: s g s ncelikle self.dugme = gtk.Button(d me) satr yardmyla pencere zerinde bir d me g g meydana getiriyoruz. Burada gtk modlnn Button() fonksiyonunu kullandk ve bu fonksiyona self.dugme adn verdik. Oluturaca mz d menin zerinde ne yazaca n ise s g g g Button() fonksiyonunun iinde bir parametre olarak belirliyoruz. Bizim rne imizde oluturg s du umuz d menin zerinde d me kelimesi yazacak. g g g Ikinci adm olarak, d memizi gsteriyoruz. g Bu ilemi de self.dugme.show() satr s yardmyla gerekletiriyoruz. E er bu satr yazmazsak d memiz yine de oluur, ama s g g s ekranda grnmez! Atmamz gereken son adm ise bu d meyi ana pencereye eklemek olacaktr. g self.pencere.add(self.dugme) satr bu ie yaryor... s ste I

Dikkat ederseniz oluturdu umuz d me, pencerenin tamamn kaplyor. Yani d memiz ana s g g g pencerenin iine, etrafnda hi boluk brakmayacak sekilde yerlemi... E er d memizin s s s g g etrafnda biraz boluk brakmak istersek set_border_width() adl metottan yararlanaca z: s g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dugme = gtk.Button("dme") g self.dugme.set_border_width(30) self.dugme.show() self.pencere.add(self.dugme) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada yazd mz self.dugme.set_border_width(30) satr, d menin drt tarafnda 30 pikg g sellik bo bir alan oluturuyor. Ayn metodu, istersek ana pencereye de uygulayabiliriz. Bu s s metodu ana pencereye uygulad mzda, pencere iinde belirledi imiz piksel says kadar bir g g alan oluacaktr: s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_border_width(30) self.dugme = gtk.Button("dme") g self.dugme.show() self.pencere.add(self.dugme) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Temel olarak Pygtkde bir d meyi nasl oluturaca mz rendi imize gre artk yolumuza g s g g g devam edebiliriz. Bir d me elbette zerine tkland nda bir ilevi yerine getirebilirse ie yarar g g s s bir hal alacaktr. Bir sonraki blmde, d melerimize nasl grev atayaca mz renece iz. g g g g

3.2.1 Dgmelere Grev Atamak


Daha nceki derslerimizde ana pencereye nasl grev atayaca mz renmitik. Hatrg g s larsanz, Pygtkyi kendi haline brakt mzda, ana penceredeki arp d mesine tklamamz g g aslnda programn kapanmasn sa lamyordu. Programmz baaryla kapatabilmek iin ana g s pencerenin arp d mesine bir grev atamamz gerekiyordu. Bu ilemi syle yapyorduk: g s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Kodlarmz bu sekilde yazd mz zaman, pencerenin arp d mesine tklad mzda pro g g g grammz tamamen kapanacaktr. Biz yukardaki rnekte iimizi tek satrda hallettik. Yani s gtk.main_quit kodunu do rudan self.pencere.connect() fonksiyonuna bir parametre olarak g atadk. Ama e er istersek bu parametreyi ayr bir fonksiyon olarak da yazabilece imizi biliyg g oruz:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.pencere.show() def kapat(self, penar, event): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada kapat() adl fonksiyonumuzun en az iki parametre ald na dikkat ediyoruz (penar g ve event). penar adl parametre kapat() adl fonksiyonun ba lanaca pencere aracn; g g event adl parametre ise arp iaretine tkland nda gerekleecek olay temsil ediyor. s g s Bizim rne imizde penar ana pencerenin kendisi oluyor. event ise delete_event... g D melere grev atamak istedi imizde de buna benzer bir yntem kullanyoruz. Simdi mesela g g bir d me oluturalm ve bu d meye tklad mzda programmz kapansn: g s g g
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_border_width(10) self.pencere.show() self.dugme = gtk.Button("Kapat") self.dugme.connect("clicked", gtk.main_quit) self.dugme.show() self.pencere.add(self.dugme) def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada basite clicked adl sinyali gtk.main_quit adl fonksiyona ba ladk. clicked, g Pygtkde fare ile tklama hareketini ifade eder. Burada d me zerine fare ile tkland nda g g gtk.main_quit() adl fonksiyon faaliyete geecektir. Bu fonksiyonun pencereyi kapatma vazifesi grd n biliyoruz. Dolaysyla ana pencere zerindeki Kapat adl d meye fare ile g g tklad mzda penceremiz (ve tabii ki programmz) kapanacaktr. g Burada gtk.main_quit() fonksiyonunu do rudan connect() fonksiyonu iinde belirttik. g D meye tkland nda daha karmak ilemler yapabilmemiz iin o unlukla ayr bir fonksiyon g g s s g yazmamz gerekecektir. Isterseniz hemen buna bir rnek verelim:

#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_border_width(10) self.pencere.show() self.dugme = gtk.Button("Kapat") self.dugme.connect("clicked", self.kapat) self.dugme.show() self.pencere.add(self.dugme) def kapat(self, penar): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada dikkat etmemiz gereken birka nokta var: Kodlarmz iinde tanmlad mz kapat() g adl fonksiyon self dnda en az 1 parametre daha almak zorunda... kapat() fonksiys onu iin belirledi imiz penar adl parametre, kapat() fonksiyonunun hangi pencere aracna g ba lanaca n gsteriyor. Bizim rne imizde bu fonksiyon self.dugme adl pencere aracna g g g ba lanyor. Bu arada, buradaki kapat fonksiyonunu self.pencere.connect(delete_event, g self.kapat) seklinde ana pencereye atayamayaca mza dikkat edin... Neden? nk g delete_event adl olay (event), ba l oldu u fonksiyonun en az 2 parametreye sahip olg g masn gerektirir (self hari). clicked adl sinyal (signal) ise ba l oldu u fonksiyonun g g en az 1 parametre almasn gerektirir... Dolaysyla olaylarn (event) ve sinyallerin (signals) gerektirdi i parametre says farkl oldu u iin ayn fonksiyonu hem olaylar hem de g g sinyaller iin kullanamyoruz. Ama mitsizli e kaplmayn! Kullanamyoruz, dediysek hi g kullanamyoruz, demedik!... Bu sorunun stesinden gelmenin de bir yolu yordam var. kapat adl fonksiyona nc bir parametre daha ekleyip buna da varsaylan olarak None de eri verirsek sorunumuzu halletmi oluruz... g s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", self.kapat) self.pencere.set_border_width(10) self.pencere.show() self.dugme = gtk.Button("Kapat")

self.dugme.connect("clicked", self.kapat) self.dugme.show() self.pencere.add(self.dugme) def kapat(self, penar, event=None): gtk.main_quit() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bylece ayn kapat() fonksiyonunu hem pencereye hem de pencere aracna atam olduk... s Burada zel olarak dikkat etmemiz gereken e clicked adl sinyaldir. sin asl ksmn gerekg I letirmemizi bu sinyal sa lar. Pygtkda d meler temel olarak su sinyalleri retir: s g g clicked fare ile d me zerine tklanp braklma an g pressed fare ile d me zerine baslma an g released farenin tuunun serbest braklma an s enter imlecin d menin zerine gelme an g leave imlecin d meyi terketme an g Bu sinyaller iinde clicked ve released adl sinyaller, davranlar bakmndan birbirine ok s benzer. sinyal de, fare tuuna basld nda de il, farenin tuu brakld nda retilecekIki s g g s g tir. Ancak bu iki sinyal arasnda nemli bir fark vardr. clicked sinyalini kulland mzda, g farenin tuuna basp, tuu brakmadan fare imlecini d meden uzaklatrrsak ve bundan s s g s sonra farenin tuunu serbest brakrsak zerine tklad mz d me ilevini yerine getirmeyes g g s cektir. Ama released sinyalini kulland mzda, farenin tuuna basp, tuu brakmadan fare g s s imlecini d meden uzaklatrsak dahi, farenin tuunu serbest brakr brakmaz ana pencere g s s zerindeki d me ilevini yerine getirecektir... Bu ikisi arasndaki fark daha net anlamak iin g s iki sinyalin ayr ayr kullanld kodlar yazp, sonucu incelemenizi neririm. g Yukarda verdi imiz be farkl sinyal iinde iimize en ok yarayacak olan, clicked adl g s s sinyaldir. teki sinyallere, yazd mz programlarda nispeten daha az ihtiya duyaca z... g g Gelin simdi bu rendiklerimizi prati e dken basit bir uygulama yazalm: g g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): #Her dmeye tklaymzda farkl bir dil g s #ad gsteren bir uygulama yazyoruz... Bunun iin ncelikle dilleri #ieren bir liste oluturuyoruz. s self.diller = ["Trke", "ngilizce", "Almanca", "Franszca", "talyanca"] I I #self.diller adl listedeki elere erimek iin aadaki g s s g #index deerini kullanacaz. g g self.index = 0

#Uygulamamzn ana penceresini oluturuyoruz. s self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) #Uygulamamzn dzgn kapanmas iin "delete_event"i #"gtk.main_quit()" adl fonksiyona balyoruz. g self.pencere.connect("delete_event", gtk.main_quit) #Penceremizin baln belirliyoruz. s g self.pencere.set_title("rnek bir uygulama...") #Penceremizi ekrann ortasnda konumlandryoruz. self.pencere.set_position(gtk.WIN_POS_CENTER) #Penceremizin boyutunu belirliyoruz. self.pencere.resize(100, 100) #Penceremizi gsteriyoruz. self.pencere.show() #zerinde "Bala!" yazan bir dme... s g self.dugme = gtk.Button("Bala!") s #Dmemizin etrafnda biraz boluk brakalm. g s self.dugme.set_border_width(25) #Dme zerine basldnda "self.say" adl fonksiyon g g #almaya balasn. s s self.dugme.connect("pressed", self.say) #Dmemizi ana pencereye ekliyoruz. g self.pencere.add(self.dugme) #Dmemizi gsteriyoruz. g self.dugme.show() def say(self, penar): #dmemizin etiketini deitiriyoruz. index deeri her g g s g #defasnda bir say artarak ilerleyecei iin, bu index g #deerini self.diller adl listenin elerine tek tek g g #erimek amacyla kullanabiliriz. s self.dugme.set_label(self.diller[self.index]) #Dmeye her basta index deerini 1 say artralm. g s g self.index += 1 #index deeri listenin sonuncu esine ulanca g g s #programmzn hata vermemesi iin index deerini g #sfrlyoruz. Bylece liste elerini almaya g #tekrar en batan balayabiliyoruz. s s if self.index == len(self.diller): self.index = 0 def main(self): #Uygulamamzn dinamosu... gtk.main() uyg = Uygulama() uyg.main()

Daha nce de syledi imiz gibi, bir d meye grev atayaca mz zaman, atanacak ilevi g g g s ieren fonksiyonu yazarken bu fonksiyonun self ile birlikte en az 2 parametre iermesine dikkat ediyoruz. Esasnda, yazaca mz bu fonksiyon nc bir parametre daha ierebilir. Bu g nc parametreyi syle kullanabiliriz:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.sayac = 0 self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_border_width(10) self.pencere.set_position(gtk.WIN_POS_CENTER) self.dugme = gtk.Button("Tamam") self.pencere.add(self.dugme) self.dugme.connect("clicked", self.bas, "Tamam") self.dugme.show() self.pencere.show() def bas(self, penar, veri): self.sayac += 1 print "%s dmesine %s kez bastnz!" %(veri, self.sayac) g def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada bas() adl fonksiyona nc bir parametre ekledik ve bu parametrenin adn veri koyduk. Elbette siz isterseniz buna baka bir ad da verebilirsiniz... Bu yeni parametreyi temsil s eden veriyi de connect() fonksiyonu iinde belirttik (Tamam). Burada d menin ad olan g Tamam do rudan yazmak yerine syle bir sey de yapabilirsiniz tabii ki: g self.dugme.connect(clicked, self.bas, self.dugme.get_label()) Bu sekilde kodlarmz daha esnek bir hale getirmi oluyoruz... s Bu arada e er komut satrnda Trke karakterleri gsteremiyorsanz bas() fonksiyonu iindeki g karakter dizisini syle yazdrabilirsiniz:
print u"%s dmesine %s kez bastnz!" %(veri, self.sayac) g

Burada karakter dizisini Unicode olarak belirledi imize dikkat edin... g

s 3.2.2 Dgmelerin Rengini Degi tirmek


Normal sartlar altnda Pygtk uygulamalarnda kullanaca nz d melerin rengini de itirmeye g g gs ihtiya duyaca nz zannetmiyorum. Ama e er olur da farkl renkte d meler kullanmak isg g g tersiniz diye Pygtk size bu iste inizi gerekletirmenizi sa layacak aralar da sunar... g s g

Pygtkde bir d menin rengini de itirmek iin modify_bg() adl bir metottan yararlanaca z. g gs g Ancak bir d menin rengini de itirebilmek iin bundan fazlasn bilmeye ihtiyacmz var. g gs nk Pygtkde d me rengini belirlerken renk adn dmdz kullanamazsnz. g Isterseniz laf uzatmadan bir rnek verelim:
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("destroy", gtk.main_quit) self.pencere.set_border_width(30) self.btn = gtk.Button("deneme") #imdi dmenin rengini deitiriyoruz... s g g s self.btn.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color("red")) self.pencere.add(self.btn) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi krmz renkte bir d me oluturduk... Burada ilk olarak modify_bg() adl g g s bir metot gryoruz. Ancak bu metodun d me rengini de itirebilmesi iin baz parameg gs trelere ihtiyac var. Bu metodun ald ilk parametre gtk.STATE_NORMAL. Bu ifade bir pencere g aracnn durumunu gsteriyor. Pygtkde pencere aralar be farkl durumda bulunabilir: s gtk.STATE_NORMAL Bir pencere aracnn herhangi bir ilem yaplmyorkenki durumu. s Mesela bir program balatld nda, arayz zerindeki d meler gtk.STATE_NORMAL denen durums g g dadr. Yukarda verdi imiz rnekte d menin rengini, bu gtk.STATE_NORMAL denen dug g rum iin de itiriyoruz. E er d menin zerine fare ile gelecek olursanz d me renginin gs g g g eski haline dnd n greceksiniz. nk fare ile zerine geldi inizde d memiz artk g g g gtk.STATE_NORMAL denen durumda olmayacaktr... gtk.STATE_PRELIGHT Bir pencere aracnn zerine fare ile gelindi indeki durumu. Yukardaki rnekte d me zerine g g fare ile geldi inizde d menin renginin eski haline dnd n grdnz. ste d menin zerg g g I g ine fare ile geldi iniz duruma gtk.STATE_PRELIGHT ad verilir. Yukardaki rnekte ilgili satr g syle de itirin: gs
self.btn.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color("red"))

Simdi d menin zerine fare ile geldi inizde d menin krmzya dnd n greceksiniz. g g g g nk bu defa d me rengini gtk.STATE_NORMAL iin de il, gtk_STATE_PRELIGHT iin g g de itirdik... gs gtk.STATE_ACTIVE Bir pencere aracnn aktif oldu u duruma gtk.STATE_ACTIVE ad verilir. Mesela bir d meye g g bast nz anda o d me gtk.STATE_ACTIVE denen duruma geer. Yukardaki rne in ilgili g g g

satrn syle de itirin: gs


self.btn.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.Color("red"))

Simdi d meye tklad nzda d me krmzya dnecek, brakt nzda ise eski rengini alacak g g g g tr. gtk.STATE_SELECTED Bir pencere aracnn seili oldu u duruma gtk.STATE_SELECTED ad verilir. Henz bir buna g rnek olarak gsterebilece imiz bir pencere arac renmedik, ama mesela bir liste kutusu g g iindeki seili satr gtk.STATE_SELECTED durumuna rnek olarak verilebilir... gtk.STATE_INSENSITIVE Bir pencere aracnn megul oldu u duruma gtk.STATE_INSENSITIVE ad verilir. Henz bunun s g iin de verecek bir rne imiz yok. Ama zamanla olacak... g D menin rengini de itirmek iin yazd mz koddaki modify_bg() ve gtk.STATE_ACTIVE g gs g ksmlarn anladk. Incelememiz gereken sadece gtk.gdk.Color(red)) ksm kald... gtk.gdk.Color(), renkleri tutma grevi gren bir snftr. Temel renkler iin Ingilizce renk adlarndan yararlanabiliriz. Veya daha nce de grd mz gibi http://html-color-codes.info/ g adresindeki onaltlk renk kodlarn kullanabiliriz. E er isterseniz RGB renk kodlarn da g gtk.gdk.Color() snf iinde kullanabilirsiniz. Bu snf bu haliyle GNU/Linux zerinde herhangi bir sorun karmadan alacaktr. Ancak Windows zerinde bu snf altrmak istes s di inizde TypeError: an integer is required gibi bir hata alyorsanz gtk.gdk.Color() snf g yerine gtk.gdk.color_parse() snfndan da yararlanabilirsiniz:
self.btn.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("red"))

E er Windows zerinde bu kodlar da bekledi iniz sonucu vermiyorsa sorun kulland nz g g g temadadr. Balat > Programlar > GTK+ > Theme Selector yolunu takip ederek mevcut GTK s temasn de itirmeyi deneyin. E er Theme Selector uygulamas Balat mensnde grngs g s myorsa, C\GTK\bin klasr iinde gtkthemeselector.exe adl uygulamay bulup buna ift tklayarak da tema seici program balatabilirsiniz... s

BLM

Pencere Aralarnn Yerle imi s

Simdiye kadar yazd mz Pygtk uygulamalarnda hep ana pencere zerine tek bir pencere g arac yerletirdik. Dikkat ettiyseniz hi bir uygulamamzda ayn anda birden fazla pencere s arac kullanmadk. nk simdiye kadar rendi imiz bilgiler tek bir pencere zerine ayn g g anda birden fazla pencere arac yerletirmemize msaade etmiyordu. Ama artk bu ii nasl s s yapaca mz renmemizin vakti geldi... ste biz de bu blmde, Pygtk uygulamalarna nasl g g I ayn anda birden fazla pencere ekleyebilece imizi renece iz. g g g Bu dedi imiz ilemi gerekletirebilmek iin, Pygtk bize birka farkl seenek sunuyor. Bu g s s blmde bize sunulan bu yntemleri tek tek incelemeye alaca z. s g

4.1 Fixed() Haznesi


Yukardaki giri blmnde bahsetti imiz gibi, Pygtkde pencere aralarn yerletirmek s g s iin elimizde birka farkl seenek vardr. Fixed() haznesini kullanmak da bu seenekler biridir. ncelikle haznenin ne demek oldu unu anlamaya alalm... Programlama dillerinde g s hazne; baka nesneleri iinde barndran bir ara olarak tarif edilebilir. Hazne kelimesinin s Ingilizcedeki karl container... s g Bu blmde grece imiz Fixed() adl ara da bir haznedir. Fixed() adl bu hazne, Pytgtk ile g oluturaca mz pencere aralarn iinde barndrma vazifesi grr. s g Isterseniz hemen bunun nasl kullanlaca na ilikin bir rnek verelim: g s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_border_width(10) self.dugme1 = gtk.Button("Birinci") self.dugme2 = gtk.Button("kinci") I

40

self.dugme3 = gtk.Button("nc") self.hazne = gtk.Fixed() self.pencere.add(self.hazne) self.hazne.put(self.dugme1, 0, 0) self.hazne.put(self.dugme2, 65, 0) self.hazne.put(self.dugme3, 120, 0) self.dugme1.show() self.dugme2.show() self.dugme3.show() self.hazne.show() self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada ncelikle gtk.Fixed() adl snf rnekliyoruz ve buna self.hazne adn veriyoruz. Zira gtk.Fixed() bir hazne olmasnn yansra, GTK iindeki snardan biridir ayn zamanda... Dolaysyla bu snf programmz iinde kullanabilmek iin ncelikle bunu rneklememiz gerekiyor. rnekleme ilemini tamamladktan sonra haznemizi ana pencereye ekliyoruz. Bu ilemi s s yapmak iin self.pencere.add(self.hazne) kodunu kullandk. Haznemizi ana pencereye ekledi imize gre, pencere aralarmz hazne iine koymaya balayabiliriz... Grd nz gibi, g s g nce pencereyi oluturuyoruz, ardndan haznemizi oluturup bunu pencereye ekliyoruz, son s s olarak da pencere aralarn hazneye yerletiriyoruz. Pencere aralarmz hazneye yerletires s bilmek iin put() adl fonksiyondan yararlanaca z. Bu fonksiyonun forml syledir: g
hazne.put(pencere_arac, x_dzlemindeki_konum, y_dzlemindeki_konum)

Bu formle gre, self.hazne.put(self.dugme1, 0, 0) ifadesi su anlama geliyor: d me1i, x dzleminde (yani soldan sa a) 0. noktaya; y dzleminde ise (yani yukardan g g aa ya) 0. noktaya gelecek sekilde hazne iine yerletir! s g s Ayn mant kullanarak teki d melerimizi de srasyla x dzleminde 65. ve 120. noktalara; g g y dzleminde ise 0. ve 0. noktalara gelecek sekilde hazne iine yerletiriyoruz. s Sra geldi btn aralarmz gstermeye... Aralarmz gsterirken iten da do ru ilerlems g enizi neririm. Buna gre ilk nce d meleri gsteriyoruz: g
self.dugme1.show() self.dugme2.show() self.dugme3.show()

Daha sonra haznemizi gsteriyoruz:


self.hazne.show()

Son olarak da en dta yer alan penceremizi gsteriyoruz: s

self.pencere.show()

Bu arada size bir ipucu vereyim. Grd nz gibi her arac tek tek gstermek biraz yorucu g ve skc oluyor. Pygtk bu konuda da bizi byk bir dertten kurtaracak ve daha az benzin yakmamz sa layacak bir metot sunuyor bize. Bu sekilde btn aralar tek tek gstermek g yerine syle bir sey yazabiliriz:
self.pencere.show_all()

Yani kodlarmz syle grnecek:


#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_border_width(10) self.dugme1 = gtk.Button("Birinci") self.dugme2 = gtk.Button("kinci") I self.dugme3 = gtk.Button("nc") self.hazne = gtk.Fixed() self.pencere.add(self.hazne) self.hazne.put(self.dugme1, 0, 0) self.hazne.put(self.dugme2, 65, 0) self.hazne.put(self.dugme3, 120, 0) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

show_all() metodu pencere zerindeki btn aralar gsterecektir. Dolaysyla bu metodu ana pencereye ba lamaya dikkat ediyoruz... g Fixed() adl haznenin put() adl fonksiyonundan baka bir de move() adl bir fonksiyonu s vardr. move kelimesinin Trkede hareket etmek anlamna geldi ini sylersek, herhalde g bu fonksiyonun ilevi az ok ortaya kacaktr... move() fonksiyonu, Fixed() haznesi iindeki s pencere aralarn hareket ettirmemizi, yani bunlarn yerlerini de itirmemizi sa lar. gs g Bununla ilgili basit bir rnek verelim:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_border_width(10) self.dugme1 = gtk.Button("Tkla!") self.dugme1.connect("clicked", self.oynat) self.dugme2 = gtk.Button("Ikinci") self.dugme3 = gtk.Button("nc") self.hazne = gtk.Fixed() self.pencere.add(self.hazne) self.hazne.put(self.dugme1, 0, 0) self.hazne.put(self.dugme2, 65, 0) self.hazne.put(self.dugme3, 120, 0) self.pencere.show_all() def oynat(self, penar): self.hazne.move(self.dugme2, 65, 50) self.hazne.move(self.dugme3, 120, 100) def main(self): gtk.main() uyg = Uygulama() uyg.main()

move() fonksiyonunun nasl kullanld n gryorsunuz... Bu fonksiyon gtk.Fixed() snfna g ait oldu u ve biz de bu snf daha nceden hazne adyla rnekledi imiz iin, bu fonksiyg g onu self.hazne.move() seklinde kullanyoruz. Bu fonksiyonun birinci parametresi, hareket ettirilecek pencere aracdr. Ikinci ve nc parametreler ise pencere aracnn x ve y dzlemlerine gre hangi konumlara tanaca n gsteren iki adet tamsaydr. Bu program s g altrd mzda, Tkla! etiketli d meye bast mz zaman s g g g Ikinci ve nc etiketli d meler yer de itirecektir... g gs Bu yeni bilgiyi kullanarak biraz daha ilgin seyler de yapabiliriz. Mesela fareyle zerine gelindi inde etrafa kaan d meler yapabiliriz bu move() fonksiyonunu kullanarak... g s g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk import random class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.resize(500, 500) self.dugme1 = gtk.Button("Birinci")

self.dugme1.connect("enter", self.salla) self.dugme2 = gtk.Button("kinci") I self.dugme2.connect("enter", self.salla) self.dugme3 = gtk.Button("nc") self.dugme3.connect("enter", self.salla) self.hazne = gtk.Fixed() self.pencere.add(self.hazne) self.hazne.put(self.dugme1, 0, 0) self.hazne.put(self.dugme2, 65, 0) self.hazne.put(self.dugme3, 120, 0) self.pencere.show_all() def salla(self, penar): self.hazne.move(penar, random.randint(0,450), random.randint(0, 450)) def main(self): gtk.main() uyg = Uygulama() uyg.main()

Buradaki salla() fonksiyonunu biraz aklayalm: move() fonksiyonunun hangi parametrelere ihtiya duydu unu biliyoruz. Bu fonksiyonu kulg lanabilmek iin ilk parametre olarak hareket ettirilecek pencere aracn yazmamz gerekiyor. Ikinci ve nc parametrelerde ise konum bilgilerini veriyoruz... Daha nceden, Pygtkde sinyalleri ba lad mz fonksiyonlarn self hari en az bir parametreye sahip olmas gerekg g ti ini sylemitik. Bu parametre, sinyalin ba lanaca pencere arac olacak. Dolaysyla g s g g salla() fonksiyonunun parametresinden tr zaten elimizde pencere aracnn ad var... ste I biz bu pencere aracn move() fonksiyonu iinde de kullanaca z. Bylelikle her bir d me g g iin ayr fonksiyon yazmamza gerek kalmyor... Elimizdeki bilgilere gre move() fonksiyonunu rahatlkla oluturabiliyoruz. random modlnn retti i rastgele saylar sayesinde de s g d melerin zerine fare ile her geliimizde d melerin her biri farkl konumlara kayor. g s g s Farenin d me zerine gelme ann enter ile gsterdi imizi nceki blmde sylemitik. g g s Dolaysyla d melere grev atarken clicked yerine enter sinyalini yazmay unutmuyoruz. g Peki bu kaan d meleri yakalama ihtimalimiz var m? Evet, ok dk bir ihtimal de olsa s g s var... E er random modlnn art arda retti i saylar birbirine ok yakn olursa d meleri g g g yakalayabiliriz... Grd nz gibi, Fixed() haznesi iine yerletirdi imiz d meler, zerinde yazan etiketin boyug s g g tunu alyor. Dolaysyla Tamam ve git gibi iki farkl etikete sahip iki d menin boyutu birg birinden farkl olacaktr. Bir rnek verelim:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit)

self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_border_width(10) self.etiket1 = gtk.Label("e.posta al!") self.etiket2 = gtk.Label("e.posta gnder!") self.etiket3 = gtk.Label("e.posta sil!") self.dugme1 = gtk.Button("Al!") self.dugme2 = gtk.Button("Gnder!") self.dugme3 = gtk.Button("Sil") self.hazne = gtk.Fixed() self.pencere.add(self.hazne) self.hazne.put(self.etiket1, 0, 10) self.hazne.put(self.etiket2, 0, 50) self.hazne.put(self.etiket3, 0, 90) self.hazne.put(self.dugme1, 110, 7) self.hazne.put(self.dugme2, 110, 47) self.hazne.put(self.dugme3, 110, 87) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, buradaki d melerin her birinin boyutu birbirinden farkl... E er isteg g g di iniz buysa sorun yok, ama e er btn d melerin ayn boyutta olmasn isterseniz g g g set_size_request() adl metodu kullanmanz gerekecek:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_border_width(10) self.etiket1 = gtk.Label("e.posta al!") self.etiket2 = gtk.Label("e.posta gnder!") self.etiket3 = gtk.Label("e.posta sil!") self.dugme1 = gtk.Button("Al!") self.dugme1.set_size_request(65, 25) self.dugme2 = gtk.Button("Gnder!") self.dugme2.set_size_request(65, 25) self.dugme3 = gtk.Button("Sil")

self.dugme3.set_size_request(65, 25) self.hazne = gtk.Fixed() self.pencere.add(self.hazne) self.hazne.put(self.etiket1, 0, 10) self.hazne.put(self.etiket2, 0, 50) self.hazne.put(self.etiket3, 0, 90) self.hazne.put(self.dugme1, 110, 7) self.hazne.put(self.dugme2, 110, 47) self.hazne.put(self.dugme3, 110, 87) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada set_size_request() metodunu kullanarak btn d melerin boyutunu 65x25 pikg sel olarak ayarladk. Bu set_size_request() metodu yalnzca d melerle kullanlan bir metot g de ildir. Mesela bu metodu pencereleri boyutlandrmak iin de kullanabiliriz: g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_size_request(100, 100) self.pencere.show() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Hatrlarsanz, daha nceki derslerimizde pencereleri boyutlandrmak iin resize() adl baka s bir metot kullanmtk. Hem resize(), hem de set_size_request() yaygn olarak pencere s boyutlandrma ilemleri iin kullanlr. s Ama aslnda bu iki metodun birbirinden nemli bir fark vardr. resize() metodunu kullanarak boyutlandrd mz bir pencereyi daha g sonradan kenarlarndan srkleyip istedi imiz boyuta kadar kltp bytebiliriz. Ama g set_size_request() metodunu kulland mzda, oluan pencere ancak set_size_request() g s metodu iinde belirtilen boyutlar kadar kltlebilir. Bu dedi imi tam olarak anlamak g iin hem resize() hem de set_size_request() metoduyla ayr ayr iki pencere olutus rup elle boyutlandrmay denemeniz gerekiyor... Bunu yapt nzda greceksiniz ki, aslnda g set_size_request() metodu, bir pencerenin sahip olabilece i minimum boyutu belirlememg izi sa lyor... g

Bylece Pygtkde pencere aralarn arayz zerine yerletirmemizi sa layan yntemlerden s g birini grm olduk. Ancak bununla ilgili size bir iyi, bir de kt haberim var... nce iyi haberle s balayaym: s haber, Fixed() haznesinin kullanmnn karmak olmamasdr. Bu hazneyi kullanarak iIyi s s lerinizi rahatlkla halledebilirsiniz. Fixed() haznesinin fazla bir zelli i olmad iin, teki g g aralara kyasla renmesi daha kolaydr... Simdi gelelim kt habere: g Pygtk programlarnda Fixed() haznesi hemen hemen hi kullanlmaz!... nk bu aracn zayklar gl yanlarndan ok daha fazladr ve kimi yerlerde programnzn arayznn berbat olmasna yol aabilir. Fixed() haznesi, pencere aralarn arayz zerinde sabit noktalara yerletirir. Dolaysyla kullanclarnz sistemlerindeki temay de itirirlerse programnzn arayz s gs zerinde kaymalar meydana gelebilir. Ayrca sizin program yazd nz sistemdeki yaztiplerinin g boyutu ile, program kullanan kiilerin sistemindeki yaztipi boyutlar arasndaki farkllklar s d me ve etiketlerin tamasna neden olabilir. Mesela yukarda verdi imiz rneklerin Windows g s g ve GNU/Linuxta ayn sekilde grnece inin garantisi yoktur... Hatta ayn iletim sistemleri g s iinde dahi pencere aralarnn grnnde byk farkllklar ortaya kabilir. Bunun dnda, s s zellikle ok-dilli uygulamalar gelitiriyorsanz bu hazneyi kullanmaktan kanmanz gerekes cektir. nk bir etiket baka bir dile evrildi inde byk ihtimalle kaplad alan da de iecek s g g gs ve pencere aralarnn st ste binmesine yol aabilecektir. Ayn sekilde, e er tasarlad nz g g bir uygulama sa dan sola do ru yazlan bir dile evrilmek istenirse, kulland nz Fixed() hazg g g nesinden dolay bu gerekleemeyecektir. nk bu haznenin bidi (ift-ynl yazm) deste i s g bulunmuyor... Bunun dnda, bu hazne ile yerletirilmi bir ede de iiklik yapt nzda teki s s s g gs g elerin yerlerini de en batan ayarlamanz gerekecektir. g s

4.2 Table() Pencere Arac


Bu blmde, Fixed() haznesinden ok daha yetenekli bir aratan sz edece iz. Hatrlarsanz, g sahip oldu u dezavantajlardan tr, yazd mz uygulamalarda mmkn oldu unca Fixed() g g g haznesini kullanmaktan kanmamz gerekti ini sylemitik. Fixed() haznesinin tersine, bu g s blmde renece imiz Table() adl pencere arac bir hayli esnek ve gldr. g g Table Trkede tablo anlamna gelir. Isminden de anlalaca gibi, bu ara bize d melers g g imizi, etiketlerimizi ve baka pencere aralarmz arayz stne bir tablo seklinde dizme s imkan sa layacak. Burada tablo derken, satr ve stnlara sahip bir dzenden sz ediyoruz. g Oluturmak istedi imiz pencere aralarn, Table() aracnn satr ve/veya stunlarna yerletires g s ce iz. g Table() pencere arac sekil olarak ekran zerinde suna benzer bir yap oluturur: s
0 1 2 0+----------+----------+ | | | 1+----------+----------+ | | | 2+----------+----------+

Yukardaki izim, 2 satr ve 2 stundan oluan, 2x2 boyutlarndaki bir tabloyu gsteriyor. s ste biz de oluturaca mz pencere aralarn bu satr ve stunlara yerletirece iz. I s g s g Isterseniz hemen bunun kullanmyla ilgili ufak bir rnek verelim:
tablo = gtk.Table(2, 2)

Bu sekilde, 2 satr ve 2 stundan oluan bir tablo oluturmu olduk. Yani yukardaki izime s s s benzer bir tablo elde ettik.

Tabloya pencere arac eklemek iin attach() adl metottan faydalanaca z. Bu metodu syle g kullanyoruz:
tablo.attach(penar, stun_balangc, stun_sonu, satr_balangc, satr_sonu) s s

Burada penar, tabloya ekleyece imiz pencere aracnn kendisi oluyor. teki parametreler g ise pencere aracnn yerletirilece i tablo koordinatlarn gsteriyor. Dolaysyla bir tabloya s g pencere arac ekleyebilmek iin, oluturdu umuz tablonun satr ve stun numaralarn gz s g nnde bulundurmamz gerekiyor. Gelin isterseniz bununla ilgili basit bir rnek yapalm. ncelikle su kodlar yazyoruz:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

Simdi bir snf oluturup temel bilgileri bu snf iine yerletirelim: s s


class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit)

Simdi de tabloya yerletirece imiz d meleri oluturalm: s g g s


self.dgm1 self.dgm2 self.dgm3 self.dgm4 = = = = gtk.Button("dme1") g gtk.Button("dme2") g gtk.Button("dme3") g gtk.Button("dme4") g

Buraya kadar olan ksm topluca grelim:


#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 self.dgm2 self.dgm3 self.dgm4 = = = = gtk.Button("dme1") g gtk.Button("dme2") g gtk.Button("dme3") g gtk.Button("dme4") g

Bu ksmda bilmedi imiz herhangi bir sey yok. Burada grd mz her seyi nceki konulardan g g biliyoruz. Simdi yolumuza devam edelim. ncelikle 2x2 boyutlarnda bir tablo oluturuyoruz: s
self.tablo = gtk.Table(2, 2)

d memizi bu tablonun sol st kesine yerletirelim: Ilk g s s


self.tablo.attach(self.dgm1, 0, 1, 0, 1)

Grd nz gibi, attach() adl fonksiyona parametre olarak ilk nce tabloya yerletirece imiz g s g pencere aracn yazdk (self.dgm1). teki saylar ise d menin tam koordinatlarn gsteriyor. g Amacmz bu d meyi tablonun sol st kesine yerletirmek. Koordinatlar yazarken yukarda g s s verdi imiz izimi gz nnde bulundurmanz iinizi epey kolaylatracaktr. O izime gre g s s d memiz tam olarak syle grnecek: g
0 1 2 0+----------+----------+ | DME 1 | G | 1+----------+----------+ | | | 2+----------+----------+

Grd nz gibi, d memizin bulundu u konum syle: g g g stun_balangc=0 s stun_sonu=1 satr_balangc=0 s satr_sonu=1 Simdi ikinci d memizi yerletirelim. g s Ikinci d meyi tablonun sol alt kesine yerletirece iz. g s s g D memiz syle grnecek: g
0 1 2 0+----------+----------+ | | | 1+----------+----------+ | DME 2 | G | 2+----------+----------+

D memizin konumu syle: g stun_balangc=0 s stun_sonu=1 satr_balangc=1 s satr_sonu=2 Buna gre attach() fonksiyonunu su sekilde yazyoruz:
self.tablo.attach(self.dgm2, 0, 1, 1, 2)

Sra geldi nc d memizi yerletirmeye... Bunu tablonun sa st kesine yerletirece iz: g s g s s g


0 1 2 0+----------+----------+ | | DME 3 | G 1+----------+----------+ | | | 2+----------+----------+

Bu d memizin konumu da syle: g stun_balangc=1 s stun_sonu=2 satr_balangc=0 s satr_sonu=1

Buna gre attach() fonksiyonu syle olacak:


self.tablo.attach(self.dgm3, 1, 2, 0, 1)

Sra geldi son d memizi yerletirmeye... Bunu da tablonun sa alt kesine yerletirece iz: g s g s s g
0 1 2 0+----------+----------+ | | | 1+----------+----------+ | | DME 4 | G 2+----------+----------+

Buna gre bu d memizin konumu da syle olmal: g stun_balangc=1 s stun_sonu=2 satr_balangc=1 s satr_sonu=2 attach() fonksiyonumuzu yazyoruz:
self.tablo.attach(self.dgm4, 1, 2, 1, 2)

D melerimizi tablonun uygun yerlerine yerletirdi imize gre kodlarmzn son haline syle g s g bir topluca bakalm:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 = gtk.Button("dme1") g self.dgm2 = gtk.Button("dme2") g self.dgm3 = gtk.Button("dme3") g self.dgm4 = gtk.Button("dme4") g self.tablo = gtk.Table(2, 2) self.tablo.attach(self.dgm1, self.tablo.attach(self.dgm2, self.tablo.attach(self.dgm3, self.tablo.attach(self.dgm4, 0, 0, 1, 1, 1, 1, 2, 2, 0, 1, 0, 1, 1) 2) 1) 2)

Bu noktadan sonra artk tablomuzu ana pencereye eklememiz gerekiyor. Bunu da su komutla yapyoruz:
self.pencere.add(self.tablo)

Pencere zerindeki btn eleri gsteriyoruz: g


self.pencere.show_all()

main() fonksiyonumuzu yazyoruz:


def main(self): gtk.main()

Son olarak da snfmz rnekleyip main() fonksiyonunu a ryoruz: g


uyg = Uygulama() uyg.main()

Bylece su kodlar elde etmi oluyoruz: s


#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 self.dgm2 self.dgm3 self.dgm4 = = = = gtk.Button("dme1") g gtk.Button("dme2") g gtk.Button("dme3") g gtk.Button("dme4") g

self.tablo = gtk.Table(2, 2) self.tablo.attach(self.dgm1, self.tablo.attach(self.dgm2, self.tablo.attach(self.dgm3, self.tablo.attach(self.dgm4, self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

0, 0, 1, 1,

1, 1, 2, 2,

0, 1, 0, 1,

1) 2) 1) 2)

Grd nz gibi, pencere aralarn tabloya yerletirmek o kadar da zor de il. Tek yapmamz g s g gereken, aralar hangi koordinatlara yerletirdi imize dikkat etmek... s g Bu kodlar yardmyla arayz zerine yerletirdi imiz d meler, dikkat ederseniz, birbirlerine s g g bitiik duruyorlar. Ama biz her zaman d melerimizin arayz zerinde tk tk durmasn s g s s istemeyebiliriz. E er d meler arasna mesafe koymak istersek, satrlar ve stunlar iin ayr g g ayr olmak zere iki farkl metottan yararlanaca z. g Isterseniz durumu szle de il, rnekler g zerinden aklamaya alalm: s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 self.dgm2 self.dgm3 self.dgm4 = = = = gtk.Button("dme1") g gtk.Button("dme2") g gtk.Button("dme3") g gtk.Button("dme4") g

self.tablo = gtk.Table(2, 2) self.tablo.set_row_spacings(10) self.tablo.set_col_spacings(10) self.tablo.attach(self.dgm1, 0, self.tablo.attach(self.dgm2, 0, self.tablo.attach(self.dgm3, 1, self.tablo.attach(self.dgm4, 1, self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

#satrlar arasnda boluk brakyoruz s #stunlar arasnda boluk brakyoruz s 1, 0, 1) 1, 1, 2) 2, 0, 1) 2, 1, 2)

Koyu harerle gsterdi imiz kodlar yardmyla arayz zerinde bulunan tablomuzun satrlar g ve stunlar arasnda 10ar piksellik boluklar oluturduk. Bylece d melerimizi birbirinden s s g ayrm olduk... s E er btn satrlar veya stunlar zerinde ilem yapmak yerine, sadece istedi imiz satrlar g s g veya stunlar zerinde ilem yapmak istersek su metotlardan yararlanaca z: s g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 self.dgm2 self.dgm3 self.dgm4 = = = = gtk.Button("dme1") g gtk.Button("dme2") g gtk.Button("dme3") g gtk.Button("dme4") g

self.tablo = gtk.Table(2, 2) self.tablo.set_row_spacing(0, 10) #0. satra 10 piksellik bir #boluk yerletiriyoruz. s s self.tablo.set_col_spacing(0, 10) #0. stuna 10 piksellik bir #boluk yerletiriyoruz. s s self.tablo.attach(self.dgm1, 0, 1, 0, 1) self.tablo.attach(self.dgm2, 0, 1, 1, 2)

self.tablo.attach(self.dgm3, 1, 2, 0, 1) self.tablo.attach(self.dgm4, 1, 2, 1, 2) self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu kodlarn tam olarak nasl alt ve ne ie yarad , 4x4ten daha byk tablolarda daha s g s g net olarak grnecektir... Table() adl arac tantrken, bu arac su sekilde kulland mz sylemitik: g s
tablo = gtk.Table(2, 2)

Daha nce de syledi imiz gibi, burada 2x2 boyutunda bir tablo oluturuyoruz. Yani olug s s turdu umuz tabloda 2 adet satr, 2 adet de stun bulunuyor... Esasnda gtk.Table() fonksiyg onunun tam forml syledir:
gtk.Table(rows, columns, homogeneous)

Grd nz gibi, bu ara aslnda toplam parametre alyor. rows parametresine satr g saysn, columns parametresine ise stun saysn yazyoruz. Sadece gtk.Table(2, 2) yazmak yerine, gtk.Table(rows=2, columns=2) yazmak, parantez iindeki saylarn hangisinin satr, hangisinin stun oldu unu aklda tutmak asndan daha kolay olacaktr. Dolaysyla siz g de gtk.Table() fonksiyonu yardmyla bir tablo olutururken, parantez iine yazd nz saylarn s g neyin karl oldu unu da belirtmeyi tercih edebilirsiniz... s g g Yukardaki formlde dikkatimizi eken baka bir sey de elbette parametre saysnn olmas... s Simdiye kadar homogeneous adl bu nc parametreyi grmemitik. Ama simdi homo s geneous parametresinin ne oldu unu bize retecek bir rnek yapaca z: g g g homogeneous parametresinin temel grevi, birbirinden farkl boyutlardaki d melerin hepg sini ayn boyuta getirmektir... Hemen syle bir rnek verelim:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 = gtk.Button("tamam") self.dgm2 = gtk.Button("k") self.tablo = gtk.Table(rows=1, columns=2) self.tablo.attach(self.dgm1, 0, 1, 0, 1) self.tablo.attach(self.dgm2, 1, 2, 0, 1) self.pencere.add(self.tablo)

self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada 1 satr ve 2 stundan oluan bir tablo meydana getirdik. Bu tablonun sol st s kesine bir d memizi, sa st kesine ise teki d memizi yerletirdik. Yalnz dikkat eds g g s g s erseniz, d me etiketlerinin uzunluklar birbirinden farkl oldu u iin, d melerin boyutlar g g g da birbirinden farkl oluyor. E er d menin zerindeki etiketin uzunlu u ne olursa olsun btn g g g d melerinizin ayn boyda olmasn isterseniz, homogeneous parametresi imdadnza yetieg s cektir:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 = gtk.Button("tamam") self.dgm2 = gtk.Button("k") self.tablo = gtk.Table(rows=1, columns=2, homogeneous=True) self.tablo.attach(self.dgm1, 0, 1, 0, 1) self.tablo.attach(self.dgm2, 1, 2, 0, 1) self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Buradaki homogeneous parametresine True de erini verirsek tablo zerindeki btn g d meler ayn boyda olacak; bu parametrenin de erini False yapt mzda ise her bir d me g g g g farkl boyutta olacaktr... E er bu parametreyi hi yazmazsak, Pygtk sanki bu parametrenin g de eri False olarak belirlenmi gibi davranacaktr... g s Aslnda bu parametre do rudan d menin boyutuna mdahale etmiyor. Bu parametrenin mg g dahale etti i sey tablonun satr ve stunlarnn boyutu. homogeneous parametresini True g olarak ayarlad mzda, tablo zerindeki satr ve stunlar, tablo zerindeki en geni d menin g s g boyutunu alyor. Yani satr ve stunlar, boyutlar asndan tablo zerine homojen olarak da lyor. Satr ve stunlar tablo zerine homojen olarak da lnca da d melerimiz, iinde g g g bulunduklar satr veya stunu kaplayacak sekilde geniliyor. Bu parametrenin de erini False s g olarak ayarlad mzda veya hi yazmad mzda ise tablo zerindeki satr ve stunlar, iinde g g barndrdklar d melerin boyutunu alyor. E er d menin etiketi ksa ise d menin kendisi g g g g de ksa olaca iin, bu d menin bulundu u satr veya stun da dar oluyor... Bu aklama big g g

raz kark gelmi olabilir. gtk.Table() aracnn nerede nasl davrand n anlamann en iyi yolu s s g kendi kendinize denemeler yapmaktr. Mesela biz simdi syle bir rnek verelim:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 = gtk.Button("tamam") self.dgm2 = gtk.Button("k") self.tablo = gtk.Table(rows=4, columns=4, homogeneous=True) self.tablo.attach(self.dgm1, 2, 3, 3, 4) self.tablo.attach(self.dgm2, 3, 4, 3, 4) self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu rnek, homogeneous adl parametrenin alttan alta neler kartrd n ak bir sekilde s g ortaya koyuyor. Burada homogeneous parametresinin de eri True oldu u iin, tablo zg g erindeki btn satr ve stunlar, en geni d menin (yani tamam etiketli d menin) boyus g g tunu ald. k etiketli d me, tamam etiketli d meye kyasla daha ksa oldu u iin, hog g g mogeneous=True ifadesinin etkisiyle, iinde bulundu u satrn tamamn kaplayacak sekilde g geniledi. Dikkat ederseniz, tablomuz 4x4 boyutunda. Yani tablo zerinde toplam 4 satr s ve 4 stun var. Ama arayz zerinde sadece iki adet d me yer alyor. Biz bu iki d meyi g g tablonun sa alt kelerine yerletirdik. Bu arada, bo satr ve stunlarn da, bo olmalarna g s s s s ra men, tablo zerindeki en geni d menin boyutunu ald na dikkat edin... Burada homog s g g geneous parametresinin de erini False olarak ayarlarsanz, bo satr ve stunlarn yokluk g s derecesine kadar darald n greceksiniz... g Dedi imiz gibi, bir tablodaki satr ve stunlar homojen olarak da tt mzda, d meler, g g g g iinde yer aldklar satr ve stunlarn iini tamamen kaplayacak sekilde genileyecektir. ho s mojen olarak da tlmam bir tabloda ise d meler farkl boyutlarda olacaktr. Bir rnek g s g vermek gerekirse:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit)

self.dgm1 self.dgm2 self.dgm3 self.dgm4

= = = =

gtk.Button("a") gtk.Button("abcd") gtk.Button("123456") gtk.Button("fdsfdfsdfsd")

self.tablo = gtk.Table(rows=2, columns=3) self.tablo.attach(self.dgm1, 0, 1, 0, 1) self.tablo.attach(self.dgm2, 1, 2, 0, 1) self.tablo.attach(self.dgm3, 2, 3, 0, 1) self.tablo.attach(self.dgm4, 0, 3, 1, 2) self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi bu kodlarda homogeneous=True gibi bir ifade kullanmad mz iin g g d meler birbirinden farkl boyutlara sahip. Bir de suna bakalm: g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 self.dgm2 self.dgm3 self.dgm4 = = = = gtk.Button("a") gtk.Button("abcd") gtk.Button("123456") gtk.Button("fdsfdfsdfsd")

self.tablo = gtk.Table(rows=2, columns=3, homogeneous=True) self.tablo.attach(self.dgm1, 0, 1, 0, 1) self.tablo.attach(self.dgm2, 1, 2, 0, 1) self.tablo.attach(self.dgm3, 2, 3, 0, 1) self.tablo.attach(self.dgm4, 0, 3, 1, 2) self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada homogeneous parametresinin de erini True olarak ayarlad mz iin btn g g d meler ayn boyuta geldi. Tablonun ikinci satrndaki fdsfdfsdfsd etiketli d menin boyug g

tunun teki btn d melerden farkl olmas sizi sartmasn. Zira o d menin boyutunu g s g elimizle biz kendimiz ayarladk... Dikkat ettiyseniz, o d meyi tabloya eklerken kulland mz g g self.tablo.attach(self.dgm4, 0, 3, 1, 2) kodu o d meyi ikinci satrn tamamn kaplayacak g sekilde ayarlyor. (satr_balangc=0, satr_sonu=3) s Simdi bir deneme yapalm. Yukardaki kodlarla oluturdu unuz pencereyi kenarndan fare s g yardmyla ekip bytn. Grd nz gibi, d meler de pencereyle birlikte byyp g g klyor. Bu durumun homogeneous parametresiyle ilgisi yoktur. Bu parametreyi True da yapsanz False da yapsanz, pencereyi fare ile bytp kltt nzde d meler de g g pencereyle beraber byyp klecektir. Neden? nk bu davran belirleyen parames tre homogeneous de il, henz renmedi imiz baka bir parametredir. Simdi bu davran g g g s s tetikleyen parametrenin ne oldu una bakaca z. g g Yukardaki sekilde oluturdu umuz pencerelerde d meler pencereyle birlikte genileyip dar s g g s alr. Bunun nedeni, tabloya eklenen d melerin, varsaylan olarak gtk.EXPAND ve gtk.FILL g adl iki parametreye sahip olmasdr... Simdi bu parametrelerin ne ie yarad n grece iz. Su s g g kod parasna bakalm:
self.tablo.attach(self.dgm1, self.tablo.attach(self.dgm2, self.tablo.attach(self.dgm3, self.tablo.attach(self.dgm4, 0, 1, 2, 0, 1, 2, 3, 3, 0, 0, 0, 1, 1) 1) 1) 2)

Drt adet d meyi tabloya bu sekilde yerletirdi imizde aslnda Pygtk bu kodlar su sekilde g s g alglayacaktr:
self.tablo.attach(self.dgm1, self.tablo.attach(self.dgm2, self.tablo.attach(self.dgm3, self.tablo.attach(self.dgm4, 0, 1, 2, 0, 1, 2, 3, 3, 0, 0, 0, 1, 1, 1, 1, 2, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL) gtk.EXPAND|gtk.FILL) gtk.EXPAND|gtk.FILL) gtk.EXPAND|gtk.FILL)

Yukarda verdi imiz bu kodlardaki ilk satr ele alalm: g


self.tablo.attach(self.dgm1, 0, 1, 0, 1, gtk.EXPAND|gtk.FILL, gtk.EXPAND|gtk.FILL)

Buradaki ilk gtk.EXPAND|gtk.FILL komutu xoptions olarak anlr... ikinci gtk.EXPAND|gtk.FILL ise yoptions olarak anlr... xoptions kelimesi x seenekleri; yoptions kelimesi ise y seenekleri anlamna gelir. Burada x seenekleri ifadesiyle kastedilen, bir d menin x dzleminde kapsayaca alana ilikin seeneklerdir. Ayn sekilde g g s y seenekleri ifadesiyle kastedilen sey de bir d menin y dzleminde kapsayaca alana g g ilikin seeneklerdir... Bu bilgiye gre, yukardaki formlde yer alan ilk gtk.EXPAND|gtk.FILL s ifadesi su anlama geliyor: pencere byyp kld nde d memiz x dzleminde (yani soldan sa a do ru) hem g g g g genilesin (expand), hem de iinde bulundu u satr veya stunu kaplasn (ll) s g Ayn formldeki ikinci gtk.EXPAND|gtk.FILL ifadesi ise su anlama geliyor: pencere byyp kld nde d memiz y dzleminde (yani yukardan aa da do ru) hem g g s g g genilesin (expand), hem de iinde bulundu u satr veya stunu kaplasn (ll) s g Simdi bu parametrelerin ilevini daha net anlayabilmek iin ilk gtk.EXPAND|gtk.FILL ifadesin s deki gtk.FILL ksmn silin. Yani kodunuz syle olsun:
self.tablo.attach(self.dgm1, self.tablo.attach(self.dgm2, self.tablo.attach(self.dgm3, self.tablo.attach(self.dgm4, 0, 1, 2, 0, 1, 2, 3, 3, 0, 0, 0, 1, 1, 1, 1, 2, gtk.EXPAND, gtk.EXPAND, gtk.EXPAND, gtk.EXPAND, gtk.EXPAND|gtk.FILL) gtk.EXPAND|gtk.FILL) gtk.EXPAND|gtk.FILL) gtk.EXPAND|gtk.FILL)

Grd nz gibi, gtk.FILL ifadesini kaldrnca arayzn grnts de iti. Artk d melerg gs g imiz, iinde bulunduklar satr ve stunlar kaplamyor. Yalnz burada xoptions parametresinin de erinde yer alan gtk.FILL ifadesini sildi imiz iin bu de iiklik yalnzca x dzlemini etkg g gs iliyor. Bu parametrelerin tam olarak ne ie yarad n anlamak iin kendi kendinize eitli s g s kombinasyonlar denemenizi neririm... gtk.FILL ve gtk.EXPAND dnda Pygtkde gtk.SHRINK adl bir parametre daha bulunur. Bu s parametre ise d melerin bzmesini, yani kesinlikle byyp klmemesini sa lar. Su g s g rnek ne demek istedi imi aklayacaktr: g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere= gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dgm1 self.dgm2 self.dgm3 self.dgm4 = = = = gtk.Button("a") gtk.Button("abcd") gtk.Button("123456") gtk.Button("fdsfdfsdfsd")

self.tablo = gtk.Table(rows=2, columns=3, homogeneous=True) self.tablo.attach(self.dgm1, 0, 1, 0, 1, gtk.SHRINK, gtk.SHRINK) self.tablo.attach(self.dgm2, 1, 2, 0, 1, gtk.SHRINK, gtk.SHRINK) self.tablo.attach(self.dgm3, 2, 3, 0, 1, gtk.SHRINK, gtk.SHRINK) self.tablo.attach(self.dgm4, 0, 3, 1, 2, gtk.SHRINK, gtk.SHRINK) self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu kodlarla oluturdu umuz pencereyi ne sekilde boyutlandrrsak boyutlandralm, d meler s g g olduklar yere akl vaziyette kalacaktr.

4.3 Box() Snf


Pygtkde pencere aralarn pencere zerine yerletirebilmek iin simdiye kadar iki adet ara s rendik. Bunlar pygtk iindeki Fixed() ve Table() adl aralard. Bu iki ara arasnda en ok g kullanlan Table()dir. Fixed() haznesi her ne kadar olduka kolay bir kullanma sahip olsa da, Pygtk uygulamalarnda hemen hemen hi kullanlmaz. Bunun sebeplerini Fixed() haznesini ilerken anlatmtk... Table() adl aracn yansra, Pygtkde pencere aralarn pencere zerine s s yerletirmek iin yaygn olarak kullanlan baka bir ara daha var. Bu blmde ileyece imiz s s s g bu aracn genel ad Box(). Ancak biz bu Box() snfn do rudan kullanmayaca z. Bunun g g yerine, Box() adl snftan tretilmi Hbox() ve Vbox() adl alt snardan yararlanaca z. s g

Ayrca HBox() ve VBox()tan farkl olarak ButtonBox() snfndan tretilen HButtonBox() ve VButtonBox() adl snara da, aralarndaki benzerliklerden tr bu blmde de inece iz. g g Bu blmde Hbox(), Vbox(), HButtonBox() ve VButtonBox() snarn srayla inceleyece iz. O halde gelin hemen ie koyulalm... g s

4.4 HBox() Haznesi


HBox() da tpk Table() gibi bir haznedir. Yani bu ara, baka pencere aralarn zerinde tama s s vazifesi grr. Ingilizcede bu haznenin alm Horizontal Boxtur. Bu ifade Trkede Yatay Kutu anlamna gelir. Dolaysyla bu hazne, iine yerletirdi imiz pencere aralarn pencerenin s g yatay dzlemine yerletirir. Bunun tam olarak ne demek oldu unu biraz sonra grece iz. s g g Pygtkde bir yatay kutu oluturabilmek iin su kodlar kullanyoruz: s
kutu = gtk.HBox()

Gelin isterseniz bu kodu do al ortamnda grelim: g


import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.kutu = gtk.HBox() self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu kodlar altrd mzda pencere zerinde pek bir de iiklik grmeyece iz. Yani sanki s g gs g bo bir pencere oluturmu gibi olduk bu kodlar yardmyla... Bu kodlar arasna yazd mz s s s g self.kutu = gtk.HBox() satrnn hi bir etkisinin olmamas (aslnda olmam gibi grnmesi), s oluturdu umuz kutunun henz bo olmasndan kaynaklanyor. Yani henz oluturdu umuz s g s s g kutuya herhangi bir pencere arac eklemedi imiz iin, do al olarak kutu bo grnyor. Bu g g s arada oluturdu umuz kutuyu add() metodu yardmyla ana penceremize eklemeyi unutmuys g oruz... Simdi bu kutuyu nasl dolduraca mz grelim: g
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit)

self.dugme = gtk.Button("DENEME") self.kutu = gtk.HBox() self.kutu.pack_start(self.dugme) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada hayatmza pack_start() adl yeni bir metot giriyor... Bu metot, HBox() kutusu iine yerletirdi imiz pencere aralarn yatay dzlem zerinde soldan sa a do ru dizmemizi sa lar. s g g g g Isterseniz birden fazla pencere aracn kullanarak daha net bir rnek vermeye alalm: s
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dugme = gtk.Button("DENEME") self.dugme1 = gtk.Button("DENEME1") self.dugme2 = gtk.Button("DENEME2") self.dugme3 = gtk.Button("DENEME3") self.dugme4 = gtk.Button("DENEME4") self.kutu = gtk.HBox() self.kutu.pack_start(self.dugme) self.kutu.pack_start(self.dugme1) self.kutu.pack_start(self.dugme2) self.kutu.pack_start(self.dugme3) self.kutu.pack_start(self.dugme4) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, her bir d memizi pack_start() metodu yardmyla HBox() zerine tek g g tek yerletirdik. Burada d melerin soldan sa a do ru sraland na dikkat edin. E er bu s g g g g g d meleri sa dan sola do ru sralamak istersek pack_end() metodundan yararlanaca z: g g g g
import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dugme = gtk.Button("DENEME") self.dugme1 = gtk.Button("DENEME1") self.dugme2 = gtk.Button("DENEME2") self.dugme3 = gtk.Button("DENEME3") self.dugme4 = gtk.Button("DENEME4") self.kutu = gtk.HBox() self.kutu.pack_end(self.dugme) self.kutu.pack_end(self.dugme1) self.kutu.pack_end(self.dugme2) self.kutu.pack_end(self.dugme3) self.kutu.pack_end(self.dugme4) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada DENEME etiketli d menin en sa da yer ald na, teki d melerin de buna uygun g g g g sekilde sa dan sola do ru dizilmi oldu una dikkat edin... g g s g HBox() adl hazne iki parametre alr. Bunlardan biri homogeneous, ikincisi ise spacingdir. homogeneous parametresini Table() pencere aracn ilerken de grmtk. Bu parametre s s burada da ayn grevde kullanlr. spacing parametresi ise pencere aralar arasnda boluk s brakabilmemizi sa lar: g
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dugme = gtk.Button("D") self.dugme2 = gtk.Button("DEN") self.dugme3 = gtk.Button("DENEM") self.dugme4 = gtk.Button("DENEME") self.kutu = gtk.HBox(homogeneous=False, spacing=10) self.kutu.pack_end(self.dugme) self.kutu.pack_end(self.dugme2) self.kutu.pack_end(self.dugme3) self.kutu.pack_end(self.dugme4)

self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada homogeneous parametresini False olarak ayarlad mz iin, HBox() iindeki g d melerin boyutlar birbirinden farkl oldu. E er bu parametreyi True olarak ayarlarsak g g (varsaylan de er Falsedir), HBox() iindeki btn d meler, en uzun etiketli d menin boyug g g tunu alacak, dolaysyla btn d meler ayn boyda olacaktr... g Ayn kodlar iinde grd mz spacing adl parametreye verdi imiz de er sayesinde ise, g g g d meler arasnda 10 piksellik boluklar oluturduk. Bylece d melerimizi dip dibe yaag s s g s maktan kurtarm olduk... s Bunun dnda, pack_start() ve pack_end() metotlar da baz parametreler alabilir. s metotlarn alabilece i parametre says 3tr: g expand: True veya False de eri alr. D melerin genileyip genilemeyece ini beg g s s g lirler. ll: True veya False de eri alr. D melerin, kutuyu kaplayp kaplamayacaklarn g g belirler. padding: D meler arasndaki mesafeyi belirler. g Bununla ilgili bir rnek verelim:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dugme = gtk.Button("D") self.dugme2 = gtk.Button("DEN") self.dugme3 = gtk.Button("DENEM") self.dugme4 = gtk.Button("DENEME") self.kutu = gtk.HBox() self.kutu.pack_start(self.dugme, expand=False, fill=False, padding=10) self.kutu.pack_start(self.dugme2, expand=False, fill=False, padding=10) self.kutu.pack_start(self.dugme3, expand=False, fill=False, padding=10) self.kutu.pack_start(self.dugme4, expand=False, fill=False, padding=10) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main()

Bu

uyg = Uygulama() uyg.main()

Bu kodlar altrd mzda, pencereyi ucundan ekip bytnce d melerin ne tepki verdi ine s g g g dikkat edin... Son bir not olarak sunu da syleyelim. E er isterseniz pack_start() yerine sadece add() g metodunu da kullanabilirsiniz:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.dugme = gtk.Button("D") self.dugme2 = gtk.Button("DEN") self.dugme3 = gtk.Button("DENEM") self.dugme4 = gtk.Button("DENEME") self.kutu = gtk.HBox() self.kutu.add(self.dugme) self.kutu.add(self.dugme2) self.kutu.add(self.dugme3) self.kutu.add(self.dugme4) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Ancak tabii ki pack_start() metodu, add() metoduna kyasla daha gelimi bir aratr. E er s s g add() metodunun sa lad zellikler bana yeter, diyorsanz yukardaki gibi bir yazm tarz g g ilerinizi kolaylatrabilir... s s

4.5 VBox() Haznesi


Bir nceki blmde inceledi imiz HBox() haznesi, pencere aralarn pencere zerinde yatay g olarak diziyordu. Simdi renece imiz VBox() haznesi ise pencere aralarn pencere zerinde g g dikey olarak dizecek... VBox() haznesini de tpk HBox() haznesine benzer sekilde oluturuyoruz: s
import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.kutu = gtk.VBox() self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Elbette, bu kodlarn ie yarar bir sey ortaya karabilmesi iin burada da pack_start() ve s pack_end() metotlarndan yararlanmamz gerekiyor:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.kutu = gtk.VBox() self.etiket1 = gtk.Button("Etiket 1") self.etiket2 = gtk.Button("Etiket 2") self.etiket3 = gtk.Button("Etiket 3") self.kutu.pack_start(self.etiket1) self.kutu.pack_start(self.etiket2) self.kutu.pack_start(self.etiket3) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, VBox() haznesinin, HBox() haznesinden kullanm olarak hibir fark yok. g Bu ikisi arasndaki tek fark, HBox()un d meleri soldan sa a (veya sa dan sola) dizmesi, g g g VBox()un ise d meleri yukardan aa ya (veya aa dan yukarya) dizmesidir... HBox() hazg s g s g nesini incelerken rendi imiz her seyi VBox() ile de kullanabilirsiniz... g g Pygtkde HBox() ve VBox() haznelerini, istedi iniz arayz tasarmn oluturabilmek iin isteg s di iniz sayda ve istedi iniz sekilde kullanabilirsiniz. Dilerseniz, bu konuyu kapatmadan nce g g bir rnek daha vererek HBox() ve VBox() haznelerinin esnekli ini grelim: g
#-*-coding:utf-8-*-

import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): #Normal bir ekilde penceremizi olutup biimlendiriyoruz... s s self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_title(u"rnek bir Uygulama") self.pencere.connect("destroy", self.kapat) self.pencere.set_border_width(10) #Bir VBox() oluturuyoruz. Bu, daha sonra iine dmelerimizi s g #yerletireceimiz iki farkl HBox()u barndracak... Bylece s g #arayz zerinde HBox()larn iindeki dmeler alt alta grnecek g self.anavbox = gtk.VBox(True, 0) self.pencere.add(self.anavbox) #st sradaki dmeleri barndracak olan HBox()u oluturuyoruz. g s self.hbox1 = gtk.HBox(True, 0) #Biraz nce oluturduumuz HBox()u ana VBox() iine yerletiriyoruz s g s self.anavbox.pack_start(self.hbox1) #imdi de ikinci sradaki dmeleri barndracak olan HBox()u S g #oluturalm... s self.hbox2 = gtk.HBox(True, 0) #Bunu da ana VBox() iine yerletiriyoruz. s self.anavbox.pack_start(self.hbox2) #imdi st ve alt srada yer alacak dmeleri birer demet halinde S g #tanmlayalm. Bu demetin her esi, kendi iinde iki eden oluuyor. g g s #Ilk e dmenin ad, ikinci e ise dmeye atanacak fonksiyonu temsil g g g g #ediyor... Ben burada her sradaki dmeler iin rnek olarak birer g #tane fonksiyon belirledim (self.kapat ve self.merhaba). Siz isterseniz #her bir dme iin ayr bir fonksiyon belirleyebilirsiniz... g ust_btnler = (("kapat", self.kapat), ("btn2", None), ("btn3", None), ("btn4", None)) alt_btnler = (("btn5", None), ("merhaba", self.merhaba), ("btn7", None), ("btn8", None)) #st ve alt sradaki dmeleri birer for dngs ile iki hamlede g #oluturuyoruz. Burada "penar_olustur()" adl bir fonksiyondan s #yardm alyoruz. Bu fonksiyonu aada tanmlayacaz. s g g for ust_oge in ust_btnler: self.penar_olustur(ust_oge[0], ust_oge[1], self.hbox1) for alt_oge in alt_btnler: self.penar_olustur(alt_oge[0], alt_oge[1], self.hbox2) #Bu da "penar_olustur()" adl yardmc fonksiyonumuz... Bu fonksiyon bizi #ayn eyleri tekrar tekrar yazmaktan kurtaryor. Fonksiyonumuz "self" s

#dnda parametre alyor. Ilk parametre olarak dmenin adn veriyoruz. s g #Ikinci parametremiz dmeye atanacak fonksiyonu gsteriyor. nc g #parametreyi ise dmenin hangi HBox()a yerletirileceini belirleyebilmek g s g #iin kullanacaz... g def penar_olustur(self, metin, komut, penar): self.btn = gtk.Button(metin) #Yukarda tanmladmz demetler iinde ben "None" deerini g g #kullandm iin normalde Python bize TypeError hatas verecektir. g #Bu hatann programmz kertmemesi iin aadaki try... except... s g #blounu yazyoruz. g try: self.btn.connect("clicked", komut) except TypeError: pass penar.pack_start(self.btn) self.pencere.show_all() def kapat(self, penar): gtk.main_quit() def merhaba(self, penar): print u"Merhaba Dnya" def main(self): gtk.main() uyg = Uygulama() uyg.main()

Dedi imiz gibi, bu kodlarda st ve alt satrda yer alacak d meleri iki farkl demet (tuple) g g iinde tanmladk. Biz burada demetler yerine szlklerden de yararlanabilirdik. Ama e er g szlk kullanacak olursak, szlkler srasz veri tipleri olduklar iin d meler ekranda bizim g istedi imiz srada grnmeyecektir... O yzden yukardaki durum iin en iyi yol, ikier eli g s g demetlerden oluan iki ana demet tanmlamaktr. s

4.6 HButtonBox() ve VButtonBox() Hazneleri


HButtonBox() ve VButtonBox() hazneleri HBox() ve VBox() haznelerine ok benzer. Bu yzden gtk.ButtonBox() snfndan tretilmi bu hazneleri bu blmde incelemeyi uygun bulduk. s HButtonBox() ve VButtonBox() hazneleri HBox() ve VBox() haznelerine benzemekle birlikte, HButtonBox() veya VButtonBox() ile paketlenen d meler, pencere zerine uygun bir sekilde g da lmalarn sa layacak ayarlar otomatik olarak elde ederler... Peki bu ne demek oluyor? g g Galiba en iyisi bu durumu bir rnekle aklamak olacak:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.resize(300, 300) self.pencere.connect("delete_event", gtk.main_quit)

self.kutu = gtk.HButtonBox() self.etiket1 = gtk.Button("Etiket 1") self.etiket2 = gtk.Button("Etiket 2") self.kutu.add(self.etiket1) self.kutu.add(self.etiket2) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada grd nz gibi, HButtonBox() haznesini oluturma ilemi HBox()u oluturma ilemg s s s s ini ayns. Ayrca burada self.etiket1 ve self.etiket2yi self.kutuya eklerken add() metodundan yararlanyoruz. Isterseniz burada da pack_start() ve pack_end() metotlarn kullanabilirsiniz. Ama akas HBoxButton() iin add() gibi basit bir metot kullanmak yeterli olacaktr... Isterseniz yukardaki kodlarda self.kutu = gtk.HButtonBox() satrn self.kutu = gtk.HBox() seklinde de itirip altrn. HButtonBox() iine yerletirilmi d melerin HBox() iine yer gs s s s g letirilmi d melere gre farkl bir grnme sahip oldu unu greceksiniz. gtk.HBox() hazs s g g nesini kullanarak bu sekilde bir grnm elde etmek epey zordur. Dolaysyla e er istedi iniz g g grnm buysa, gtk.HBox() ile cebellemek yerine do rudan gtk.HButtonBox() haznesinden s g faydalanabilirsiniz... E er HButtonBox() iine yerletirdi iniz d melerin konumuyla oynamak isterseniz, g s g g set_layout() adl bir metot epey iinize yarayacaktr. Bu metodu su sekilde kullanyoruz: s
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.resize(300, 300) self.pencere.connect("delete_event", gtk.main_quit) self.kutu = gtk.HButtonBox() self.kutu.set_layout(gtk.BUTTONBOX_SPREAD) self.etiket1 = gtk.Button("Etiket 1") self.etiket2 = gtk.Button("Etiket 2") self.kutu.add(self.etiket1) self.kutu.add(self.etiket2) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main()

uyg = Uygulama() uyg.main()

Burada parantez iinde kulland mz gtk.BUTTONBOX_SPREAD yerine kullanabilece imiz g g birka farkl seenek vardr elimizde: gtk.BUTTONBOX_SPREAD : D meleri ortalar g gtk.BUTTONBOX_START : D meleri sola yaslar g gtk.BUTTONBOX_END : D meleri sa a yaslar g g gtk.BUTTONBOX_EDGE : D meleri kenarlara yaslar g Bu parametreleri kullanarak, d meleri pencerenin farkl yerlerinde konumlandrabiliriz... g HButtonBox() dnda bir VButtonBox() diye bir sey vardr... Tahmin edebilece iniz gibi, bu s g hazne HButtonBox()un aksine d meleri dey dzleme yerletiriyor. VButtonBox()un kulg s s lanm ile HButtonBox()un kullanm ayndr. Bunlar arasndaki tek fark bu iki haznenin d meleri pencere zerinde konumlandrd yerdir. g g Bununla ilgili kk bir rnek yapalm:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.resize(300, 300) self.pencere.connect("delete_event", gtk.main_quit) self.kutu = gtk.VButtonBox() self.kutu.set_layout(gtk.BUTTONBOX_END) self.etiket1 = gtk.Button("Etiket 1") self.etiket2 = gtk.Button("Etiket 2") self.kutu.add(self.etiket1) self.kutu.add(self.etiket2) self.pencere.add(self.kutu) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu kodlar, pencere zerindeki d meleri pencerenin dip ksmna yerletirecektir... g s Buraya kadar Pygtk ile ilgili rendiklerimizi kullanarak syle bir rnek uygulama yazabiliriz: g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

class Uygulama(object): def __init__(self): #penceremizi oluturalm s self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) #penceremiz iin bir balk belirleyelim s self.pencere.set_title("Emin misiniz?") #penceremizi boyutlandralm self.pencere.resize(150, 150) #penceremizin kenar izgisi ile eler arasnda g #25 piksellik boluk brakalm. s self.pencere.set_border_width(25) #penceremizi ekrann tam ortasnda konumlandralm self.pencere.set_position(gtk.WIN_POS_CENTER) #penceremizin "x" dmesine basldnda penceremiz g g #salkl bir ekilde kapansn... g s self.pencere.connect("delete_event", gtk.main_quit) #etiketimizi belirliyoruz self.soru = gtk.Label("kmak istediinizden emin misiniz?") g #"Vazge" dmesini oluturalm g s self.iptal = gtk.Button("Vazge") #"Vazge" dmesine tklandnda "fonk" adl g g #fonksiyonumuz alsn. connect() metodunun nc s #parametresine dmemizin adn yazyoruz. g self.iptal.connect("clicked", self.fonk, "Vazge") #"k" adl dmemiz... g self.terket = gtk.Button("k") #Bu dmeyi de "fonk" adl fonksiyona balyoruz. g g #Yine nc parametre olarak dme adn yazyoruz. g self.terket.connect("clicked", self.fonk, "k") #dikey kutumuz... teki elerle arasna 10 g #piksel boluk brakyoruz. s self.vbox = gtk.VBox(spacing=10) #dikey kutumuzu paketliyoruz. Bu kutu iinde "soru" adl #pencere aracmz yer alacak. Ayrca "expand" ve "fill" #parametrelerine "False" deerini vererek pencere aracmzn g #boyutlandrma ileminden etkilenmemesini salyoruz. s g self.vbox.pack_start(self.soru, expand=False, fill=False) #imdi de bir adet HButtonBox() haznesi oluturuyoruz... S s self.hbut = gtk.HButtonBox() #HButtonBox() haznesini doruca VBox() haznesinin iine g #yerletiriyoruz. Unutmayn, ana pencereye yalnzca tek s #bir pencere arac eklenebilir!... self.vbox.pack_start(self.hbut)

#HButtonBox() iine iptal ve terket dmelerini yerletirelim. g s self.hbut.add(self.iptal) self.hbut.add(self.terket) #HButtonBox() iindeki dmeleri kutu iine ortalyoruz g self.hbut.set_layout(gtk.BUTTONBOX_SPREAD) #VBox() haznesini dorudan pencere zerine yerletiriyoruz. g s self.pencere.add(self.vbox) #Son olarak btn pencere aralarn gsteriyoruz self.pencere.show_all() def fonk(self, penar, data): #Ana fonksiyonumuz... Burada kullancnn hangi #dmeye bastn komut satrnda gstereceiz g g g #Bunun iin, connect() metoduna nc parametre #olarak eklediimiz veriyi kullanacaz. g g print "%s dmesine basld"%data g #Eer kullanc "k" adl dmeye basarsa g g #komut satrna "Programdan klyor..." #yazdralm ve program kapatalm if data == "k": print "Programdan klyor..." gtk.main_quit() #Eer kullancnn bast dme "k" deilse g g g g s #"Ilem iptal edildi!..." kts veriyoruz... else: print "lem iptal edildi!..." Is def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu kodlar iinde zellikle dikkat etmemiz gereken ksm, iki farkl hazneyi (VBox ve HButtonBox) pencere zerine nasl yerletirdi imizdir. Grd nz gibi, haznelerden birini ana s g g pencere zerine yerletirirken (VBox), tekini de br haznenin iine yerletirdik (HButtons s Box). nk, ana pencere zerine hem VBoxu, hem de HButtonBoxu ayn anda yerletires meyiz. Ana pencere sadece tek bir pencere arac alabilir... Bu arada kulland nz konsol Trke karakterleri dzgn gsteremiyorsa yukardaki kodlarda g yer alan karakter dizilerini unicode olarak tanmlamak iinize yarayabilir. Yani mesela: s
print u"Programdan klyor..." print u"lem iptal edildi!..." Is

...eklinde karakter dizilerinin nne u har getirebilirsiniz... s

BLM

Pygtkde Pencere Aralar (2. Blm)

Pygtkde simdiye kadar pencere aralar iinde gtk.Label() ve gtk.Button()u grdk. Pygtkde pencere aralarndan nce renmemiz gereken konular oldu u iin, pencere aralarn inceleg g meye ara verip araya baka konular yerletirmitik. s s s Daha nce de dedi imiz gibi, Pygtk pencere aralar bakmndan olduka zengin bir arayz g takmdr. Bu blmde, Pygtkdeki pencere aralarn incelemeye devam edece iz. g

5.1 Entry Pencere Arac


Entry pencere arac, kullanclarn veri girmesini sa layan bir alandr. Bu pencere arac g dikdrtgen bir kutu seklindedir. Pythonda komut satrndan alan programlar yazarken nasl s raw_input() ve input() fonksiyonlarndan yararlanyorsak, Pygtkde de kullancdan veri alabilmek iin sklkla Entry pencere aracndan faydalanaca z. g Pygtkde Entry pencere arac syle oluturulur: s
entry = gtk.Entry()

Isterseniz bunu bir de ba lamnda grelim: g


import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.connect("delete_event", gtk.main_quit) self.entry = gtk.Entry() self.pencere.add(self.entry) self.pencere.show_all()

71

def main(self): gtk.main() uyg = Uygulama() uyg.main()

Grd nz gibi, Entry() pencere aracn oluturmak teki pencere aralarn oluturmaktan g s s hi farkl de il. Bu kodlarda, ana pencere zerinde tek bir pencere arac oldu u iin, bu pencere g g aracn (yani Entryyi) do rudan pencerenin kendisine ekledik. Ama uygulamada Entry aracn g do rudan ana pencere zerine eklemeyece iz. nk muhtemelen pencere zerinde Entry g g ile birlikte baka pencere aralar da olacak. O yzden daha nceki blmlerde rendi imiz s g g konumlandrma aralarn (gtk.Table, gtk.VBox, gtk.HBox gibi...) kullanmamz gerekecek. Entry() pencere arac, kullancnn tek satrlk bir veri girmesine msaade eder. E er kulg lancnn girdi i veri kutunun uzunlu unu ayorsa ilk yazlanlar sola do ru kayacaktr. Entry() g g s g pencere arac zerinde farenin sa tuu da otomatik olarak alr. Dolaysyla herhangi bir g s s sey yapmamza gerek kalmadan, kes, kopyala, yaptr ve sil gibi zellikler emrimize amade s olacaktr... Isterseniz Entry() pencere aracnn da kullanld basit bir arayz tasarlayarak kendi kendimize g pratik yapalm:
#-*-coding:utf-8-* import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.kull = self.paro = self.kentry self.pentry gtk.Label("K. Ad: ") gtk.Label("Parola: ") = gtk.Entry() = gtk.Entry()

self.tablo = gtk.Table(4, 4) self.tablo.attach(self.kull, 0, 1, 0, 1) self.tablo.attach(self.paro, 0, 1, 1, 2) self.tablo.attach(self.kentry, 1, 2, 0, 1) self.tablo.attach(self.pentry, 1, 2, 1, 2) self.pencere.add(self.tablo) self.kutu = gtk.HButtonBox() self.kutu.set_border_width(10) self.tablo.attach(self.kutu, 0, 2, 2, 3) self.btn = gtk.Button("Tamam") self.kutu.pack_start(self.btn) self.pencere.show_all()

def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada gtk.Table() ve gtk.HButtonBox() aralarn kullanarak, ana penceremiz zerine be s farkl pencere arac yerletirdik. Pencere aralarn iinde barndran haznelerin yerleimine s s zellikle dikkat edin. Bildi iniz gibi, ana pencere zerine yalnzca tek bir pencere arac ekleyeg biliyoruz. Bu yzden ana pencere zerine Table() pencere aracn yerletirdik. Table()nin s zerine ise HButtonBox() haznesini koyduk. Elbette yukardaki rne i farkl aralar kullanarak ve farkl sekillerde de tasarlayabilirsiniz. g rne in sadece Table() aracn kullanarak dahi yukardaki arayz elde edebilirsiniz: g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.kull = gtk.Label("K. Ad: ") self.paro = gtk.Label("Parola: ") self.kentry = gtk.Entry() self.pentry = gtk.Entry() self.btn = gtk.Button("Tamam") self.tablo = gtk.Table(4, 4) #Burada "Tamam" dmesinin denk geldii satr g g #teki satrlardan biraz ayryoruz. self.tablo.set_row_spacing(1, 10) self.tablo.attach(self.kull, 0, 1, 0, 1) self.tablo.attach(self.paro, 0, 1, 1, 2) self.tablo.attach(self.kentry, 1, 2, 0, 1) self.tablo.attach(self.pentry, 1, 2, 1, 2) #Burada ise "Tamam" dmesinin btn stunu kaplamamas iin g #gtk.SHRINK parametresinden yararlanyoruz. self.tablo.attach(self.btn, 1, 2, 2, 3, gtk.SHRINK) self.pencere.add(self.tablo) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Siz de bambaka yntemler kullanarak bu be pencere aracn arayz zerine yerletires s s bilirsiniz... Farkl yntemler arasnda size en kolay geleni benimsemekte zgrsnz...

5.1.1 Entry Pencere Aracndan Veri Almak


Entry() pencere aracnn ne oldu unu ve ne ie yarad n anlatrken, bu pencere aracn kulg s g lancdan veri almak iin kullanabilece imizi sylemitik. Kullanc, kendisinden istedi imiz g s g verileri Entry() ile oluturdu umuz kutularn iine yazyor. Burada soru su: Kullanc verileri s g kutulara giriyor girmesine, ama biz girilen bu bilgileri nasl alp kullanaca z? ste bu blmde g I bu sorunun cevabn bulmaya alaca z. s g Pygtkde, Entry() aracna kullanc tarafndan girilen verileri alabilmek iin get_text() adl metottan yararlanaca z. Ufak bir rnekle balayalm: g s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Arayuz(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(20) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.giris = gtk.Entry() self.dgm = gtk.Button("Gster") self.dgm.connect("clicked", self.goster) self.hbox = gtk.HBox() self.pencere.add(self.hbox) self.hbox.pack_start(self.giris) self.hbox.pack_start(self.dgm) self.pencere.show_all() def goster(self, penar): self.veri = self.giris.get_text() print self.veri def main(self): gtk.main() gui = Arayuz() gui.main()

Bu uygulamada, Entry() pencere aracna yazd mz herhangi bir veri, Gster adl d meye g g baslarak komut satrnda gsterilebiliyor... Burada Entry() aracndaki veriyi almamz sa layan, g get_text() adl metottur. Elbette bu metodu ok daha karmak iler yapmak iin de kuls s lanabilirsiniz. Mesela elimizi altrmak iin, bir saynn karekkn hesaplayan bir uygulama s yazmay deneyelim:
#-*-coding:utf-8-*import pygtk

pygtk.require20() import gtk from math import sqrt class Arayuz(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(20) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.giris = gtk.Entry() self.hesapla = gtk.Button("k.kk hesapla") self.hesapla.connect("clicked", self.Karekok) self.etiket = gtk.Label("Karekk: ") self.s_etiket = gtk.Label("0") self.tablo= gtk.Table(2, 2, homogeneous=False) self.tablo.set_row_spacings(10) self.tablo.set_col_spacings(10) self.pencere.add(self.tablo) self.tablo.attach(self.giris, 0, 1, 0, 1) self.tablo.attach(self.hesapla, 1, 2, 0, 1) self.tablo.attach(self.etiket, 0, 1, 1, 2) self.tablo.attach(self.s_etiket, 1, 2, 1, 2) self.pencere.show_all() def Karekok(self, penar): try: self.entry = int(self.giris.get_text()) except ValueError: pass self.karekok = sqrt(self.entry) self.s_etiket.set_label(str(self.karekok)) def main(self): gtk.main() gui = Arayuz() gui.main()

Burada kutucu a girilen saylarn karekkn hesaplayan bir uygulama yazdk... Bu kodlar g iinde zellikle Karekok adl fonksiyonun iindeki ilemlere dikkat ediyoruz. Burada o uns g lukla Python bilgimizden yararlandk, ama bu kodlar yazarken Pygtknin baz kaprislerini de gz nnde bulundurmamz gerekiyor. rne in set_label() metoduna verece imiz de er g g g karakter dizisi (string) olmak zorunda oldu u iin, self.karekok de erini str() fonksiyonu g g yardmyla karakter dizisine eviriyoruz. Ayrca bu kodlarda self.entry de ikenini de int() gs fonksiyonu yardmyla tamsayya evirdi imize dikkat edin. nk normalda Entry() aracng dan alnacak verinin tipi karakter dizisidir. Ama biz Entry() aracndan ald mz de erle baz g g aritmetik ilemler yapaca mz iin, ncelikle bu de eri tamsayya evirmemiz gerekiyor. s g g Bu kodlarda, dikkat ederseniz, tek bir Table() arac kullanarak btn pencere aralarmz ana pencere zerine yerletirebildik. zellikle attach() metodu iinde kulland mz koordinat s g bilgilerini do ru bir sekilde yazmak ilk zamanlarda epey zor olabilir. Ama bu koordinat bilgig lerini yazarken, Table() pencere aracn anlatt mz blmdeki koordinat tablosunu gznzn g

nne getirirseniz bu bilgileri girmek biraz daha kolaylaabilir. s Bu arada, dikkat ettiyseniz, arayz zerindeki karekk ve 0 etiketleri birbirinden ok uzak duruyor. Bunlarn birbirine yakn durmas grn asndan daha sk olurdu. Simdi bu etikets leri istedi imiz sekilde nasl hizalayaca mza bakalm. g g Pygtkde kulland mz etiketleri hizalamak iin set_alignment() adl bir metottan yararg lanaca z. Bu metodu su sekilde kullanyoruz: g
etiket.set_alignment(xalign, yalign)

Grd nz gibi, bu metot iki farkl parametre alyor. xalign parametresi etiketin soldan g sa a do ru olan hizalamasn kontrol ederken, yalign parametresi ise ayn etiketin yukarg g dan aa ya do ru olan hizalamasn kontrol ediyor. Bu parametreler, 0.0, 0.5 ve 1.0 s g g de erlerini alabilir. xalign parametresine verece imiz 0.0 de eri etiketin en solda olmasn g g g sa lar. 0.5 de eri etiketi ortalayacak, 1.0 de eri ise etiketi en sa a yaslayacaktr. Ayn sekg g g g ilde yalign parametresine verece imiz 0.0 de eri etiketi en ste hizalayacak, 0.5 de eri g g g ortalayacak, 1.0 de eri ise en alta hizalayacaktr... (Aslnda set_alignment() metodu iinde g 0.0 ile 1.0 arasndaki btn de erleri kullanabilirsiniz. Dolaysyla hizalama konusunda g ince ayara ihtiyacnz olursa 0.1, 0.2, 0.4 vb. de erler vererek istedi iniz hizalamay elde edeg g bilirsiniz. Ancak pek ok durumda 0.0, 0.5 ve 1.0 de erleri bizim iin yeterli olacaktr.) g Gelin isterseniz set_alignment() metodunu yukarda verdi imiz rne e uygulayalm: g g
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk from math import sqrt class Arayuz(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(20) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.giris = gtk.Entry() self.hesapla = gtk.Button("k.kk hesapla") self.hesapla.connect("clicked", self.Karekok) self.etiket = gtk.Label("Karekk: ") self.etiket.set_alignment(1.0, 0.5) self.s_etiket = gtk.Label("0") self.s_etiket.set_alignment(0.0, 0.5) self.tablo= gtk.Table(2, 2, homogeneous=False) self.tablo.set_row_spacings(10) self.tablo.set_col_spacings(10) self.pencere.add(self.tablo) self.tablo.attach(self.giris, 0, 1, 0, 1) self.tablo.attach(self.hesapla, 1, 2, 0, 1) self.tablo.attach(self.etiket, 0, 1, 1, 2) self.tablo.attach(self.s_etiket, 1, 2, 1, 2) self.pencere.show_all()

def Karekok(self, penar): try: self.entry = int(self.giris.get_text()) except ValueError: pass self.karekok = sqrt(self.entry) self.s_etiket.set_label(str(self.karekok)) def main(self): gtk.main() gui = Arayuz() gui.main()

Burada self.etiketi x dzleminde en sa a (1.0), y dzleminde ise ortaya hizaladk (0.5). Ayn g sekilde self.s_etiketi ise x dzleminde en sola (0.0), y dzleminde de ortaya hizaladk (0.5). Y dzlemindeki hizalama ilk bakta belli olmayabilir. Ortaya kan pencereyi elinizle bytp s kltrseniz, yalign parametresine verilen de erin nasl bir etki oluturdu unu daha ak g s g bir sekilde grebilirsiniz.

5.1.2 Entryye Girilen Veriyi Grnmez Hale Getirmek


zellikle kullanc ad ve parola ilemleri iin hazrlayaca mz arayzlerde gvenlik asndan s g parolann gizlenmesi gerekebilir. rne in, kullanc parolasn yazarken ekranda parola yerine g * gibi bir karakterin grnmesini isteyebiliriz... ste bu blme Entry() aracna girilen verileri I bu anlamda nasl grnmez hale getirebilece imizi tartaca z. g s g Yukarda bahsedilen ilemi gerekletirmek iin Pygtkte set_visibility() adl bir metottan s s yararlanaca z. g Hatrlarsanz, Entry() aracn anlatmaya balad mz ilk blmde syle bir rnek vermitik: s g s
#-*-coding:utf-8-* import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.kull = self.paro = self.kentry self.pentry gtk.Label("K. Ad: ") gtk.Label("Parola: ") = gtk.Entry() = gtk.Entry()

self.tablo = gtk.Table(4, 4) self.tablo.attach(self.kull, 0, 1, 0, 1) self.tablo.attach(self.paro, 0, 1, 1, 2) self.tablo.attach(self.kentry, 1, 2, 0, 1) self.tablo.attach(self.pentry, 1, 2, 1, 2)

self.pencere.add(self.tablo) self.kutu = gtk.HButtonBox() self.kutu.set_border_width(10) self.tablo.attach(self.kutu, 0, 2, 2, 3) self.btn = gtk.Button("Tamam") self.kutu.pack_start(self.btn) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada kullanc parolasn yazarken ekranda parolann ne oldu u grnyor. Ancak gerek g hayatta karlat mz o u uygulama, kullancnn girdi i parolay do rudan ekrana basmaz. s s g g g g Onun yerine kullancnn girdi i her karakter iin bir * iareti yerletirilir. Bunu nasl yag s s paca mz grelim simdi: g
#-*-coding:utf-8-* import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.kull = gtk.Label("K. Ad: ") self.paro = gtk.Label("Parola: ") self.kentry = gtk.Entry() self.pentry = gtk.Entry() self.pentry.set_visibility(False) self.tablo = gtk.Table(4, 4) self.tablo.attach(self.kull, 0, 1, 0, 1) self.tablo.attach(self.paro, 0, 1, 1, 2) self.tablo.attach(self.kentry, 1, 2, 0, 1) self.tablo.attach(self.pentry, 1, 2, 1, 2) self.pencere.add(self.tablo) self.kutu = gtk.HButtonBox() self.kutu.set_border_width(10) self.tablo.attach(self.kutu, 0, 2, 2, 3) self.btn = gtk.Button("Tamam") self.kutu.pack_start(self.btn)

self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Artk kullancmz parolasn yazarken parola ekranda grnmeyecek... Grd nz gibi, parola ekrana yazlrken parola yerine * iaretini gryoruz. Pygtk bize bu g s iaretin kendisi de itirme imkan da sunar. Yani illa * iaretini kullanmak zorunda de iliz. s gs s g Bunu de itirebiliriz. Bu ilem iin set_invisible_char() adl baka bir metottan yarargs s s lanaca z: g
#-*-coding:utf-8-* import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.kull = gtk.Label("K. Ad: ") self.paro = gtk.Label("Parola: ") self.kentry = gtk.Entry() self.pentry = gtk.Entry() self.pentry.set_visibility(False) self.pentry.set_invisible_char("?") self.tablo = gtk.Table(4, 4) self.tablo.attach(self.kull, 0, 1, 0, 1) self.tablo.attach(self.paro, 0, 1, 1, 2) self.tablo.attach(self.kentry, 1, 2, 0, 1) self.tablo.attach(self.pentry, 1, 2, 1, 2) self.pencere.add(self.tablo) self.kutu = gtk.HButtonBox() self.kutu.set_border_width(10) self.tablo.attach(self.kutu, 0, 2, 2, 3) self.btn = gtk.Button("Tamam") self.kutu.pack_start(self.btn) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bylece parola yazlrken parolann kendisi yerine ekranda ? iareti grnecek... s

5.1.3 Entryye Girilen Verinin Azami Uzunlugunu Belirlemek


Baz uygulamalarda Entry() aracna girilen verinin en fazla ka karakter uzunlu unda olag bilece ini nceden belirlemek gerekebilir. rne in bir kullancnn girebilece i parola uzung g g ste bu ilem iin Pygtkde lu unu 10 karakter ile snrlandrmak istiyor olabilirsiniz. g I s _max_length() adl bir metottan yararlanaca z. set g Bir nceki blmde verdi imiz rnek zerinden gidelim: g
#-*-coding:utf-8-* import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.connect("delete_event", gtk.main_quit) self.kull = gtk.Label("K. Ad: ") self.paro = gtk.Label("Parola: ") self.kentry = gtk.Entry() self.pentry = gtk.Entry() self.pentry.set_visibility(False) self.pentry.set_max_length(10) self.tablo = gtk.Table(4, 4) self.tablo.attach(self.kull, 0, 1, 0, 1) self.tablo.attach(self.paro, 0, 1, 1, 2) self.tablo.attach(self.kentry, 1, 2, 0, 1) self.tablo.attach(self.pentry, 1, 2, 1, 2) self.pencere.add(self.tablo) self.kutu = gtk.HButtonBox() self.kutu.set_border_width(10) self.tablo.attach(self.kutu, 0, 2, 2, 3) self.btn = gtk.Button("Tamam") self.kutu.pack_start(self.btn) self.pencere.show_all() def main(self): gtk.main() uyg = Uygulama() uyg.main()

Burada kullancmz en fazla 10 karakterlik bir parola yazabilir. Kodlar arasnda grnen set_max_length(10) satr, kullancn 10 karakter fazlasn yazmasna engel olacaktr...

s 5.1.4 Entry Metninin Rengini Degi tirmek


Hatrlarsanz Button adl pencere aracn ilerken modify_bg() adl bir metot yardmyla s d me renklerini de itirebildi imizi grmtk. Benzer bir metodu, Entry pencere aracndaki g gs g s metnin rengini de itirmek iin de kullanabiliriz. Ancak bu kez modify_bg yerine modify_text gs adl bir metottan yararlanaca z. Bu metodu su sekilde kullanyoruz: g
pencere_araci.modify_text(gtk.STATE_NORMAL, gtk.gdk.color_parse(renk))

modify_text() metodu, metin tabanl pencere aralarndaki metnin rengini de itirmemize gs yardmc olur. Bu yap size Button konusundan tandk geliyor olmal... Isterseniz bununla ilgili kk bir rnek yapalm:
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class RenkliYazi(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.hbox = gtk.HBox() self.pencere.add(self.hbox) self.tb_red = gtk.Button("krmz") self.tb_red.connect("clicked", self.renklendir, "red") self.entry = gtk.Entry() self.hbox.pack_start(self.entry) self.hbox.pack_start(self.tb_red) self.pencere.show_all() def renklendir(self, penar, renk): self.entry.modify_text(gtk.STATE_NORMAL, gtk.gdk.Color(renk)) def main(self): gtk.main() uyg = RenkliYazi() uyg.main()

Burada e er renklendir() fonksiyonu iindeki satr Windowsta almazsa, bunun yerine g s self.entry.modify_text(gtk.STATE_NORMAL, gtk.gdk.color_parse(renk)) satrn yazabilece inizi biliyorsunuz... g

5.1.5 Entry ile bir rnek...


Bu blmde Entry() pencere aracn kullanarak bir rnek uygulama yazaca z. Bu rnek uygug lamay yazarken ayn zamanda simdiye kadar grd mz konular da tekrar etmi olaca z. g s g

Burada amacmz, kullancdan iki adet say alan ve bu saylar birbirleriyle toplayp birbirlerinden karan bir uygulama yazmak... kodlarmz yazarak balayalm ie: Ilk s s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

Bu kodlar uygulamamamzn demirbalar... Bu satrlarn ne ie yarad n artk admz gibi s s g biliyoruz. Devam edelim...
class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_border_width(20) self.pencere.connect("delete_event", gtk.main_quit)

Burada Uygulama adl bir snf tanmladk. Bu snfmz, Pythondaki yeni tip snarn gerektirdi i sekilde object snfndan miras alyor. g Snfmz iinde bir __init__ fonksiyonu tanmlyoruz. Arayz oluur olumaz hayata gemesi s s gereken zellikleri bu __init__ fonksiyonu iine yazaca z. Burada ncelikle penceremizi olug s turduk. Ardndan da set_position() metodunu kullanarak penceremizi ekrann en ortasnda konumlandrdk. Bir sonraki satrda kulland mz set_border_width() metodu ise pencere g aralarnn pencere kenarna gre ne kadar uzakta yer alaca n belirliyor. connect() metodu g ise pencere aracna bir grev atamamz sa lyor. Biz burada, pencerenin arp d mesine g g basld nda programmzn sa lkl bir sekilde kapanabilmesini sa lamak iin kullandk bu g g g metodu... Devam ediyoruz:
self.etk_ilk = gtk.Label("ilk say:") self.etk_ilk.set_alignment(0.0, 0.5) self.etk_iki = gtk.Label("ikinci say:") self.etk_iki.set_alignment(0.0, 0.5) self.etk_sonuc = gtk.Label("sonu:") self.etk_sonuc.set_alignment(0.0, 0.5)

Bu satrlarda, arayz zerinde yer alacak Label() aralarn, yani etiketleri oluturuyoruz. s Arayzmz zerinde ilk say:, ikinci say: ve nc say: seklinde adet etiket bulu nacak. Bir nceki blmde rendi imiz set_alignment() metodunu kullanarak bu etiketleri g g sola yaslyoruz. Bildi iniz gibi, set_alignment() metodu xalign ve yalign olmak zere iki g farkl parametre alyor. Bu iki parametre, 0.0, 0.5 ve 1.0 olmak zere farkl de er g alabilir. Yukardaki kodlarda xalign parametrelerine 0.0 de erini vererek etiketimizin sola g yaslanmasn sa ladk. E er etiketleri ortalamak isteseydik xalign parametresine 0.5 de eri g g g vermemiz gerekecekti. Etiketi en sa a yaslamak iin ise 1.0 de erini kullanacaktk. Yazag g ca mz uygulamalarda yalign parametresine genellikle 0.5 de eri vermek mantkl bir g g seim olacaktr. nk yazaca mz uygulamalarda etiketlerimizin y dzleminde (yukardan g aa ya do ru) genellikle orta noktaya denk gelmesini isteyece iz. s g g g

Simdi yukarda tanmlad mz her bir etiketin karsna denk gelecek Entry() aralarn olutu g s s raca z: g
self.ent_ilk = gtk.Entry() self.ent_ilk.set_alignment(0.5) self.ent_iki = gtk.Entry() self.ent_iki.set_alignment(0.5) self.ent_sonuc = gtk.Entry() self.ent_sonuc.set_alignment(0.5)

Burada yine set_alignment() metodunu kulland mza dikkat edin. Ancak bu metot Eng try() aracyla birlikte kullanld nda baz farkllklar gsterir. set_alignment() metodunu Lag bel() aracyla birlikte kullanrken bu metoda iki farkl parametre veriyorduk. Ancak bu metodu Entry() aracyla kulland mzda tek bir parametre vermemiz yeterli olacaktr. Yukarda Eng try() aracyla birlikte kulland mz set_alignment() metodu, Entry() aracna yazlan verilerin g kutucu un ortasnda konumlanmasn sa lyor... E er bu set_alignment() satrlarn kaldrag g g cak olursak, kullancnn kutucu a girdi i veriler sola yaslanacaktr. Kendi gz zevkinize gre g g set_alignment() satrlarn yazp yazmamaya karar verebilirsiniz... Bir sonraki ksmda ise toplama ve karma ilemlerini yapmamz sa layacak d meleri olus g g s turuyoruz. Toplama ve karma ilemi iin iki ayr d me meydana getiriyoruz: s g
self.btn_topla = gtk.Button("topla") self.btn_topla.connect("clicked", self.islem, "topla") self.btn_cikar = gtk.Button("kar") self.btn_cikar.connect("clicked", self.islem, "kar")

Oluturdu umuz bu d meleri, daha sonra tanmlayaca mz islem adl bir fonksiyona s g g g ba lyoruz. Burada, connect() metodunun nc parametresini de yazd mza dikkat edin. g g topla ve kar olarak yazd mz bu nc parametreler sayesinde btn ilemleri tek bir g s fonksiyon yardmyla halledebilece iz: g
self.anakutu = gtk.VBox() self.pencere.add(self.anakutu) self.tablo = gtk.Table(3, 3) self.anakutu.pack_start(self.tablo) self.tablo.attach(self.etk_ilk, 0, 1, 0, 1) self.tablo.attach(self.etk_iki, 0, 1, 1, 2) self.tablo.attach(self.etk_sonuc, 0, 1, 2, 3) self.tablo.attach(self.ent_ilk, 1, 2, 0, 1) self.tablo.attach(self.ent_iki, 1, 2, 1, 2) self.tablo.attach(self.ent_sonuc, 1, 2, 2, 3) self.hbut = gtk.HButtonBox() self.hbut.set_layout(gtk.BUTTONBOX_SPREAD) self.anakutu.pack_start(self.hbut, padding=10) self.hbut.add(self.btn_topla) self.hbut.add(self.btn_cikar) self.pencere.show_all()

Yukardaki satrlarda bir adet VBox(), bir adet Table() bir adet de HButtonBox() kullandk... Buradaki VBox() haznesi teki aralar iine yerletirece imiz ana kutumuz olma grevini s g

stleniyor. Table() ve HButtonBox() aralarn ana kutumuzun zerine yerletirece iz. Burada s g hangi eleri hangi haznelerin iine yerletirdi imize dikkat edin. Table() arac iine etiketleri g s g (Label) ve kutucuklar (Entry) yerletiriyoruz. topla ve kar d melerini HButtonBox() s g iine alyoruz. Btn bu elerin hepsini ise VBox() iine koyuyoruz... Son olarak VBox()u da g ana pencere zerine yerletiriyoruz... s
def islem(self, penar, data): self.ent_sonuc.set_text("") self.ilk = self.ent_ilk.get_text() self.iki = self.ent_iki.get_text() try: if data == "topla": self.hesap = int(self.ilk) + int(self.iki) elif data == "kar": self.hesap = int(self.ilk) - int(self.iki) else: self.hesap = "mkansz!" I except ValueError: pass else: self.ent_sonuc.set_text(str(self.hesap)) def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu blmde ise toplama ve karma ilemlerini gerekletiren islem adl fonksiyonu yazys s oruz. ncelikle self.ent_sonuc.set_text() satr ile sonu kutusunu boaltyoruz. Bylece s her ilemden sonra sonu kutusu iindeki de erler temizlenmi olacak. Aksi halde art arda s g s gelen ilemlerin sonucu st ste binecektir... s Sonraki iki satrda ilem kutucuklarna kullanc tarafndan girilen verileri alyoruz. Bunun iin s get_text() adl metottan yararlanyoruz. Daha sonra ise bir try... except... else... blo u oluturuyoruz. try... blo u iinde, g s g connect() metodunun nc parametresinin hangi de ere sahip oldu una ba l olarak g g g toplama veya karma ilemi yapyoruz. E er nc parametre topla ise, yani kullanc s g toplama ilemini yapan d meye basmsa, self.hesap = int(self.ilk) + int(self.iki) ilemi s g s s yaplacak, e er nc parametre kar ise, yani kullanc karma ilemini yapan d mg s g eye basmsa, self.hesap = int(self.ilk) - int(self.iki) ilemi yaplacaktr. Burada bir adet de s s else blo u yazdk. Ama bu blo u yazmasak da olurdu, nk yukardaki if ve elif bloklar g g iinde belirtilen durumlar haricinde baka bir durumun gereklemesi imkanszdr... Ama biz s s yine de iimizi sa lama almay tercih ettik... s g except... blo unda ValueError hatalarn yakalyoruz. nk kullanc kutucuklara say g yerine harf girerse programmz hata verecektir. Byle bir durum oldu unda pass deyimi g gere ince hibir sey yapmadan bir sonraki adma geiyoruz. g else... blo unda ise, program hatasz bir sekilde alrsa ne yaplaca n belirliyoruz. g s g Buna gre, e er programdan herhangi bir hata alnmazsa, sonu kutucu u iine hesap g g de ikeninin de erini yazdryoruz. Burada hesap de ikenini str() fonksiyonu yardmyla gs g gs karakter dizisine evirdi imize dikkat edin. nk Entry() aralarna yalnzca karakter dizileri g girebiliriz... Sonraki kodlar ise zaten tanyorsunuz. def main... satr ile main() fonksiyonunu tanmlyoruz. E er bu fonksiyonu yazmak programmz almayacaktr. Son olarak ise Uygug s lama() adl snfmz rnekliyoruz ve uyg rne i zerinden main() fonksiyonunu a rarak g g

programmz balatyoruz. s Isterseniz bu kodlar bir btn olarak grelim:


#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_position(gtk.WIN_POS_CENTER) self.pencere.set_border_width(20) self.pencere.connect("delete_event", gtk.main_quit) self.etk_ilk = gtk.Label("ilk say:") self.etk_ilk.set_alignment(0.0, 0.5) self.etk_iki = gtk.Label("ikinci say:") self.etk_iki.set_alignment(0.0, 0.5) self.etk_sonuc = gtk.Label("sonu:") self.etk_sonuc.set_alignment(0.0, 0.5) self.ent_ilk = gtk.Entry() self.ent_ilk.set_alignment(0.5) self.ent_iki = gtk.Entry() self.ent_iki.set_alignment(0.5) self.ent_sonuc = gtk.Entry() self.ent_sonuc.set_alignment(0.5) self.btn_topla = gtk.Button("topla") self.btn_topla.connect("clicked", self.islem, "topla") self.btn_cikar = gtk.Button("kar") self.btn_cikar.connect("clicked", self.islem, "kar") self.anakutu = gtk.VBox() self.pencere.add(self.anakutu) self.tablo = gtk.Table(3, 3) self.anakutu.pack_start(self.tablo) self.tablo.attach(self.etk_ilk, 0, 1, 0, 1) self.tablo.attach(self.etk_iki, 0, 1, 1, 2) self.tablo.attach(self.etk_sonuc, 0, 1, 2, 3) self.tablo.attach(self.ent_ilk, 1, 2, 0, 1) self.tablo.attach(self.ent_iki, 1, 2, 1, 2) self.tablo.attach(self.ent_sonuc, 1, 2, 2, 3) self.hbut = gtk.HButtonBox() self.hbut.set_layout(gtk.BUTTONBOX_SPREAD) self.anakutu.pack_start(self.hbut, padding=10)

self.hbut.add(self.btn_topla) self.hbut.add(self.btn_cikar) self.pencere.show_all() def islem(self, penar, data): self.ent_sonuc.set_text("") self.ilk = self.ent_ilk.get_text() self.iki = self.ent_iki.get_text() try: if data == "topla": self.hesap = int(self.ilk) + int(self.iki) elif data == "kar": self.hesap = int(self.ilk) - int(self.iki) else: self.hesap = "mkansz!" I except ValueError: pass else: self.ent_sonuc.set_text(str(self.hesap))

def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu arada, grd nz gibi, klavye zerindeki pek ok ksayol tuu, yazd mz uygulama zg s g erinde otomatik olarak alyor. rne in, klavyedeki sekme (tab) tuuna basarak pencere s g s aralar zerinde hareket edebiliyoruz. Ayn sekilde klavye zerindeki ok tular da ilevli du s s rumda... rne in topla d mesi seiliyken enter tuuna basarsak birinci ve ikinci kutudaki g g s de erler toplanacak; kar d mesi seiliyken enter tuuna basarsak da birinci ve ikinci kug g s tudaki de erler birbirinden karlacaktr... g

5.2 ToggleButton Pencere Arac


Bu pencere arac, daha nce grd mz Button adl pencere aracna ok benzer. Ama Togg gleButton ile Button arasnda nemli farklar bulunur. Toggle Button bir nevi ama-kapama d mesidir. ToggleButtonlar ak ve kapal olmak zere iki farkl konumda bulunabilir. g Button adl d melerin ise byle bir zelli i yoktur. g g Pygtkde bir ToggleButton oluturmak iin syle bir yap kullanyoruz: s
tb = gtk.ToggleButton("dme ad") g

ToggleButtonu oluturduktan sonra bu d meye bir kez bast nzda d menin basl kald n, s g g g g ikinci kez bast nzda ise d menin eski haline dnd n greceksiniz. Bu etkiyi birden fazla g g g ToggleButton oluturarak daha net bir sekilde grebilirsiniz. Dilerseniz ToggleButton ile ilgili s kk bir rnek yapalm:
#-*-coding:utf-8-*import pygtk pygtk.require20()

import gtk class ToggleButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(30) self.pencere.connect("delete_event", gtk.main_quit) self.vbox = gtk.VBox(True, 0) self.vbox.set_spacing(10) #bu komutla satr aralklarn ayarlyoruz. self.pencere.add(self.vbox) #imdi be adet ToggleButton oluturacaz... s s s g for i in range(5): self.tb = gtk.ToggleButton("dme%s"%i) g self.vbox.pack_start(self.tb) self.pencere.show_all() def main(self): gtk.main() ackapa = ToggleButton() ackapa.main()

Grd nz gibi, ToggleButton oluturmak Button oluturmaktan ok farkl de il. Simdi geleg s s g lim bu ToggleButton adl pencere aracnn zelliklerine...

5.2.1 ToggleButtonun Durumunu grenmek


Pygtkde ToggleButton adl pencere aracnn ak ve kapal olmak zere iki farkl konumda bulundu unu sylemitik. Bir ToggleButtonun basl konumu True, basl olmayan g s konumu ise False de erine sahiptir. ToggleButtonun basl durumda olup olmad bilgisi g g get_active() adl bir metot yardmyla alabiliriz:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class ToggleButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(30) self.pencere.connect("delete_event", gtk.main_quit) self.vbox = gtk.VBox(True, 0) self.vbox.set_spacing(10) self.pencere.add(self.vbox) for i in range(5): self.tb = gtk.ToggleButton("dme%s"%i) g #burada "self.tb.get_label()" fonksiyonu bize dmenin adn veriyor g #Eer isterseniz "clicked" yerine "toggled" sinyalini de kullanabilirsiniz. g self.tb.connect("clicked", self.fonk, self.tb.get_label())

self.vbox.pack_start(self.tb) self.pencere.show_all() def fonk(self, penar, data): #"get_active()" metodunu nasl kullandmza dikkat edin. g #Bu metot bize ToggleButtonun basl olup olmad g #bilgisini veriyor. print "%s: %s"%(data, penar.get_active()) def main(self): gtk.main() tb = ToggleButton() tb.main()

Bu kodlar altrdktan sonra arayz zerindeki d melere bast mzda hem d menin ad s g g g hem de d menin basl olup olmad bilgisi komut satrnda grntlenecektir. True de eri g g g d menin basl oldu unu, False de eri ise d menin basl olmad n gsterir. E er True g g g g g g ve False de erleri yerine daha anlaml kelimeler kullanmak isterseniz fonk() adl fonksiyonu g syle yazabilirsiniz:
def fonk(self, penar, data): print "%s %s"%(data, ("kapal", "ak")[penar.get_active()])

Bylece d meye ilk basta komut satrnda ak kts, ikinci basta ise kapal kg s s ts grntlenecektir... Kapal ve ak kelimeleri yerine istedi iniz kelimeleri koymakta g zgrsnz... Dilerseniz ToggleButtonun kullanmn biraz daha netletirmek iin ufak bir rnek verelim: s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class ToggleButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(30) self.pencere.connect("delete_event", gtk.main_quit) self.tablo = gtk.Table(4, 2, True) self.tablo.set_row_spacings(5) self.pencere.add(self.tablo) #be tane farkl ToggleButton oluturuyoruz... s s for i in range(5): self.btn = gtk.ToggleButton("dme%s"%i) g self.etk = gtk.Label() self.etk.set_text("") #oluturduumuz dme ve etiketleri tabloya yerletiriyoruz. s g g s self.tablo.attach(self.btn, 0, 1, i, i+1) self.tablo.attach(self.etk, 1, 2, i, i+1)

self.btn.connect("clicked", self.fonk, self.etk) self.pencere.show_all() #dmelere her basta dme durumunun etikete yazdrlmas iin g s g #"fonk()" adl bir fonksiyon yazyoruz... def fonk(self, dugme, etiket): self.durum = ("kapal", "ak")[dugme.get_active()] etiket.set_text(str(self.durum)) def main(self): gtk.main() tb = ToggleButton() tb.main()

Burada ToggleButtonun ak m yoksa kapal m oldu u bilgisi komut satrna de il, arayz g g zerindeki etiketlere yazdrlyor...

5.2.2 ToggleButtonun Al Degerini Belirlemek s


Normal sartlar altnda bir ToggleButton ilk oluturuldu unda kapaldr. E er oluturdu unuz s g g s g ToggleButtonun ilk ald nda basl/ak olmasn isterseniz set_active() adl metottan g yararlanabilirsiniz:
tb = gtk.ToggleButton("isim") tb.set_active(True)

Bylece ToggleButton ilk olutu unda True de erine sahip olacaktr. s g g

5.3 CheckButton Pencere Arac


CheckButton bildi imiz onay kutusudur... Pygtkde oluturdu umuz arayzlere CheckButg s g ton eklemek iin su yolu takip ediyoruz:
onay_kutusu = gtk.CheckButton("isim")

Yukarda ToggleButton iin verdi imiz rne i aynen CheckButton iin de verebiliriz. Tek g g fark, yukarda ToggleButton geen yerlere CheckButton yazyoruz:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class CheckButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(30) self.pencere.connect("delete_event", gtk.main_quit) self.tablo = gtk.Table(4, 2, True) self.tablo.set_row_spacings(5) self.pencere.add(self.tablo)

#be tane farkl CheckButton oluturuyoruz... s s for i in range(5): self.btn = gtk.CheckButton("dme%s"%i) g self.etk = gtk.Label() self.etk.set_text("") #oluturduumuz dme ve etiketleri tabloya yerletiriyoruz. s g g s self.tablo.attach(self.btn, 0, 1, i, i+1) self.tablo.attach(self.etk, 1, 2, i, i+1) self.btn.connect("clicked", self.fonk, self.etk) self.pencere.show_all() #dmelere her basta dme durumunun etikete yazdrlmas iin g s g #"fonk()" adl bir fonksiyon yazyoruz... def fonk(self, dugme, etiket): self.durum = ("seili deil", "seili")[dugme.get_active()] g etiket.set_text(str(self.durum)) def main(self): gtk.main() tb = CheckButton() tb.main()

5.4 RadioButton Pencere Arac


ToggleButton ve CheckButtona ok benzeyen baka bir pencere arac da RadioButtondur. s Bu pencere aracn su sekilde oluturuyoruz: s
rb = gtk.Radiobutton(grup, "isim")

Bu formlde, teki pencere aralarnda olmayan bir parametre gze arpyor. Pygtkde bir RadioButton pencere arac oluturabilmek iin formlde grnen bu grup adl parametreyi s mutlaka belirtmemiz gerekir. E er bu parametreyi belirtmeden syle bir rnek kod yazacak g olursak Python bize bir hata mesaj gsterecektir:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class RadioButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.rb = gtk.RadioButton("rb1") self.pencere.add(self.rb) self.pencere.show_all() def main(self): gtk.main()

rb = RadioButton() rb.main()

Bu kodlar altrd mzda su hata mesajn alrz: s g


TypeError: first argument must be a GtkRadioButton or None

Pygtkde bir RadioButton oluturaca mz zaman, bu pencere aracn mutlaka baka bir veya s g s daha fazla RadioButton grubuna dahil etmemiz gerekir. Peki ya elimizde sadece tek bir RadioButton varsa ne olacak? Aslnda mantk olarak arayz zerinde tek bir RadioButton kullanmak son derece anlamszdr. Neticede arayz zerinde birden fazla RadioButton olmal, ki kullanc bu RadioButtonlar arasnda seim yapabilsin... Simdi isterseniz daha mantkl bir rnek verelim:
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class RadioButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.connect("delete_event", gtk.main_quit) self.vbox = gtk.VBox() self.etiket = gtk.Label("Pythonun Hangi Srmn Kullanyorsunuz?") self.rb1 self.rb2 self.rb3 self.rb4 = = = = gtk.RadioButton(None, "Python 2.5") gtk.RadioButton(self.rb1, "Python 2.6") gtk.RadioButton(self.rb1, "Python 3.0") gtk.RadioButton(self.rb1, "Python 3.1")

self.vbox.pack_start(self.etiket, True, True, 10) self.vbox.pack_start(self.rb1) self.vbox.pack_start(self.rb2) self.vbox.pack_start(self.rb3) self.vbox.pack_start(self.rb4) self.pencere.add(self.vbox) self.pencere.show_all() def main(self): gtk.main() rb = RadioButton() rb.main()

Burada, self.rb1 adl ilk RadioButton arac herhangi bir gruba ye olamayaca iin, bunun g grup parametresine None de eri verdik. Ondan sonra oluturdu umuz RadioButtonlar ise g s g self.rb1 ile grupladk. Bylece btn RadioButtonlar birbirlerinden haberdar olmu oldu. s Isterseniz oluturdu umuz drt RadioButtona da ilk parametre olarak None de erini vermeyi s g g deneyin. Bu sekilde RadioButtonlarn birbirinden habersiz oldu unu greceksiniz... g Hangi RadioButtonun seili oldu unu, g hangisini seili olmad n renmek iin de g g

get_active() adl metodu kullanabilirsiniz. Mesela yukardaki rne i syle yazabilirsiniz: g


#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk class RadioButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.connect("delete_event", gtk.main_quit) self.vbox = gtk.VBox() self.etiket = gtk.Label("Pythonun Hangi Srmn Kullanyorsunuz?") self.rb1 = gtk.RadioButton(None, "Python 2.5") self.rb1.connect("clicked", self.fonk) self.rb2 = gtk.RadioButton(self.rb1, "Python 2.6") self.rb2.connect("clicked", self.fonk) self.rb3 = gtk.RadioButton(self.rb1, "Python 3.0") self.rb3.connect("clicked", self.fonk) self.rb4 = gtk.RadioButton(self.rb1, "Python 3.1") self.rb4.connect("clicked", self.fonk) self.vbox.pack_start(self.etiket, True, True, 10) self.vbox.pack_start(self.rb1) self.vbox.pack_start(self.rb2) self.vbox.pack_start(self.rb3) self.vbox.pack_start(self.rb4) self.pencere.add(self.vbox) self.pencere.show_all() def fonk(self, penar): durum = (u"seili deil", u"seili")[penar.get_active()] g print "%s %s" % (penar.get_label(), durum) def main(self): gtk.main() rb = RadioButton() rb.main()

fonk() adl fonksiyon iindeki yapy, daha nce grd mz CheckButton ve ToggleButton g adl pencere aralarndan da hatrlyor olmalsnz. RadioButtonlardaki bu grup parametresi, farkl RadioButton gruplaryla almak istes di inizde iinize ok yarayacaktr. Mesela buna syle bir rnek verebiliriz: g s
#-*-coding:utf-8-*import pygtk pygtk.require20() import gtk

class RadioButton(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.connect("delete_event", gtk.main_quit) self.vbox = gtk.VBox() self.etiket_py = gtk.Label("Pythonun Hangi Srmn Kullanyorsunuz?") self.rb1_py = gtk.RadioButton(None, "Python 2.5") self.rb1_py.connect("clicked", self.fonk) self.rb2_py = gtk.RadioButton(self.rb1_py, "Python 2.6") self.rb2_py.connect("clicked", self.fonk) self.rb3_py = gtk.RadioButton(self.rb1_py, "Python 3.0") self.rb3_py.connect("clicked", self.fonk) self.rb4_py = gtk.RadioButton(self.rb1_py, "Python 3.1") self.rb4_py.connect("clicked", self.fonk) self.etiket_de = gtk.Label("Hangi Masast Ortamn Kullanyorsunuz?") self.rb1_de = gtk.RadioButton(None, "KDE 3.5") self.rb1_de.connect("clicked", self.fonk) self.rb2_de = gtk.RadioButton(self.rb1_de, "KDE 4") self.rb2_de.connect("clicked", self.fonk) self.rb3_de = gtk.RadioButton(self.rb1_de, "GNOME") self.rb3_de.connect("clicked", self.fonk) self.rb4_de = gtk.RadioButton(self.rb1_de, "XFCE") self.rb4_de.connect("clicked", self.fonk) self.vbox.pack_start(self.etiket_py, True, True, 10) self.vbox.pack_start(self.rb1_py) self.vbox.pack_start(self.rb2_py) self.vbox.pack_start(self.rb3_py) self.vbox.pack_start(self.rb4_py) self.vbox.pack_start(self.etiket_de, True, True, 10) self.vbox.pack_start(self.rb1_de) self.vbox.pack_start(self.rb2_de) self.vbox.pack_start(self.rb3_de) self.vbox.pack_start(self.rb4_de) self.pencere.add(self.vbox) self.pencere.show_all() def fonk(self, penar): durum = (u"seili deil", u"seili")[penar.get_active()] g print "%s %s" % (penar.get_label(), durum) def main(self): gtk.main()

rb = RadioButton() rb.main()

Burada ayn arayz zerinde iki farkl RadioButton grubu kullanyoruz. grubumuz Python Ilk sorusuyla ilgili. Ikinci grup ise Masast sorusuyla... RadioButton aracndaki grup parametresi sayesinde iki farkl grup iinde yer alan pencere aralarnn birbiriyle karmasn engels liyoruz.

BLM

Pygtkde Resimlerle al mak s

Arayz tasarlarken, programlarmzn grselli ini artrmak, bunlar daha gze hitap eder bir g hale getirmek iin o u zaman arayz zerine ufak resimler eklemek isteriz. Resimler, abartlg madklar srece, programlarn kullanll zerinde olumlu etkide bulunan elerdir. s g g Pygtk, resimlerle almamz kolaylatracak pek ok ara barndrr. ste biz de bu blmde bu s s I aralarn neler oldu unu, Pygtk uygulamalarna nasl resim ekleyebilece imizi inceleyece iz. g g g

6.1 Pencere Aralarna Stoktan Resim Eklemek


Bildi iniz gibi, Pygtkde bir d me oluturmak iin basite su forml kullanyorduk: g g s
btn = gtk.Button("dme") g

Burada parantez iinde belirtti imiz karakter dizisi d memizin ad oluyor... Button adl g g pencere arac bunun dnda bir parametre daha alr. Bu parametrenin ad stocktur. Bunu s syle kullanyoruz:
btn = gtk.Button(stock = resim)

stock parametresinin yerine http://www.pygtk.org/docs/pygtk/gtk-stock-items.html adresinde gsterilen de erlerden birini yazabilirsiniz. g Isterseniz hemen bununla ilgili bir rnek verelim:
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class ResimliDugme(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.set_border_width(10) self.pencere.connect("delete_event", gtk.main_quit) self.vbox = gtk.VBox(False, 10) self.etk = gtk.Label("kmak istediinize emin misiniz?") g

95

self.vbox.pack_start(self.etk, False, False, 0) self.hbut = gtk.HButtonBox() self.vbox.pack_start(self.hbut) self.btn_cik = gtk.Button(stock = gtk.STOCK_QUIT) self.btn_cik.connect("clicked", gtk.main_quit) self.hbut.pack_start(self.btn_cik, False, False, 0) self.btn_iptal = gtk.Button(stock = gtk.STOCK_CANCEL) self.hbut.pack_start(self.btn_iptal, False, False, 0) self.pencere.add(self.vbox) self.pencere.show_all() def main(self): gtk.main() rd = ResimliDugme() rd.main()

Burada d meler iin kendimiz ayrca bir ad belirlemedik. stock parametresi iinde belirtg ti imiz resim, d me iin uygun bir isim de belirler. g g E er yukardaki rne i altrd nzda d me zerinde herhangi bir simge/resim grmyg g s g g orsanz bunun sebebi kulland nz GTK temasdr... Windowsta GTK ile birlikte gelen gtkg themeselector adl uygulama yardmyla kulland nz temay de itirerek d me zerinde g gs g resim gsterebilen bir tema seebilirsiniz. gtkthemeselector adl uygulamaya Balat > s Programlar > GTK yolunu takip ederek ulaabilirsiniz. E er bu program men iinde bus g lamazsanz C:\GTK\bin klasr iindeki gtkthemeselector.exe adl dosyaya ift tklayarak da program altrabilirsiniz. Orada grnen temalar iinde mesela Metal adl tema s d meler zerindeki resimlerin grnmesini sa lar. E er Ben mutlaka varsaylan temay g g g kullanmak istiyorum. Ama d me zerindeki resimler de grnsn istiyorum, diyorsanz g C:\GTK\share\themes\MS-Windows\gtk-2.0 klasr iindeki gtkrc adl dosyay dzenleyerek varsaylan temann, d me zerindeki resimleri gstermesini sa layabilirsiniz. O dosya iing g deki gtk-button-images adl seene in de erini 1 yapp dosyay bu sekilde kaydetmeniz g g yeterli olacaktr... Yani o seenek syle grnmeli:
gtk-button-images = 1

GNU/Linuxta Ubuntu da tmnn gelitiricilerinin GNOME masast ayarlarnda yaptklar bir g s de iiklik nedeniyle Ubuntuda Pygtk uygulamalarndaki d me simgeleri grnmez.. stelik gs g kulland nz GTK temasn de itirmek de burada hibir ie yaramayacaktr. Ubuntuda d me g gs s g simgelerini gsterebilmek iin gconf-editor iindeki /desktop/gnome/interface/ yolu iindeki buttons_have_icons ve menus_have_icons de erlerine birer tik atmamz gerekiyor... g

6.2 Pencere Aralarna Dosyadan Resim Eklemek


Yukarda, pencere aralarna nasl stoktan resim ekleyece imizi grdk. Simdi ise pencere g aralarna bilgisayarmzda bulunan baka resimleri de eklemeyi renece iz. Dilerseniz bir s g g rnek zerinden gidelim:

import pygtk pygtk.require20() import gtk class Resim(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.resim = gtk.Image() self.resim.set_from_file("falanca.png") self.resim.show() self.btn = gtk.Button() self.btn.add(self.resim) self.btn.show() self.pencere.add(self.btn) self.pencere.show() def main(self): gtk.main() r = Resim() r.main()

Burada ncelikle gtk.Image() fonksiyonunu kullanarak bir resim nesnesi oluturuyoruz. Daha s sonra set_from_file() adl metottan yararlanarak bilgisayarmzda bulunan falanca.png adl dosyay seiyoruz. Bylece programmzda hangi resmi kullanaca mz belirlemi olduk. g s Tabii show() metodunu kullanarak resmimizi gstermeyi unutmuyoruz... Resmimizi tanmladktan sonra normal sekilde bir d me oluturuyoruz ve add() metodunu g s kullanarak resmi d meye ekliyoruz. Yine show() metodunu kullanarak d memizi gsterg g meyi ihmal etmiyoruz. Son olarak d memizi de pencereye ekleyip gsterdikten sonra iimiz bitmi oluyor... g s s

6.3 Pencere Aralarna Resim ve Etiket Eklemek


Yukarda, bir pencere aracna nasl resim ekleyece imizi grdk. Peki ayn pencere aracna g hem resim, hem de etiket eklemek istersek ne yapaca z? Dilerseniz yine bir rnek zerinden g gidelim:
#-*-coding: utf-8-*import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): #penceremizi oluturalm... s self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) #penceremizin dzgn kapanmasn salayalm... g

self.pencere.connect("delete_event", gtk.main_quit) #burada, biraz sonra tanmlayacamz "kutu_olustur()" adl fonksiyonu g #arp bunu bir deikene atyoruz. g g s self.kutu = self.kutu_olustur("istihzacom.png", "www.istihza.com") #dmemiz... g self.btn = gtk.Button() #biraz nce tanmladmz kutuyu dmenin iine yerletiriyoruz g g s self.btn.add(self.kutu) #dmemizi de pencerenin iine koyuyoruz. g self.pencere.add(self.btn) #pencereyi ve pencere aralarn gsteriyoruz. self.pencere.show_all() def kutu_olustur(self, rsm, etk): #biraz sonra tanmlayacamz resim ve etiketi tutmas iin bir HBox() g #haznesi oluturuyoruz... s self.hbox = gtk.HBox() #resmimizi tanmlyoruz. self.resim = gtk.Image() #set_from_file() metodu ile bilgisayarmzda bulunan bir resmi alyoruz. #yukarda __init__ fonksiyonu iinde "kutu_olustur()" fonksiyonunu #arrken "rsm" deikenini "istihzacom.png" olarak belirledik. Yani g g s #bilgisayarmzdan aldmz resmin ad "istihzacom.png" olacak. g self.resim.set_from_file(rsm) #burada da etiketimizi tanmlyoruz. Etiket metninin yerinde grdnz g #"etk" deikenini yukardaki __init__ fonksiyonu iinde g s #"www.istihza.com" olarak belirlemitik. Dolaysyla etiket metnimiz s #"www.istihza.com" olacak. self.etiket = gtk.Label(etk) #imdi resim ve etiketi en bata oluturduumuz HBox() haznesi iine s s s g #tek tek yerletiriyoruz. s self.hbox.pack_start(self.resim) self.hbox.pack_start(self.etiket) #resmimizi ve etiketimizi gsteriyoruz. self.resim.show() self.etiket.show() #fonksiyonumuz HBox() haznesini dndryor... Bylece HBox() haznesini, #iine yerletirdiimiz resim ve etiketle birlikte kullanabiliyoruz. s g return self.hbox def main(self): gtk.main() uyg = Uygulama() uyg.main()

Yukardaki rnekte yapt mz aklamalar dikkatle inceleyin. g

zellikle kutu_olustur()

fonksiyonunun nasl bir ilev grd ne dikkat edin. Bu fonksiyon, resim ve etiket elerini bir s g g HBox() haznesi iine yerletirip tek bir paket halinde bize veriyor. Biz de bu paketi __init__() s fonksiyonu iinde self.btn olarak tanmlad mz d meye yerletiriyoruz. Bylece d me g g s g iinde hem resmi hem de etiketi ayn anda gsterme imkanna kavuuyoruz. s Bu rnekte, gtk.Button() adl pencere aracnn HBox() haznesini iine alabildi ini gryg oruz. Daha nceki derslerimizde HBox() haznesini hep do rudan pencere zerine veya baka g s bir hazne iine yerletiriyorduk. Pygtkde gtk.Button() adl pencere arac da aslnda bir s haznedir. Normalde bu pencere arac iinde yalnzca bir etiket bulunur. Ama grd nz g gibi, gtk.Button() aslnda HBox() haznesini de iinde barndrma kapasitesine sahip. Bu bilgiden yola karak, d me iindeki etiket ve resmin konumlaryla rahatlkla oynayag bilirsiniz. Mesela Hbox() yerine VBox() haznesini kullanacak olursanz resim stte, etiket altta olacaktr... Dilerseniz bir gtk.Button() arac iine tablo dahi yerletirebilirsiniz. Yani yukardaki rne i s g temel alarak syle bir sey yazabilirsiniz:
import pygtk pygtk.require20() import gtk class Uygulama(object): def __init__(self): self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL) self.pencere.connect("delete_event", gtk.main_quit) self.kutu = self.kutu_olustur("istihzacom.png", "www.istihza.com") self.btn = gtk.Button() self.btn.add(self.kutu) self.pencere.add(self.btn) self.pencere.show_all() def kutu_olustur(self, rsm, etk): self.tablo = gtk.Table(2, 2) self.resim = gtk.Image() self.resim.set_from_file(rsm) self.etiket = gtk.Label(etk) self.tablo.attach(self.resim, 0, 1, 0, 1) self.tablo.attach(self.etiket, 0, 1, 1, 2) self.resim.show() self.etiket.show() return self.tablo def main(self): gtk.main() uyg = Uygulama() uyg.main()

Bu rneklerde temel olarak yapt mz sey, resim ve etiketi tek bir hazne iine yerletirdikten g s sonra (bu hazne HBox olabilir, VBox olabilir, hatta grd nz gibi Table dahi olabilir...), alp g

bunu bir d me iine sokmaktan ibaret... g

You might also like