You are on page 1of 19

PYTHON LE PROGRAMLAMAYA GR

Cihangir BEKTA
cihangir[at]akademi[dot]EnderUNIX[dot]org http://www.EnderUNIX.org 13 Mays 2008

NDEKLER: PYTHON DLNN ZELLKLER PYTHON' A GR ARTMETK LEMLER VER TPLER KONTROL DEYMLER FONKSYONLAR MODLLER PAKETLER HATALAR ve STSNALAR SINIFLAR PYTHONDA MYSQL VE QT LE GUI UYGULAMASI 1 1 1 1 5 7 9 10 11 12 14

Python ile Programlamaya Giri

1.PYTHON DLNN ZELLKLER


* Nesneye ynelikdir. * zgrdr. * Yorumlamal ve derlemelidir. Her ne kadar sadece yorumlamal gzkse de "byte code" biiminde derleme yaplr. * Tanabilir. * Gldr. htiyacnz olabilecek hemen hemen tm zellikler mevcuttur. * Hzldr. * Ticari uygulamalar gelitirmeye uygundur. Bunun iin kodu bytecode eklinde verebilirsiniz ya da "py2c" ile C modlne evirip derleyebilirsiniz. * Yazlm kolaydr. * renmesi kolaydr.

2.PYTHON' A GR
ncelikle python sisteminize yok ise www.python.org sitesinden sisteminize uygun olan indirebilirsiniz. Ayrca python n yannda baz modllere ihtiyacnz olabilir. Eer UNIX kullanyorsanz bu modlleri paket yneticiniz araclyla ykleyebilirsiniz. Python iki ekilde kullanlabilir. Bunlardan biri etkileimli python kabuunu kullanmak. Dieri ise programlar dosyaya yazmaktr. Etkileimli kabuk daha ok ksa programlar iin ve genelde test etmek iin kullanlr.

3.ARTMETK LEMLER
+,-,*,/ ilemleri mevcuttur. Yalnz bunlar kullanrken tip uyumazlna dikkat etmek gerekir. Ayrca '**' s almak iin kullanlr. rnek:
>>> 8**2 64

Karmak saylar zerinde de ilem yaplabilir:


>>> (3 + 3j) + (4 -1j) (7+2j)

4.VER TPLER
Python daki standart veri tipleri "saylar(integer, float), szckler(string, character), listeler(lists), tpler(tuples), szlkler(dictionaries), dosyalar(files)" dr. Deiken isimleri rakamla balayamaz. Tanmlarken trn belirtmenize gerek yoktur. Otomatik olarak alglanr.

4.1.Say deikenleri:
>>>a=6 >>>b=7 >>>a+b 13 >>>c=(1+1j)

Python ile Programlamaya Giri

>>>d=(2+3j) >>>c+d 3+4j

4.2.Szck deikenleri:
>>>a = "Merhaba Python" >>>print a Merhaba Python >>>b = " ile programlama" >>>a+b 'Merhaba Python ile programlama'

Szckler iin baz fonksiyonlar vardr. Bunlara rnek olarak szck olan deikeni sayya eviren int(), sayy szce eviren str(), szcn uzunluunu veren len() verilebilir.
>>> a=9;b="5" >>> print a+int(b) 14 >>> str(a)+b '95' >>> len(str(a)+b)

4.3.Liste deikenleri:
Listeleri verileri tutan diziler eklinde dnebiliriz. Olutururken keli parantez kullanlr.
>>> liste = ['java','c++','python'] >>> liste ['java','c++','python'] >>> liste[1] 'c++' >>> liste = liste + ['ruby'] >>> liste ['java','c++','python','ruby']

Ayrca listeler ters indistende okunabilir.


>>> liste[-1] 'ruby'

Liste elemanlar aralk vererek de kullanlabilir. Burada ilk eleman verilmezse 0 kabul edilir.
>>> liste[1:3] ['c++','python'] >>> liste[:2] ['java','c++'] >>> liste[2:] ['python','ruby']

