25
Eyl
Önceki yazıda Django ile veritabanı kullanımı örneği yapacağımı yazmıştım ama url adresleri ile oynarken çok eğlenceli şeyler çıktı ortaya yazmadan edemedim.

Önceki örnekteki urlpatterns listemiz aşağıdaki gibiydi;

from deneme.dersler import dersindex, ders1, ders2

urlpatterns = patterns('',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Buradaki ilk değerin boş olduğunu görüyorsunuz, bu değeri ihtiyaç halinde ön-ek (prefix) olarak kullanabilirsiniz. Şöyle;

from deneme.dersler import *

urlpatterns = patterns('deneme.dersler',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Peki şöyle bir import yazdıysak?

from deneme.dersler import *
from deneme.makale import *

#Şöyle

urlpatterns = patterns('deneme.dersler',
(r'^$', dersindex),
)

urlpatterns += patterns('deneme.makale',
(r'^$', makaleindex),
)

Bu r'^$' ifadesinde önceki örnekten farklı olarak bir "r" ekledim, bu zorunlu olmasada Python'a bu ifadenin string değil raw olduğunu anlatıyor ve kullanılması iyi olur.

Ayrıca Python'un 255 karakterlik bir fonksiyon arguman limiti var, yani büyük bir sitenin patterns() listesi büyük boyutlara ulaştığında yukarıdaki yöntem kullanılabilir.

Şimdi "/pardus/2008/1" adresini yazacağım pardussurumleri() fonksiyonu ile oluşturmak istiyorum. Bunun için yeni bir pardus.py dosyası açıp şu şekilde yazdım;


# -*- coding: utf-8 -*-

from django.http import HttpResponse

def pardussurumleri(request, version, subversion):
html = "Pardus "+version+"."+subversion
return HttpResponse(html)

Düzenli ifadede olarak kısaca "pardus/", 4 haneli sayı, "/" ve bir haneli sayı tanımı yapıyoruz.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(\d{4})/(\d{1})/$', pardussurumleri),
)

Peki fonksiyon tanımını şu şekilde yaptığımızı farz edelim;

def pardussurumleri(request, subversion, version):

Bu durumda "/pardus/2008/1" url adresi sonucunda Pardus 1.2008 gibi bir çıktı alırız, ancak aşağıdaki gibi bir pattern tanımı yaparsak fonksiyonumuz pardussurumleri(request, version="2008", subversion="1") olarak çağırılacak.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(?P<version>\d{4})/(?P<subversion>\d{1})/$', pardussurumleri),
)

Bunun ışığında /pardus20081 url adresi için şöyle bir ifade kullanılabilir.

r'^pardus(?P<version>\d{4})(?P<subversion>\d{1})/$'

Eğer henüz test aşamasındaki bir sürüm için kullanılacak bir url için "/pardus2009test" yerine "/pardus2009" kullanmak istersek pattern ile fonksiyona sabit bir değer geçirebiliriz.

(r'^pardus(?P<version>\d{4})/$', pardussurumleri, {'subversion' : 'test'})
23
Eyl
Bende sonunda eğlenceyi doruklarda yaşamak için Django ile "Selam cümlet-ül alemin" (Hello world) dedim. Linus'un Linux 1.0 duyurusunu yaptığı sıralarda (tabii 2 yıl öncesine kadar bundan haberim yoktu) ben bir Apple makinasındaki GWBasic ile "hello world" yazmanın heyecanını yaşayan bir gençtim. O gün bu gündür ne zaman yeni bir "hello world" yapsam hep aynı heyecanı duyuyorum. Bu arada "hello world yapmak" diye bir deyimi ilk kullanan kişiyim herhalde.

Her neyse, bu yazı öyle geyik bir yazı olmasın bir işe yarasın, diye neler yaptığımı anlatayım.

Django 1.0'ı Pardus'da kurmak için "sudo pisi it Django" komutu veya Paket Yöneticisinden tıklamanız yeterli.

