1 2 3 4 5 6 |
from kivy.app import App
class girisFormu(App):
pass
girisFormu().run()
|
Kivy pencere düzenlerini oluşturmak için muhteşem bir dil sunmaktadır:
kv
Dili. Bu dili biraz HTML’ye biraz da css’ye benzetebilirsiniz. Bu bölümde
kv
dilini anlatmaya çalışacağız.
merhabaDunya.py
programında ekrandaki “Merhaba Dünya” yazısını program kodu içerisinde bir etiket oluşturup, bu etiketin metinini değiştirerek yapmıştık. Bu etiketi daha sonra düzen olarak geri döndürmüştük (
return
Label()
). Şimdi aynı pencereyi
kv
dilini kullanrak yapacağız. Önce program kodumuzu
main.py
‘deki gibi yazalım. Bu kodda hiçbir değişiklik yapmadan birçok pencere oluşturacağız.
1 2 3 4 5 6 |
from kivy.app import App
class girisFormu(App):
pass
girisFormu().run()
|
Gördüğünüz gibi bu program hiçbirşey döndürmüyor. Sadece basit bir pencere oluşturuyor. Pencere içeriğini
kv
dili oluşturacağız. Şimdi dosyasını
girisformu.kv
programını kaydettiğiniz aynı dizinine (klasöre) kaydedin.
1 2 |
Label:
text: "Merhaba Dünya"
|
Bu dosyanın adı, python programının dosya adı değil, uygulamanın adı ile aynı olacaktır. Eğer uygulamanızın adı
kullaniciGirisFormu()
ise
kv
dosyasının adı
kullanicigirisformu.kv
olacaktır. Dosya adında küçük harfleri kullanmanızı yeğlerim. Buradaki
girisformu.kv
oldukça basit bir yapıya sahip.Sadece iki satırdan ibaret ilk satır pencerede bir etiketin olacağı (Label), ikinci satırda ise bu etiketin üzerinde yazacak metni (text) belirtmektedir. Tıpkı Python’da olduğu gibi
kv
dilinde de girintiler (indendation) önemlidir. Birinci satır penceredeki grafik parçacığının ismini belirtmektedir. Grafik parçacığının isminden sonra iki nokta üst üste konulup sonraki satırda (sanki işlev tanımlar gibi), bu grafik parçacığının özelliklerine ait yapılanmayı biraz içerde başlatıyoruz.
main.py programını çalıştırdığınızda yine Şekil 3.1 ‘deki gibi bir pencere açılacaktır.
Temel Bilgiler
bölümündeki
Pencere Düzenleri
‘ni hatırlayın. Orada ızgara pencere düzenini oluşturmak için
GridLayout()
sınıfını kullanmıştık.
kv
dilinde de yine grafik parcacıklarının ismini kullanacağız. Kutu pencere düzeni
BoxGridLayout()
sınıfı ile oluşturulur. O halde
kv
dilinde
BoxLayout
ile kutu pencere düzenini oluşturabiliriz.
Liste 4.3
‘deki gibi değiştirin.
1 2 3 4 5 |
BoxLayout:
Label:
text: "Merhaba Dünya"
Label:
text: "Merhaba Kivy"
|
main.py programını tekrar çalıştırdığımızda Şekil 4.1 ‘deki gibi bir pencere açılacaktır.
Bu pencerede yan yana iki tane etiketin oluştuğunu görüyorsunuz. Kutu pencere düzeninin ön tanımlı yönelimi “yatay”dır (vertical). Eğer dikey olarak yönelndirmek istiyorsanız, pencere düzeninine orientation: ‘vertical’ satırını Liste 4.4 ‘deki gibi eklemelisiniz.
1 2 3 4 5 6 |
BoxLayout:
orientation: 'vertical'
Label:
text: "Merhaba Dünya"
Label:
text: "Merhaba Kivy"
|
Şimdi Şekil 4.2 ‘deki gibi etiketlerimiz dikey olarak yerleşecektir.
Izgara pencere düzenini dah önce görmüştük. Sütun ve satırlardan oluşuyordu. Şimdi Izgara Pencere düzenini
kv
dili oluşturacağız.
girisformu.kv
programını
Liste 4.5
‘deki gibi yazın. Metin kutularının
TerxtInput
ile oluşturulduğuna dikkat etmelisiniz.
1 2 3 4 5 6 7 8 9 10 11 |
GridLayout:
cols: 2
Label:
text: "Kullanıcı Adı:"
TextInput:
Label:
text: "Parola:"
TextInput:
Widget:
Button:
text: "Gir"
|
Burada iki sütunlu olması için cols: 2 satırını eklediğimize dikkat etmelisiniz. Yine aynı soruyu sormak istiyorum, 9. satırdaki Widget garfik parçacığını niçin koymuş olabiliriz? main.py programını çalıştırdığınızda Şekil 4.3 ‘deki gibi görünecektir.
Aslında ızgara düzenini, kutu düzenlerini iç içe yazarakda yapabiliriz. Nihayetinde, ızgara düzeni dediğimiz, alt alta yerleştirilmiş (dikey yönelimli), yatay yönelimli kutulardan oluşmaktadır. Liste 4.6 ‘yi inceleyin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
BoxLayout:
orientation: "vertical"
BoxLayout:
Label:
text: "Kullanıcı Adı:"
TextInput:
BoxLayout:
Label:
text: "Parola:"
TextInput:
BoxLayout:
Widget:
Button:
text: "Gir"
|
Burada gördüğünüz gibi, en üstte bir tane dikey yönelimli kutu pencere düzeni ve bunun altında üç tane yatay yönelimli kutu pencere düzeni yerleştirmiş olduk. İşimizi biraz uzattık, ancak konuyu anlamanız açısından bu örneği verdik.
Liste 4.6
ve
Liste 4.5
aynı görünütüyü oluşturur. Python programını (burada
main.py
) hiç değiştirmeden birçok
kv
dosyası ile kullandık ve serferinde farklı pencereler elde ettik.
Liste 4.6
‘deki 12. satırı (
Widget:
yazan satır) silersek, nasıl bir değişiklik oluşur? Bunu denemelisiniz.
Grafik parçacıklarının görünür boyutlarını
size_hint_x
ve
size_hint_y
ayarlayabilirsiniz. Anlayacağınız üzere,
size_hint_x
yatay boyutun,
size_hint_y
ise dikey boyutun büyüklüğünü ayarlar. Ayarlamalar oran olarak yapılır. Örneğin yatay olarak yerleştirilmiş iki parcacıktan birisinin boyutu 1, diğerinin 4 ise, toplamı 5 yapacağından, ilk parcacık yatayın %20 sini, diğeri %80’nin kaplayacaktır. 3:2 olduğunda ne olabilir? İster yatay, ister dikey olsun birisine boyut bildirdiğinizde, diğerlerinede bildirmek durumundasınız. Aksi halde anlamsız olacaktır.
girisformu.kv
dosyasını
Liste 4.5
‘deki gibi düzenleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
BoxLayout:
orientation: "vertical"
BoxLayout:
# 1. satırı oluşturan yatay kutu
size_hint_y: 3
Label:
text: "Kullanıcı Adı:"
size_hint_x: 1
TextInput:
size_hint_x: 3
BoxLayout:
# 2. satırı oluşturan yatay kutu
size_hint_y: 2
Label:
text: "Parola:"
TextInput:
BoxLayout:
# 3. satırı oluşturan yatay kutu
size_hint_y: 1
Button:
text: "Gir"
|
Bunun üzerinde biraz konuşalım. Gördüğünüz gibi üç satır var. Her bir satır bir yatay kutu pencere düzeni tarafından oluşturulmakta, satırlar ise en üstteki dikey pencere kutusu ile alt alta getiriliyor. Üç adet satırın yükseklikleri sırası ile
size_hint_y:
3
,
size_hint_y:
2
ve
size_hint_y:
1
ile ayarlanmıştır (1., 2. ve 3. satırları oluşturan yatay kutular). Bunun anlamı dikey boyutun yarısı 1. yatay kutu tarafından kaplanacaktır. Geri kalan yarısının %66.6’sı 2. yatay kutu ve %33.3’ü ise 3. yatay kutu tarafından kaplanacaktır. Yatay büyüklük ise sadece 1. yatay kutu için ayarlanmıştır. %25’i etiket tarafından (
Kullanıcı
Adı
etiketi), %75’i ise metin kutusu tarafından kullanılacaktır. Programımızı çalıştırdığımızda
Şekil 4.3
‘deki gibi görünecektir.
Aslında bu kadar küçük programlar için
kv
içeriğini farklı bir dosyaya yazmaya gerek yok. Bunun yerine Python programı içerisine
kv
içeriğini de yazabiliriz.
Liste 4.8
‘de bunu görüyorsunuz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.lang import Builder
kv='''
BoxLayout:
orientation: "vertical"
BoxLayout:
Label:
text: "Kullanıcı Adı:"
TextInput:
BoxLayout:
Label:
text: "Parola:"
TextInput:
password: True
BoxLayout:
Widget:
Button:
text: "Gir"
'''
class girisFormu(App):
def build(self):
self.root=Builder.load_string(kv)
return self.root
girisFormu().run()
|
Gördüğünüz gibi,
kv
içeriği bir Python programı içerisindeki bir cümleden alınıyor ve
Builder
nesnesinin
load_string()
özelliği ile yükleniyor. Şimdilik neden ana pencerenin
self.root
değişkenine aktarılıp
build()
tarafından döndürüldüğünden bahsetmeyeceğiz. Çeşitli pencere düzenleri, ve grafik parçacığı büyüklükleri ile deneyiniz. Buradaki bir diğer değişiklik, parolanın yazılacağı metin kutusunun gerçek bir parola alanı olduğudur. Bunu
password:
True
özelliği ile yaptık. Artık bu alana yazılırken, yazılan karakterler görüntülenmez yerine yıldız (
*
) görüntülenir.
Bir metin kutusuna (TextInput), parola alanı yapacaksak,
password özelliğinin değerini
True
yapmalısınız. Bunu kod ile yapmak istiyorsanız
parola = TextInput(password=True)
ya da, daha sonra yapmak için:
parola = TextInput()
parola.password=True
kv
dili ile pencereleri oluşturmayı öğrendiğimize göre, şimdi biraz bu pencereleri işler hale getirmeye geldi. Sonraki bölümde garfik parçacıkları ile kullanıcı etkileşmesinin nasıl gerçekleştiğini göreceğiz.