Listeler iin de baz fonksiyonlar vardr. Bunlara rnek olarak listenin sonuna eleman eklemek iin "liste.append(eleman)", bir elemann listede ka tane bulunduunu dndrmek iin Python ile Programlamaya Giri 3

"liste.count(eleman)", iki listeyi toplamak iin "liste.extend(liste)", herhangi bir elemann indisini dndrmek iin "liste.index(eleman)", belli bir yere eleman eklemek iin "liste.insert(indis,eleman)", listenin son elemann ekmek iin "liste.pop()", herhangi bir eleman listeden karmak iin "liste.remove(eleman)", listeyi ters evirmek iin "liste.reverse()", listeyi sralamak iin "liste.sort()", listenin uzunluunu dndrmek iin "liste.len()" fonksiyonlar verilebilir. Burada "liste" oluturulan listenin ismi, "eleman" ise listedeki eleman temsil eder. rnein "liste" olarak yulardaki rneklerde tanmladmz liste deikeni, eleman olarak da 'python' verilebilir. rnek bir fonksiyon ars:
>>> liste.count('java') 1

olabilir.

4.4.Tp(tuple) Deikenleri:
Tpleri ierii deitirilemeyen listeler olarak dnebilirsiniz. Parantez () kullanarak tanmlanrlar.
>>> diller = ('c','python') >>> diller[1] 'python'

4.5.Szlk(dictionary) Deikenleri:
Python programclar iin szlkler ok avantaj salar ve programclar tarafndan sklkla kullanlr. Bu tipte anahtar-szck ikilisi vardr ve u ekilde tanmlanrlar:
sozluk={anahtar1:szck1,anahtar2:szck2,...} >>> sozluk = {'1':'fen','2':'trke'} >>> sozluk {'1': 'fen', '2': 't\xc3\xbcrk\xc3\xa7e'} >>> sozluk['1'] 'fen'

Burada 't\xc3\xbcrk\xc3\xa7e' sizi korkutmasn python trke karakterleri yle alglyor. Yoksa trke karakter destei var. Szlkler iin de baz fonksiyonlar vardr. Bunlara rnek olarak anahtarlar dndren "sozluk.keys()", herhangi bir anahtarn szlkte olup olmadn tespit eden varsa 1 yoksa 0 dndren "sozluk.has_key(sozcuk)", szckleri dndren "sozluk.values()", btn sozl dndren "sozluk.items()", szlkteki bir anahtara karlk gelen szc getiren "sozluk.get(anahtar)", szlkteki bir anahtara karlk gelen szc silen "sozluk.del(anahtar)", tm szckleri silen "sozluk.clear()", bir szle baka bir szl ekleyen "sozluk1.update(sozluk2)" fonksiyonlar verilebilir.

4.6.Dosyalar(files):
Dosyalar amak iin open() fonksiyonu kullanlr:
dosyadeikeni=open(dizin,mod)

Python ile Programlamaya Giri

Dosya okuma(r), yazma(w), ekleme(a), okuma ve yazma(rw) olmak zere 4 modda alabilir. Baz dosya ilemleri unlardr: * write(x) : x szc dosyaya yazlr. * readline() : Dosyadan bir satr okunur. * readlines() : Dosyann tamam bir listeye okunur. * read(x) : Dosyadan x byte okuma yaplr. * read() : Dosyann tamam bir szce okunur. * close() : Dosya kapatlr. u ekilde bir ilem yaplabilir:
>>> >>> >>> >>> dosyam = open('./dosya.txt', 'w') dosyam.write("ilk satr\n") dosyam.write("ikinci satr\n") dosyam.close()

Bu ilemden sonra python n altrld dizinde vi editryle dosyaya bakldnda ilemlerimizi test etmi oluruz.
$vi ./dosya.txt ilk satr ikinci satr