Daha sonra projeler için bir klasör açmanız iyi olur, ben ev dizininde django adında bir klasör açtım, konqueror ile bu dizine girip F4 tuşuna basarak konsolu açın ve ilk projenizi aşağıdaki komut ile oluşturun.

django-admin.py startproject deneme

Django bu komutla deneme adında bir dizin oluşturacak ve proje için gerekli temel dosyaları buraya yazacaktır. Proje henüz boş ancak çalışıp çalışmadığını aşağıdaki komutla hemen test edebilirsiniz.

python manage.py runserver

Bu komutu deneme dizininde vermelisiniz, çünkü manage.py orada. Komut çıktısından anlayacağınız gibi tarayıcınızın http://127.0.0.1:8000 adresinden projenizi görüntüleyebilirsiniz. Kocaman bir "It worked" yazısı görmüş olmalısınız. Evet şimdi kendi kodlarımızı yazalım;

deneme Dizini altında "dersler.py" adında bir dosya oluşturun, içeriği şöyle;


# -*- coding: utf-8 -*-
#Üst satır Türkçe karakterler için

#Django kütüphanesinden bir işlev ekliyoruz
from django.http import HttpResponse


#Bu fonksiyon sitemizin indeks sayfasını oluşturacak
def dersindex(request):
html = "<a href='bolum1'>Bölüm 1</a><br>"
html += "<a href='bolum2'>Bölüm 2</a><br>"
return HttpResponse(html)


#Bu fonksiyon da başka bir sayfa
def ders1(request):
msg = "Django mu? o da ne?"
return HttpResponse(msg)



#Bir başkası
def ders2(request):
msg = "Django Reinhardt ünlü bir gitaristtir."
return HttpResponse(msg)


Bu üç fonksiyonun ortak özelliklerine dikkat edin, parametre olarak "request" alıyorlar ve HttpResponse ile değer döndürüyorlar. Buradaki her bir forksiyonun yaptığı sadece sayfanın içeriğni oluşturmak. dersindex Fonksiyonunudaki HTML kodlarına bakarsanız /bolum1 ve /bolum2 dizinlerine bağlantı verildiğini görüyorsunuz, ancak projemizde böyle bir dizin açmadık, şimdi anladığınız üzere ders1 ve ders2 diye iki fonksiyonumuz var ve bu url adreslerini bu fonksiyonlara bağlamamız gerekiyor. Bunu da Django'nun oluşturduğu urls.py dosyasından yapıyoruz. Bu dosyayı şöyle düzenledim;


# -*- coding: utf-8 -*-
#Bunu ben ekledim

from django.conf.urls.defaults import *

#Bunu da ben ekledim, yazdığımız fonksiyonları projeye ekliyoruz
from deneme.dersler import dersindex, ders1, ders2

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()


urlpatterns = patterns( '',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)


Böylece patterns fonksiyonundaki parametreler ile sitemizin /bolum1 adresi çağırıldığında ders1 forksiyonunun çalışmasını sağlamış oluyoruz. Bu url adreslerinde '^$' gibi düzenli ifadeler kullanılabiliyor, bunula ilgili http://pythontr.blogspot.com/2008/09/dzenli-ifadelelerde-kullanlan.html adresinden bilgi alabilirsiniz.

Merak etmeyin Django ile veritabanı kullanmak en az bu örnek kadar basit :) Bir sonraki örnekte ona bakarız.

17
Eyl

Artık ben değil robot resmim konuşsun :) 

(BU YAZIYI TUM KATEGORILERDE SECTIM UYGUNSUZ BIRSEY YAPTIYSAM OZUR DILERIM…)

8
Eyl
Soru: Emekleme aşamasındaki bir "python coder" bu konuyu proje olarak seçerse ne olur?
Cevap : pogy.tar.gz

İlgililerin paketteki README dosyasını okumasını... (Henüz beta bile olmadığını düşünerek pisilemedim.)
3
Eyl