5.KONTROL DEYMLER
5.1.KARILATIRMA OPERATRLER
Python >, >=, <, <=, ==, <>(eit deil) gibi karlatrma operatrlerini gerekler. Ayrca lojik ilemler olarak "and(lojik ve)", "or(lojik veya)" ve "not(lojik deil)" deyimlerine sahiptir.

5.2.F DEYMLER
if karlatrma: doruysa altrlacak blok elif karlatrma: yrtlecek blok else: yrtlecek blok

Yukardaki kullanm ekline sahip "if" deyimi istenen koula gre istenen kod parasnn altrlmasn salar. not: Python da girintileme zorunludur. Yani ayn blokta olan kodlar ayn hizada yer almaldr. if, for vb. bloklara girildiinde programc girintileme yapmak zorundadr. Eer girintileme yaplmazsa program hata verir. rnek:
>>>if 5 > 3: ... print "5 3 ten byktr." ...elif 5 < 3:

Python ile Programlamaya Giri

... print "5 3 ten kktr." ...else: ... print "5 3 e eittir." 5 3 ten byktr

>>>

5.3."for" ve "while" DEYM


Bu deyimlerin kullanm ekli yledir;
for degisken in liste: yrtlecek blok while karlatrma: yrtlecek blok

"for" ve "while" deyimleri C ve C++ taki "for" ve "while" deyimlerinden biraz farkldr. Hatta daha yeteneklidir. nk listeler, tpler, szlkler zerinde dng yapabilme yetenei vardr. rnekle daha iyi grelim:
>>> a = ['kedi', 'kurt', 'aslan'] >>> for x in a: ... print x, len(x) ... kedi 4 kurt 4 aslan 5

Burada "in" kullanlr. Yani "in" den sonra gelen nesnenin iindeki elemanlar dngsel bir biimde x e atanr ve ilemler yaplr. 5.3.1."range()" Fonksiyonu "range()" fonksiyonu belli bir aralkta tamsaylardan oluan bir liste oluturmak iin kullanlr. Genel yaps yledir;
range(balang, biti, arti miktar)

Burada balang verilmezse 0 dan balar. Art miktar verilmezse varsaylan deer 1 dir.rnekle grelim:
>>> for i in range(3,5): ... print i

...
3 4

5.4."break" VE "continue" DEYMLER


"break" C de olduu gibi bulunduu for veya while deyiminden kmay salar. "continue" ise bal bulunduu dngnn bir sonraki aamasna geilmesine neden olur. rnekle grelim:

Python ile Programlamaya Giri

>>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print n, 'eittir', x, '*', n/x ... break ... else:... ... print n, 'asal saydr' ... 2 asal saydr 3 asal saydr 4 eittir 2 * 2 5 asal saydr 6 eittir 2 * 3 7 asal saydr 8 eittir 2 * 4 9 eittir 3 * 3

5.5."pass" DEYM
"pass" deyimi bir ey yapmaz. Daha nceden python' da girintileme zorunludur demitik. Bu girintilemeyi salamak iin eer deyime ait blokta bir ilem yapmayacaksak "pass" deyimini kullanrz.

6.FONKSYONLAR
6.1.FONKSYON TANIMLAMA
Python da fonksiyonlarn genel tanmlama ekli yledir:
def fonksiyon_ad(parametreler): yrtlecek blok

Burada fonksiyon tanmlamas yaplr. Yani bu bir yrtme eylemi deildir. Fonksiyonu yrtmek iin o fonksiyona ar yapmak gerekir. rneklerle grelim:
>>> def fib(n): ... """n ye kadar olan Fibonacci serisini yaz""" ... a, b = 0, 1 ... while b < n: ... print b, ... a, b = b, a+b #ayn anda ikili atama yaplabilir ... >>> fib(2000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

Burada bu fonkison C de bildiimiz "void" dndren tipte bir fonksiyondur. Ayrca bir deer dndren fonksiyonlar da yazlabilir:
>>> def fib2(n): ... result = [] ... a, b = 0, 1 ... while b < n: ... result.append(b) ... a, b = b, a+b ... return result ...

Python ile Programlamaya Giri

>>> f100 = fib2(100) # fonksiyon ars >>> f100 # fonksiyonun kts [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Fonksiyon parametrelerine varsaylan deerler yklenebilir. Bu ekilde ilgili parametre verilmediinde varsaylan deer kabul edilir. rnekle grelim:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise IOError, 'refusenik user' print complaint

Burada kullancdan "yes" veya "no" girmesi isteniyor. "raw_input" kullancdan veri alnmasn salar. "raise IOError" ise hata verilmesini salar. Burada varsaylan deerler "retries" iin 4, "complaint" iin "'Yes or no,please!'" dir. Fonksiyonlar iin zel fonksiyonlar da vardr. Bunlardan biri lambda() dr. Ksa olan programlar def ile tanmlamak yerine annda tanmlama yapma olana salar. rnekle grelim:
>>> a = lambda x,y : x*y ... a(2,5) 10

Burada lambda u ablona sahiptir:


lambda parametre_listesi:ifade

6.2.FONKSYONEL PROGRAMLAMA ARALARI


Python' da fonksiyonlar daha etkili kullanmak zere 3 adet fonksiyon vardr: filter(), map(), reduce(). "filter(fonksiyon, aama)" yaps fonksiyona aama iindeki verileri parametre olarak atar ve aama verisi doruysa fonksiyonu arr. Daha iyi anlamak iin rnekle aklayalm:
>>> def f(x): return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]

Burada fonksiyon yle tanmlanmtr; Eer x 2 ye ve 3 e blnemiyorsa x i dndr. Bu tanmlamaya gre fonksiyona parametre olarak gelen [2,25] aralndaki saylar filter() fonksiyonuyla f(x) fonksiyonuna parametre olarak gnderildiinde 2 ve 3 e blnemeyen saylar dndrlr. Burada fonksiyon 23 kez arlmtr. "map(fonksiyon, aama)" fonksiyonu aama verilerinin hepsi iin fonksiyonu arr. Sonucu bir liste eklinde dndrr. rnek:

Python ile Programlamaya Giri

>>> seq = range(8) >>> def add(x, y): return x+y

...
>>> map(add, seq, seq) [0, 2, 4, 6, 8, 10, 12, 14]

"reduce(fonksiyon,aama)" fonksiyonu pepee arlan fonksiyonlarn birinden dnen deeri dierine parametre olarak verip aamal ilemleri yapmay salar. rnek:
>>> def add(x,y): return x+y ... >>> reduce(add, range(1, 11)) 55

Yukardaki ilem 1 den 10 a kadar saylar toplamay salar.

7.MODLLER
Program yazarken etkileimli python kabuunu kullanyorsanz kabuu kapattnzda yazdklarnz gider. Bunun iin programlar dosyalara yazlr. Bu dosyalara fonksiyonlar tanmlanabilir. Ayrca her fonksiyonun ayn dosyaya yazlmas gerekmez. Farkl dosyalara farkl fonksiyonlar yazlabilir. Bu da modler programcl oluturur. Yani ayn ileve sahip fonksiyonlar ayn dosyalara yazarak modller oluturulur. Burada moduln ismi dosyann ".py" uzants hari geriye kalan isimdir. rnein "fibo.py" isminde yle bir python dosyas oluturalm:
#vi fibo.py def fib(n): a, b = 0, 1 while b < n: print b, a, b = b, a+b def fib2(n): result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result

Daha sonra python kabuundan bu dosyay modl olarak aralm:


>>> import fibo

imdi bu dosyadaki fonksiyonlar kullanabiliriz;


>>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ 'fibo'

Python ile Programlamaya Giri

Birden fazla dosyadan oluan bir paket program retiyorsak her bir dosyada kullanacamz modlleri ekleyerek istediklerimizi gerekletirebiliriz. Bu C/C++ daki "#include<>" da benzer.