Artık wordpress’den bıktım! her hafta parolamı sıfırlıyor :S anlamadım gitti neyse blogger’da hesap açtım burda okudugunuz gibi umarım blogger’dada okursunuz :) bu arada yazman’ın 0.2 Sürümü çıktı proje sayfasını ziyaret edebilirsiniz :D http://code.google.com/p/yazman/ lafı karıştırdım ama herneyse diğer bilogda görüşmek üzere :D :D herseyi verdim bilogun adını unutuyordum işte yeni adresim :D

http://eensar.blogspot.com/

29
AğU

Python türkçe kaynak sitesi her ne kadar az olsada aradıklarımızı buluyoruz. Belki deneyerek görerek kavramamız gerekir ama biz bunu seçiyoruz. Bugünlerde Python için türkçe kaynak siteleri arasına yeni bir site eklendi diyebilirim :) Gökmen ve Mirat abilerim python için türkçe kaynak sitesi açmışlar sağolsunlar üşemden yazıyorlar :) Bende bir PyQt‘ci olarak PyGtk içeren sitede ne kadar işim olur bilemem ama çok yakında PyQt ile ilgili yazıların bulunacağını söyleyebilirim :)

Jabber’da, Irc’de anlatacağıma, buraya yazarım; kafadan silinir, buradan silinmez!”

http://pythontr.blogspot.com/

23
AğU

Python’da herhangi bir şekilde oluşturduğumuz bir dosyayı silmenin yolu şudur:

import os

os.remove (”dosya/yolu”)

Masaüstümüzdeki python.txt dosyasını şöyle siliyoruz:

import os

os.remove (”/home/kullanıcı_adı/Desktop/python.txt”)


Python’da herhangi bir şekilde oluşturduğumuz bir dosyayı silmenin yolu şudur:

import os

os.remove (”dosya/yolu”)

Masaüstümüzdeki python.txt dosyasını şöyle siliyoruz:

import os

os.remove (”/home/kullanıcı_adı/Desktop/python.txt”)

Pardus için yazdığım çevrimdışı güncelleme yardımcısını kurulum CD'sinde bulunmayan PyQt4 ile geliştirmişim. Geliştirmişim diyorum çünkü bu trajik-komik durumu interneti olmayan bir kullanıcının test ederken aldığı "
ImportError: No module named PyQt4" hatasıyla anlamış olmamdan dolayı yaşadığım dumuru hala üzerimden atamadım. :D

Bu sabah programı pek içimden gelmeyerek PyQt'ye uyarlamak için biraz kurcaladım ama bu iki kütüphanenin birbirinden temel farklılıkları olduğunu anlayınca bu işi şimdilik bir kenara bırakıp programı bir komut satırı aracına dönüştürmenin daha az acı vereceğine karar verdim. Bu projeyi Qt ve özellikle QtXml'i tanımak için yapmıştım, beni teselli eden herhalde bu amacıma ulaşmış olmam oldu. Tabii bunu yaparken işe yarar bir şeyler ortaya çıkmasını da istiyordum.

Ancak kodlarla boğuşurken bu defa farklı olarak üyesi olduğum www.live365.com'dan bir Smooth Jazz [1] kanalını Amarok ile açtım. Kod yazarken ihtiyaç olan konsantrasyon, meditasyon, navigasyon vs.için oldukça etkili olduğunu fark ettim. Genelde sıkı bir Jazz dinleyicisi değilim ama sesi fazla açmadan yan taraftaki bir caz kulübünden odaya süzülen melodiler havasında dinlenen bu tür Cazın "Cazz'n Gazz" etkisini de hiç hafife almayın ve deneyin derim.

[1] http://www.live365.com/stations/bo67
19
AğU

Qt’de bir button ekliyoruz öncelikle tabiki buttona Hello World yazmayı unutmuyoruz :) sonradan yapmış olduğumuzu kaydetip Qt penceresini kapatıyoruz. sonradan yapmış olduğumuz helloworld.ui dosyasını helloworld.py dosyasına çevirecez konsola pyuic4 helloworld.ui -o helloworld.py komutunu veriyoruz ve helloworld.ui dosyamız helloworld.py dosyasına dönüşüyor. sonradan helloworld.py dosyasını açıyoruz dosyamızın en altına