7.1."dir()" Fonksiyonu
Bu fonksiyon parametre olarak verilen modln hangi isimleri tanmladn sral liste eklinde dndrr.
>>> import fibo, sys >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'callstats', 'copyright', 'displayhook', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getdefaultencoding', 'getdlopenflags', 'getrecursionlimit', 'getrefcount', 'hexversion', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'version', 'version_info', 'warnoptions']

8.PAKETLER
Modller hiyerarik bir ekilde import edilmek istendiinde paket yapsn kullanrz. Paketler alt modllere ayrlm yapya sahiptir. rnek bir paket yaps u ekildedir:
Sound/ __init__.py Formats/ __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... Effects/ __init__.py echo.py surround.py reverse.py ... Filters/ __init__.py equalizer.py vocoder.py karaoke.py ... #st dzey paket #Alt paket

#Alt paket

#Alt paket

Burada u ekilde paketlerdeki modller arlabilir:


>>>import Sound.Effects.echo

Python ile Programlamaya Giri

10

Burada Sound paketinin alt paketi olan Effects paketinden echo modl eklenmitir. Bu eklemeyi u ekildede yapabiliriz:
>>>from Sound.Effects import echo

9.HATALAR ve STSNALAR
9.1.SENTAKS HATALARI
Sentaks hatalar daha ok programn yazmndan kaynaklanan hatalardr. C/C++ a alm programclar genelde Python a alana kadar sentaks hatas yaparlar. rnein while dan sonra : koymaynca yle bir hata alrz:
>>> while True print 'Hello world' File "<stdin>", line 1, in ? while True print 'Hello world' ^ SyntaxError: invalid syntax

9.2.STSNALAR
stisnalar(exceptions) program alrken oluan hatalardr. Bu hatalara rnek olarak sfra blme hatas(division by zero) verilebilir;
>>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: integer division or modulo by zero

9.3.HATALARLA ALIMA
Program yazarken kullancdan veri aldmzda kullancnn istedii girileri yapabileceini dnrz. Kullanc yanl veri girdiinde hata retmemiz gerekir. Bunu Python da yle yaparz;
>>>try: yrtlmek istenen blok except (hata_tipi): hata olutuunda yaplacak blok

Burada hata_tipi opsiyoneldir. rnek olarak aadaki kodu verebiliriz;


#vi except.py import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except IOError, (errno, strerror): print "I/O error(%s): %s" % (errno, strerror) except ValueError: print "Could not convert data to an integer." except: print "Unexpected error:", sys.exc_info()[0]

Python ile Programlamaya Giri

11

raise

Yukardaki kodda ilk except ile I/O Error(Giri k hatas) iin tanmlama yaplmtr. Daha sonra ValueError (deer hatas) iin tanmlama yaplmtr. En son olarak ise bunlarn dnda olabilecek hatalar iin tanmlama yaplmtr.

9.4.HATA YKSELTME
Hata ykseltme, kullancnn isteine gre oluturulan hatalar ykseltmesini salar. rnek:
>>> try: ... raise NameError, 'Hata var!' ... except NameError: ... print 'Hata geldi!' ... raise ... Hata geldi! Traceback (most recent call last): File "<stdin>", line 2, in ? NameError: Hata var!

Burada NameError olduunda yrtlecek bir hata fonksiyonu oluturulmutur. raise NameError, Hata var! satr ile hata fonksiyonu arlmtr. Bunun sonucunda ise hata kts alnmtr.

10.SINIFLAR
Python da nesneleri oluturmak iin snflar kullanlr. Snflar deikenlerden ve fonksiyonlardan oluur. Genel snf tanmlamas yle yaplr:
class snf_ismi: snfa ait fonksiyonlar

rnek:
>>> class sinif: def __init__(self): self.x=10 self.y=20

Burada "sinif" isminde bir snf oluturduk. "__init__()" fonksiyonu python da snflarn yaplandrcs(constructor) grevindedir. Dolaysyla snf oluturduunuzda __init__() fonksiyonu yrtlr. rnee devam ederek grelim:
>>> a = sinif() >>> a.x 10 >>> a.y 20