app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(window)

window.show()
sys.exit(app.exec_())

kodlarını ekliyoruz. Dosyamızın üstünde bulunan

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file ‘helloworld.ui’
#
# Created: Tue Aug 19 14:14:26 2008
#      by: PyQt4 UI code generator 4.4.2
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

bu kodu siliyoruz yerine

# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui

bu kodu ekliyoruz…

http://imaj.at/image/47187

helloworld.ui helloworld.py

14
AğU

Yaklaşık 5 ay önce GHOP‘e katılmam ile beraber özellikle Python ve Python ile yazılan modüllere katkıda bulundum, bunların arasında pydigg python modülünün testleri, PyOpenGL ile örnekler oluşturma, dökümantasyon, Python standart kütüphanelerinin testleri gibi birçok şey mevcut idi. Yarışma sonuçlandı, her ne kadar büyük ödülü alamasam da Google Mountain View’dan kargolanan 3 adet sticker, 1 adet t-shirt ve cüzi bir miktar para beni sevindirdi.

Şimdi ise çok küçük ama morali en üst düzeye çıkaran birşey elime ulaştı. USB Mini Travel Cable. Kutusunun üzerinde “Thank you from Python!” yazmakla beraber, aletin üzerinde python logosu ve bir de “thanks” yazısı mevcut. Yanımda sürekli taşıyabileceğim ve beni mutlu edebilecek birşey. Bunu göndermelerin sebebi ise GHOP kapsamında Python standart kütüphanesi olan “xmlrpc”nin testlerini %56 gibi bir orandan %95′e yükseltmem. Günlerde üzerinde uğraştığınız kodun python svn deposuna commit edilmesi ve 5 ay gibi bir aradan sonra böyle bir hediye almak gerçekten sevindirici.

http://img137.imageshack.us/img137/6356/photo0006uc0.jpg

Siz de Python’a çeşitli yollar ile katkıda bulunabilirsiniz. Bunun için python wiki bağlantısını ziyaret edebilirsiniz. Özellikle GSoC ve GHOP gibi fırsatları kaçırmamanızı öneririm. Eğer henüz üniversiteye girmemişseniz ve hâlâ lise öğrencisiyseniz, buraya tıklayarak daha geniş bilgi alabilirsiniz. Eğer üniversite öğrencisiyseniz, sizi şöyle alalım :)

Teşekkürler Google, teşekkürler Python!

8
AğU

İnternette Gtk ile ilgili Türkçe bir döküman aradığınızda bilgiden çok küfür var nedense. Aman abi sen ne yapıyorsun ,acayip zor ,imkansız sadece über-geek’ler gtk kullanarak programlama yapabilir. Gtk ile programlama yapanın geyşası olurum gibi yorumlar yükseliyor. Bende bu sebepten başlangıçta kendimi qt yolunda zorlamıştım fakat yapamadım. Gtk fetişim xfce ile birlikte nirvanasına ulaştı genç zihnime bir karabasan gibi bulaştı. fazla lafı uzatmadan gtk nedir ne değildir diye kimseyi yormadan Türk internet medyasını büyük bir açlıktan kurtarayım dedim.

PyGtk hello world şeysi.

İlk önce glade denen tasarım aracımızla en basit manada bir arayüz tasarlayalım. Yorumları tahmin edebiliyorum neden arayüzü glade ile yapıyorsun delikanlı gibi kodlayarak yapsana diye.. css olmadan html kodlamak neyse glade olmadan gtk kodlamak (diğer gui api’lerini bilmediğim için birşey söyleyemiyorum) odur. Glade ile arayüzünüzü tarif eden bir xml dosyası oluşturursunuz. Sonra bunu programınızın içinde ayrıştırır (”parse” demeyeceğim) kullanırsınız. Kodunuz ayrı tasarımınız ayrı olur , 1000 satırlık değil 100 satırlık kodla güreş tutarsınız gözleriniz şeş beş bakmazsınız.

  • Yeni bir glade dosyası açın
  • bir adet window ekleyin
  • içine bir adet button nesnesi ekleyin , etiketine hello world gibi bişi yazın.
  • pencerenin ismi w1, düğmenin ismi d1 olsun.