Grld gibi a deikeniyle "sinif" ismiyle tanml bir snf oluturuldu. Bu snfn yaplandrcs yrtldnden a.x ve a.y ktlarnda daha nceden tanmladmz deerler olutu. Python ile Programlamaya Giri 12

Snflar ilk ardmzda belli parametreler ile de arabiliriz. Bu parametreler "__init__()" fonksiyonunda belirtilir. rnekle grelim;

>>> class Complex: ... def __init__(self, gercek, imajiner): ... self.r = gercek ... self.i = imajiner ... >>> x = Complex(3.0, -4.5) >>> x.r, x.i (3.0, -4.5)

Snflarda ayrca miras alma(inheritance) da vardr. Miras alndnda tanmlanan snf miras alnan snfn zelliklerini de ierir. Miras alnan snf st snf olarak dnrsek u ekilde tanmlanr: class snf_ismi(st_snf): snf ii tanmlamalar rnek:
>>> class X: ... def __init__(self): ... self.x=25 ... def goster(self): ... print self.x >>> ... ... ... ... >>> >>> 25 >>> 30 >>> 25 class Y(X): def __init__(self): X.__init__(self) self.y = 30 a = Y() a.x a.y a.goster()

Burada grld gibi st snfn yaplandrcsnn onu miras alan snf tarafndan arlmas gerekir. Python oklu miras almay(multiple inheritance) da gerekler. O da u ekilde gerekletirilir:
class snf_ismi(st_snf1,st_snf2,...): snf ii tanmlamalar

Ayrca operatrlere yeniden ykleme(operator overloading) de yapabilirsiniz. rnein "+" operatrnn yeniden yklemenmesi u ekilde olur:
>>> class karmasik: ... def __init__(self,g=0,i=0): ... self.gercek=g

Python ile Programlamaya Giri

13

... self.imaj=i ... def __add__(self,sayi): ... return karmasik(self.gercek+sayi.gercek,self.imaj+sayi.imaj) ... >>> a = karmasik(3,4) >>> b = karmasik(5,7) >>> c = a+b >>> print c.gercek, c.imaj 8 11

Kodda da grld gibi "+" operatrn yeniden yklemek iin "__add__()" fonksiyonunu yazmak gerekiyor. Dier operatrlerde de durum benzerdir. "-" iin "__coerce__()", "*" iin "__mult__()", "/" iin "__div__()" fonksiyonlarn yazmak gerekir.

11.PYTHONDA MYSQL VE QT LE GUI UYGULAMASI


imdi python da nasl program yazlacan rendiimize gre konunun daha iyi pekimesi iin bir rnek yapalm. ncelikle programn kullanaca veritabann oluturalm. Bu uygulama UNIX te yaplmtr. Dolaysyla mysql ykl olmaldr. Mysql ilemleri u ekildedir;
cihangir$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 5.0.51a-3ubuntu5 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> create database islem; Query OK, 1 row affected (0.12 sec) mysql> use islem; Database changed mysql> create table bilgi (ad varchar(20), soyad varchar(20),tel varchar(20),adres varchar(40)); Query OK, 0 rows affected (0.17 sec) mysql> insert into bilgi values ("Cihangir","Besiktas","05555555555", "EnderUNIX Akademi"); Query OK, 1 row affected (0.39 sec) mysql> select * from bilgi; +----------+------------+-------------+-------------------+ | ad | soyad | tel | adres | +----------+------------+-------------+-------------------+ | Cihangir | Besiktas | 05555555555 | EnderUNIX Akademi | +----------+------------+-------------+-------------------+ 1 row in set (0.37 sec)

Bu ekilde islem isimli veritaban ve ad, soyad, tel, adres bilgisini tutan bilgi isimli veritaban oluturulmutur. imdi bu veritabanndan sorgu oluturan gui uygulamasn yazalm. Uygulamann kodu u ekildedir;
cihangir$ vi mysql.py # -*- coding: utf-8 -*-