Sinyaller ve işleyiciler:

Sinyal’ler aslında hareketlerdir düğmeye basıldı, nesne yokedilmek istendi , sürükleyip bıraktılar beni vs gibi. İşleyici de bu aksiyon karşısında widget’in arkadaşlarına ne diye bağırdığı desek yeridir. Örneğin b1 tuşu tıklandığı zaman “bana tıkladılar imdat” diye bağırıyor , ve bunu dinlemekle görevli olan fonksiyon bu sesi duyunca yettim gayri değip çalışmaya başlıyor…

tabii

tabii

  • w1 widget’ının(Türkçesini bulursam yazıcam)  sinyaller sekmesine girin GtkObject altındaki destroy
    sinyalinin yanına “w1_kapatilmak_istendi” yazın.
  • b1 widget’ının sinyaller sekmesine gidin clicked sinyalinin yanına işleyici olarak “d1_basıldı” yazın.
  • dosyayı hello.glade adıyla kaydedin.

Godlamaya başlayabiliyin aybalam:

En sevdiğiniz editörle yeni bir python dosyasına başlayın en sevdiğiniz 2 satırı bu dosyanın başına yazın.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

ilk önce pygtk modülünü ve sys modülünü import eyleyin.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk ,sys

sonra pygtk ya senin bana version 2.0′ın lazm değilsen işime yaramazsın diyeceğiz. pygtk.require(’2.0′) eğer exception kaldırırsa versionu 2.0 dan aşağı demektir o zaman program çalışmasın.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk, sys
try:
printpygtk.require(’2.0′)
except:
print “versiyon tutmadı…”
sys.exit(1) # [*1]

*1 : python un yeni versiyonunda sadece exit() demek yetiyormuş.

Eğer pygtk 2.0 var ise geri kalan gerekli modülleri import edelim..

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk, sys
try:
printpygtk.require(’2.0′)
except:
print “versiyon tutmadı…”
sys.exit(1)
import gtk , gtk.glade

Şimdi glade dosyamızı ayrıştıralım , içinden w1 ve b1 nesnemizi kullanmak üzere birer değişkene atayalım.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk, sys
try:
printpygtk.require(’2.0′)
except:
print “versiyon tutmadı…”
sys.exit(1)
import gtk , gtk.glade
window_tree = gtk.glade.XML(’hello.glade’)
window = self.wtree.get_widget(’w1′)
button = self.wtree.get_widget(’b1′)

Artık bu nesnelere ait işlemleri gerçekleştirebiliriz. ama önce programa hangi sinyali ne için kullanacağımızı belirtelim bunu yapmak için hangi işleyicinin hangi fonksiyonu tetikleyeceğini bir sözlük üzerinde topluyor sonra autoconnect ile bu işlemleri fonksiyonlara bağlıyoruz

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk, sys
try:
printpygtk.require(’2.0′)
except:
print “versiyon tutmadı…”
sys.exit(1) # [*1]
window_tree = gtk.glade.XML(’hello.glade’)
window = self.wtree.get_widget(’w1′)
button = self.wtree.get_widget(’b1′)
signals = {
‘w1_kapatilmak_istendi’ : end_program,
‘d1_basıldı’ : end_program,
}
window_tree.signal_autoconnect(signals)

Gördüğünüz gibi tuşa basıldığı zaman ve pencere kapatılmak istendiği zaman end_program fonksiyonuna yönlendiriyoruz… peki bu end_program fonksiyonunu nasıl tanımlayacağız?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk, sys
try:
printpygtk.require(’2.0′)
except:
print “versiyon tutmadı…”
sys.exit(1) # [*1]
window_tree = gtk.glade.XML(’hello.glade’)
window = self.wtree.get_widget(’w1′)
button = self.wtree.get_widget(’b1′)
signals = {
‘w1_kapatilmak_istendi’ : end_program,
‘d1_basıldı’ : end_program,
}