Python ile Programlamaya Giri

14

import sys from PyQt4.QtCore import * from PyQt4.QtGui import * import MySQLdb class SorguPenceresi(QDialog): def __init__(self): QDialog.__init__(self) self.ad = QLineEdit(self) self.soyad = QLineEdit(self) self.ekle = QPushButton(u"Sorgula") self.ekle.setEnabled(False) self.iptal = QPushButton(u"ptal") self.iptal.setFocusPolicy(Qt.NoFocus) butonlar = QHBoxLayout() butonlar.addStretch(1) butonlar.addWidget(self.ekle) butonlar.addWidget(self.iptal) gb = QGridLayout() gb.addWidget(QLabel(u"Ad:"), 0, 0) gb.addWidget(self.ad, 0, 1) gb.addWidget(QLabel(u"Soyad:"), 1, 0) gb.addWidget(self.soyad, 1, 1) gb.addLayout(butonlar, 2, 0, 1, 2) self.resize(400, 200) self.setLayout(gb) self.setWindowTitle(u"Sorgula") self.setTabOrder(self.ad, self.soyad) self.setTabOrder(self.soyad, self.ad) self.connect(self.ad, SIGNAL("textChanged(const QString &)"), self.slotDenetle) self.connect(self.soyad, SIGNAL("textChanged(const QString &)"), self.slotDenetle) self.connect(self.ekle, SIGNAL("clicked()"), self.accept) self.connect(self.iptal, SIGNAL("clicked()"), self.reject) self.connect(self, SIGNAL("accepted()"), self.sorgula) def sorgula(self): ad = (self.ad.text()) soyad = (self.soyad.text()) db=MySQLdb.Connection(host="localhost",user="root",passwd="LONdon23",db="is lem") cursor=db.cursor(MySQLdb.cursors.DictCursor) cursor.execute("select * from bilgi where ad = \"%s\" and soyad = \"%s\"" %(ad,soyad))

Python ile Programlamaya Giri

15

R = cursor.fetchall() cursor.close() QMessageBox.information(self,u"Sorgu Sonucu",u"<center>Ad: %s<br>Soyad: %s<br>Adres: %s<br> Tel: %s" %(R[0]['ad'], R[0]['soyad'], R[0]['adres'], R[0]['tel'])) def slotDenetle(self, text): disable = self.ad.text().isEmpty() disable |= self.soyad.text().isEmpty() self.ekle.setDisabled(disable)

def main(): app = QApplication(sys.argv) pen = SorguPenceresi() pen.show() sys.exit(app.exec_()) if __name__ == "__main__": main()

Bu kodu yazdktan sonra uygulamay altrmak iin komut satrndan u komut altrlmaldr;
cihangir$ python mysql.py

Komut altrldktan sonra u ekilde bir kt alnr:

Sorgulanacak veri girildikten sonra Sorgula butonuna bastmzda veritabanndan sorgu yapldktan sonra yle bir kt alnr: Python ile Programlamaya Giri 16

imdi kodu para para aklayalm;


import sys from PyQt4.QtCore import * from PyQt4.QtGui import * import MySQLdb

ncelikle uygulama gui uygulamas olduundan gerekli modller eklendi. Ayrca mysql kullanm iin MySQLdb modl eklendi. GUI iin baka modller de mevcuttur, fakat Qt GUI iin gzel bir modldr.
class SorguPenceresi(QDialog): def __init__(self): Qdialog.__init__(self)