def end_program(self,widget,data=None):
print “Güle güle…”
gtk.main_quit()
# sinyalleri bağlamadan önce fonksiyonların
# tanıtılmış olması gerekiyor
window_tree.signal_autoconnect(signals)

burada dikkat etmemiz gereken şey şu gtk nın sinyalleri tarafından çağırılan fonksiyonların zorunlu olarak alması gereken sırasıyla self, widget , data=None argümanları.. Aslında bunu ezberleyin çünkü hep bu şekilde kullanacaksınız.

Widget’larla işimiz bittiğine göre w1′e göster kendini emrini verelim. ve son olarak gtk ya ben işimi bitirdim bundan sonra kontrol sende demek için gtk.main() diyelim.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk, sys
try:
printpygtk.require(’2.0′)
except:
print “versiyon tutmadı…”
sys.exit(1) # [*1]
window_tree = gtk.glade.XML(’hello.glade’)
window = self.wtree.get_widget(’w1′)
button = self.wtree.get_widget(’b1′)
signals = {
‘w1_kapatilmak_istendi’ : end_program,
‘d1_basıldı’ : end_program,
}

def end_program(self,widget,data=None):
print “Güle güle…”
gtk.main_quit()
window_tree.signal_autoconnect(signals)
gtk.main()
window.show()

işte sonuç…

Buradaki kodların boşluk karakterlerinde falan bozukluk olabilir siz en iyisi kodlara şuradan da bir bakın.

hello.py hello.glade

3
AğU

python-challange sitesindeki seviyelerin birinde HTTP üstünden çalışan recursive bir bot yazmak gerekiyor. bu botun, her istekte cookie taşıması da gerekli. urrlib ile daha önceden tanışıklığım olmasına rağmen, urllib cookie handle edemiyor. HTTPlib, cookie handle edebiliyor onda da birtakım sorunlar yaşadım.

PHP ile buna benzer bir çok bot yazmıştım cURL ile. gönül hemen pyCurl paketini aradı tabii :) pardus 2008′de devel deposunda bir adet pyCurl paketi vardı fakat sağlıklı çalışmıyordu. bende yeni bir tane hazırladım.

inşa dosyalarına bu adresten ulaşabilirsiniz.

kurmak için;

pisi build http://www.darkbrown.org/pardus/pycurl/pspec.xml

bu komuttan sonra komutu çalıştırdığınız dizinde pycurl-7.16.4-1.pisi dosyası oluşacaktır.

pisi install pycurl-7.16.4-1.pisi komutunu verip kurmanız yeterli.

daha sonra /usr/bin/python içinden etkileşimli moda girip, import pycurl komutu ile doğru kurulup kurulmadığını test edebilirsiniz.
>>> import pycurl
>>>

pyCurl, diğer kütüphanelere göre daha üstün özelliklere sahip. neden pyCurl? başlıklı bir yazı yazacağım 1-2 gün içinde.

29
Tem

İşteBenimArabam adında bir çalışma başlattık. Nekadar iyi gider bilmiyorum :) ama yakın zamanda bayabi güzelleşeçeğe benziyor (Projeyi dün başlattık :))

İşteBenimArabam

26
Tem

Yazman, adında python ile basit bir metin düzenleyici yazdım ve paketledim proje sayfasına bu adresten ulaşabilirsiniz. Kaynak dosyalarada bu adresten ulaşabilirsiniz.

Ekran Görüntüsü:


Merhaba dünya ile başladık güle güle dünya ile bitiriyoruz..

25
Tem

Sizde benim gibi la minör gamını hesapla bakim dendiği zaman parmak hesabı yapıyorsanız. Hadi hesabı yaptınız diyelim gitarın perdeleri üzerinde nerelere basıcam peki diye kaşlarınız emrah pozisyonu alıyorsa. Bunu hesapları yapmak için guitar pro (yada muadili herhangi bir program) kurmak kullanmak istemiyorsanız. musicscale.py sizin için yazıldı (reklamcılık okumalıymışım :))

erkan görüntüsü

musicscale.py bu işleri sizin için yapan 80 satırlık bir python programı. Nasıl kullanıldığını görmek ve indirmek için buraya tıklayınız.

Kendisi gayet buggy bir arkadaş , parametreleri yanlış verirseniz sapıtıyor ama o kadarını da düzgün yapın yaw :)

16
Tem

Pardus 2007.3 yerine 2008′i kurduğumdan beri qt4′e hiç ellememiştim hatta kendi kendime hiç kurmasammı? bu işleri bıraksammı? gibi düşüncelere kapıldım ama tekrar çalışmalarıma devam ediyorum

Hiçbir düşünce beni Pardus‘tan ayıramaz :)

15
Tem


Bakalım zaman bulup bitirebilecek miyim? Aslında sistemdeki mevcut paketleri ve depo indekslerini tarayan birkaç python sınıfı yazdım, hatta konsoldan güncellenecek paket listesini bile aldım, yani işin özü tamam gibi ama derlenip toparlanması ve hata ayıklaması var. Hadi hayırlısı...


30
Haz

Bugün beni saatlerce uğraştıran küçük bir keşif bu. Keşif diyorum çünkü Qt'yi sadece Qt Designer'den kullanmış birisi olarak Qt referans belgeleri arasında kayboldum. Bulabildiğim tüm örnekler C üzerindeydi ve Qt ile xml parse işlemi yapan pek kimsenin olmadığını fark ettim. Herhalde başka kütüphaneler kullanıyorlar ama ben Qt diye tutturdum :) Hele PyQt ile xml parsing örneği bulabilen varsa allah rızası için bana adresini yazsın...

Aslında gerek kalmadı işin mantığını çözdüm, ama hala bana Python ve Qt ayrı dünyalarda gibi geliyor. Madem kimse yazmamış işte ben yazıyorum, Python'da Qt kütüphanesi ile nasıl XML Parse edilir.


XML Dosyası şöyle olsun;


<PISI>
<Distribution>

</Distribution>
<Package>

</Package>
<Package>

</Package>
</PISI>



Minik python kodu da şu;

#!/usr/bin/python


from PyQt4 import QtCore, QtXml

#Dosya'yı aç ve oku
f = QtCore.QFile("pisi-index.xml")
f.open(QtCore.QIODevice.ReadOnly)
heap = f.readAll()

#Xml nesnesi oluştur
xml = QtXml.QDomDocument()

#Xml içeriğini nesneye aktar.
#aktarınca parse edilmiş olacak
#geri dönüş değeri 4 adet değişken oluyor
#ve () içinde bu dönen değerler alınabiliyor
#ilk değişken parse işleminin başarı durumu
(success, msg, a,b) = xml.setContent(heap)
print success

#firstChild fonksiyonu adı üstünde
#ilk Xml düğümünü (node) yani root-node'u
#QDomNode nesnesi olarak döndürüyor
first = xml.firstChild()

#QDomNode nesnesinin nodeName fonksiyonu
#düğümün adını döndürüyor
print first.nodeName()

#ChildNodes ise bağlı düğümlerin bir
#listesini tutan QDomNodeList
#nesnesinin döndürüyor
childs = first.childNodes()

#Bu nesnenin at() fonksiyonuna verilen
#parametre kaçıncı düğümü döndüreceğini
#belirtiyor tabii ki dönen nesne de bir QDomNode
firstelement = childs.at(1)
print firstelement.nodeName()

Programı çalıştırınca çıktımız şöyle;

True
PISI
Package

Bu çıktıdan nelerle uğraştığımı da anlamış olabilirsiniz :) Ayrıca Qt ile ilgileniyorsanız ve Pardusunuzda Qt Asistan kuruluysa kendinize bir sürpriz yapın ve "qtdemo" komutunu çalıştırın.