Daha sonra ise snf tanmlamas yaplr. Yaplandrc __init__() fonksiyonu tanmlanr. Qdialog miras olarak alndndan onun da yaplandrcs arlr.
self.ad = QLineEdit(self) self.soyad = QLineEdit(self) self.ekle = QPushButton(u"Sorgula") self.ekle.setEnabled(False) self.iptal = QPushButton(u"ptal") self.iptal.setFocusPolicy(Qt.NoFocus) butonlar = QHBoxLayout() butonlar.addStretch(1) butonlar.addWidget(self.ekle) butonlar.addWidget(self.iptal) gb = QGridLayout() gb.addWidget(QLabel(u"Ad:"), 0, 0) gb.addWidget(self.ad, 0, 1) gb.addWidget(QLabel(u"Soyad:"), 1, 0) gb.addWidget(self.soyad, 1, 1) gb.addLayout(butonlar, 2, 0, 1, 2)

Python ile Programlamaya Giri

17

self.resize(400, 200) self.setLayout(gb) self.setWindowTitle(u"Sorgula") self.setTabOrder(self.ad, self.soyad) self.setTabOrder(self.soyad, self.ad)

Yukarda ise GUI arabirimleri tanmlanmtr. self.connect(self.ad, SIGNAL("textChanged(const QString &)"), self.slotDenetle) self.connect(self.soyad, SIGNAL("textChanged(const QString &)"), self.slotDenetle) self.connect(self.ekle, SIGNAL("clicked()"), self.accept) self.connect(self.iptal, SIGNAL("clicked()"), self.reject) self.connect(self, SIGNAL("accepted()"), self.sorgula)

Daha sonra bu arabirimler zerinde ilem yapldnda yrtlecek ilemler belirtilmitir. rnein son satrda Sorgula tuuna basldnda accept in altrlca, accept de altrldnda sorgu ilemlerini gerekletirecek sorgula fonksiyonunun altrlaca belirtilmitir.
def sorgula(self): ad = (self.ad.text()) soyad = (self.soyad.text()) db=MySQLdb.Connection(host="localhost",user="root",passwd="",db="islem") cursor=db.cursor(MySQLdb.cursors.DictCursor) cursor.execute("select * from bilgi where ad = \"%s\" and soyad = \"%s\"" %(ad,soyad)) R = cursor.fetchall() cursor.close() QMessageBox.information(self,u"Sorgu Sonucu",u"<center>Ad: %s<br>Soyad: %s<br>Adres: %s<br> Tel: %s" %(R[0]['ad'], R[0]['soyad'], R[0]['adres'], R[0]['tel']))

Yukarda ise sorgula fonksiyonu tanmlanmtr. Bu fonksiyon MySQLdb paketindeki fonksiyonlar kullanarak nce mysql balants yapm, daha sonra bir sorgu gerekletirmi, daha sonra ise balanty kapatmtr. Fonksiyonun sonunda ise QmessageBox ile ekrana mysql sorgusundan dnen sonular baslmtr.
def slotDenetle(self, text): disable = self.ad.text().isEmpty() disable |= self.soyad.text().isEmpty() self.ekle.setDisabled(disable)

Yukardaki slotDenetle fonksiyonu ise kullancdan girileri aldktan sonra Sorgula butonunu etkin hale getiren kodu iermektedir. Python ile Programlamaya Giri 18

def main(): app = QApplication(sys.argv) pen = SorguPenceresi() pen.show() sys.exit(app.exec_())

Burada ise main fonksiyonu tanmlanmtr. Bu fonksiyon programn almasn ve ilgili GUI elemanlarnn gsterilmesini salamaktadr.
if __name__ == "__main__": main()

Program altrldnda ise yukardaki if blou true olacaktr ve program alacaktr. Bu program daha ok pythonda snf tanmlamalar, miras alma, fonksiyon tanmlamalar vb. nin nasl yapldn gstermek iin yazlmtr. Yoksa bu programla ok detayl bir GUI anlatm amalanmamaktadr. GUI uygulamas gelitirmek iin PyQt kullanmak isteyenler daha detayl bilgileri internetten bulabilirler.

KAYNAKLAR
www.python.org/doc The PyQt4 Tutorial http://www.zetcode.com/tutorials/pyqt4/

Python ile Programlamaya Giri

19

You might also like