28
Kas

Bu dersimizde simülasyonumuzu geliştirmeye devam ediyoruz.

Düşen topların bir engelle karşılasmasını sağlayacağız.

def sabit_cizgi_ekle(space):
    govde = pymunk.Body(pymunk.inf, pymunk.inf)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    l3 = pymunk.Segment(govde, (200.0, 0), (200.0, 50.0), 5.0)

    space.add_static(l1, l2,l3)
    return l1,l2,l3

def to_pygame(p):
    """pymunk-pygame koordinat düzenlemesi yapar."""
    return int(p.x), int(-p.y+600)

def cizgileri_ciz(ekran, cizgiler):
    for cizgi in cizgiler:
        body = cizgi.body
        pv1 = body.position + cizgi.a.rotated(body.angle)
        pv2 = body.position + cizgi.b.rotated(body.angle)
        p1 = to_pygame(pv1)
        p2 = to_pygame(pv2)
        pygame.draw.line(ekran, THECOLORS["red"], p1, p2)

sabit_cizgi_ekle() fonksiyonuna yine space adında bir parametre veriyoruz. Fonksyionumuzda bir gövde tanımladık ve kütlesiyle momentini pymunk.inf değişkeniyle sonsuz yaptık. Bir nevi duvara monteleme işlemide denebilir sanırım… Gövdemizin pozisyonunu vektörel olarak 300×200 olarak belirledik. l1, l2, l3 değişkenlerine Segment nesnesi tanımladık. İlk parametreyle gövdesini diğer iki parametresini pygame.draw.line() da gördüğümüz gibi çizgi koordinatlarını belirledik. Son koordinat ise çizginin çapını belirliyor; daha doğrusu kalınlığı diyebiliriz…

Sabit olarak ekleyeceğimiz nesneleri Space sınıfımızın add_static() methodu ile ekliyoruz ve fonksiyonumuzda bu şekilde ekledikten sonra fonksiyonumuzun bu çizgileri döndürmesini sağladık.

cizgileri_ciz() fonksiyonuna, çizgileri çizeceği yüzeyi belirtmek için ekran parametresiyle; sabit_cizgi_ekle() fonksiyonundan dönen Segment nesnelerini grafik olarak çizdirmek için de cizgiler parametresini ekledik. Çizgileri bir for döngüsü yardımıyla tek tek pygame.draw.line() ile ekrana çizdirilmesini sağladık. pv1 ile pv2 de çizgilerin Space deki pozisyonlarını ayarladık. rotated(body.angle) da ise çizgilerin bir açısı varsa ona göre bir düzenleme yapılması sağlanıyor. Eğer bir çizgi 45 derece aksi yöne yatıksa Vektörde o kısımın değeri artış ya da azalış gösterecektir.

p1 ve p2 de ise önceki dersimizde pygame’e özgü koordinat çevirme işlemi yapılıyor. Bu çevrimi yapılmış koordinatlar çizginin simülasyondaki yerine göre çizilmesini sağlıyor.

#-*- coding: utf-8 -*-
import sys
import pygame
from pygame.color import *
import pymunk

#def top_ekle(space):
#def top_cizdir(ekran, top):
# Yer kaplamaması için bu şekilde gösterildi. Siz kodunuzu olduğu gibi bırakın.

def sabit_cizgi_ekle(space):
    govde = pymunk.Body(pymunk.inf, pymunk.inf)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    l3 = pymunk.Segment(govde, (200.0, 0), (200.0, 50.0), 5.0)
    space.add_static(l1, l2,l3)
    return l1,l2,l3

def to_pygame(p):
    """pymunk-pygame koordinat düzenlemesi yapar."""
    return int(p.x), int(-p.y+600)

def cizgileri_ciz(ekran, cizgiler):
    for cizgi in cizgiler:
        body = cizgi.body
        pv1 = body.position + cizgi.a.rotated(body.angle)
        pv2 = body.position + cizgi.b.rotated(body.angle)
        print cizgi.a.rotated(1.0), cizgi.b.rotated(0.0)
        p1 = to_pygame(pv1)
        p2 = to_pygame(pv2)
        pygame.draw.line(ekran, THECOLORS["red"], p1, p2)

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

cizgiler = sabit_cizgi_ekle(space)
toplar = []

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            top_sekli = top_ekle(space)
            toplar.append(top_sekli)
            pass

    ekran.fill(THECOLORS["white"])
    for top in toplar:
        top_cizdir(ekran, top)
    cizgileri_ciz(ekran, cizgiler)
    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)

Örnekteki kodda cizgiler değişkenine sabit çizgilerin listesini tutturduk ve oyun döngümüzde cizgileri_ciz() fonksiyonumuza bu değişkeni parametre olarak vererek çizgilerimizi ekrana çizilmesini sağladık. Şimdi bu kodu çalıştırdığınızda bir hata yapmadıysanız fare tıklamalarınızda tepsi gibi bir alana top doldurabilirsiniz.

Şimdi sabit duran bu çizgileri bir pervanenin kanadı gibi bir noktasından iğneleyelim. Bunun için sabit_cizgi_ekle() fonksiyonunun adını cizgi_ekle() olarak değiştiriyoruz ve

def cizgi_ekle(space):
    devir_govdesi = pymunk.Body()
    devir_govdesi.position = (300,200)
    govde = pymunk.Body(50, 10000)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    devir_eklemi = pymunk.PinJoint(govde, devir_govdesi, (0,0), (0,0))
    space.add(l1, l2, govde, devir_eklemi)
    return l1,l2

bu şekilde bir kod ortaya çıkarıyoruz… İlk olarak devir_govdesi adında yeni bir Body nesnesi oluşturuyoruz ve diğer Body nesnemizle aynı pozisyona getiriyoruz. Çizgileri tutan gövdemiz artık sabit olmayacağı için 50 kütleli ve 10000 momente sahip oluyor. Sağ taraftaki l3 çizgisinide çıkarıyoruz.

devir_eklemi adında bir PinJoint nesnesi oluşturduk. Bunu bir çubuğun ortasına saplanmış iğne gibi düşünebilirsiniz. PinJoint sınıfının ilk iki parametresi a ve b noktaları olmak üzere koordinat verisi alır; diğer iki parametree farklı bir değer vermeyecekseniz yazmanıza gerek yoktur. Hakkında pek bilgim yok; onun için rasgele değerler vererek ne işe yaradığını çıkartabilirsiniz.

Space sınıfının add_static() methodu yerine de add() methodunu kullandığımıza dikkat edin…

Son olarak şu satırı

cizgiler = sabit_cizgi_ekle(space)

şu şekilde değiştiriyoruz:

cizgiler = cizgi_ekle(space)

Kodumuzu çalıştırıp fare sol tuşuyla top oluşturarak topun çizgilere temas etmesiyle çizgilerin pervane gibi döndüğünü göreceksiniz. Tabii ki; bunu bu şekilde bırakmayacağız. Pervane gibi dönmesini engelleyip kısıtlı olarak sağ-sol aşağı doğru eğilmesini sağlayacağız.

def cizgi_ekle(space):
    devir_govdesi = pymunk.Body()
    devir_govdesi.position = (300,200)
    sinirli_devir_govdesi = pymunk.Body()
    sinirli_devir_govdesi.position = (200,200)
    govde = pymunk.Body(50, 10000)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    devir_eklemi = pymunk.PinJoint(govde, devir_govdesi, (0,0), (0,0))
    eklem_siniri = 25
    sinirli_devir_eklemi = pymunk.SlideJoint(govde, sinirli_devir_govdesi, (-100,0), (0,0), 0, eklem_siniri)
    space.add(l1, l2, govde, devir_eklemi, sinirli_devir_eklemi)
    return l1,l2

Fonksiyonumuz biraz daha gelişti… sinirli_devir_govdesi adında yeni bir Body nesnesi tanımladık ve 200×200 pozisyonuna ayarladık. sinirli_devir_eklemi adında ise SlideJoint nesnesi tanımladık. İlk iki parametre PinJoint sınıfındaki gibidir. Üç ve dördüncü parametrelerde PinJoint sınıfının son iki parametresiyle aynı işleve sahiptir. parametre adı anchor olduğundan en uygun anlamı çapa oluyor. Buna göre x koordinatı -100 olan yere çapa atılmış oluyor. Belgelendirme yeterli düzeyde olmadığından ancak bu kadarı çıktı malesef… Son parametre eklem_siniri ise çizginin ne kadar kaydırılılabileceğini(?) söylüyor. Buna da farklı değerler vererek pekiştirme yapabilirsiniz. Son olarakta Space nesnemizin add() methoduna SlideJoint nesnemizi ekliyoruz. Fonksiyonla işimiz burada bitiyor…

Önceki derste listeye eklenen topların ekranda olmamasına rağmen listede yer işgal ettiğini ve bunlarında programın ekrana çizmeye çalıştığını söylemiştik. Ekleyeceğimiz tek satır kod ile y koordinatı sıfırın altına düşen topları listeden çıkartacağız ve olası şişme ve performans sorununun önüne geçeceğiz.

for top in toplar:
    top_cizdir(ekran, top)

Oyun döngümüzdeki bu for döngüsüne

if top.body.position.y < 0: toplar.remove(top)

kodunu ekleyerek

for top in toplar:
    if top.body.position.y < 0: toplar.remove(top)
    top_cizdir(ekran, top)

Bu şekle getiriyoruz. Artık kodumuz sağlıklı bir şekilde çalışmalı. Kodumuzun son hali şu şekilde:

#-*- coding: utf-8 -*-
import sys
import pygame
from pygame.color import *
import pymunk

def top_ekle(space):
    kutle = 1
    yaricap = 24
    eylemsizlik = pymunk.moment_for_circle(kutle, 0, yaricap)
    govde = pymunk.Body(kutle, eylemsizlik)
    pos = pygame.mouse.get_pos()
    govde.position = pos[0], 600-pos[1]
    sekil = pymunk.Circle(govde, yaricap)
    space.add(govde, sekil)
    return sekil

def top_cizdir(ekran, top):
    p = int(top.body.position.x), 600-int(top.body.position.y)
    pygame.draw.circle(ekran, THECOLORS["blue"], p, int(top.radius), 0)

def cizgi_ekle(space):
    devir_govdesi = pymunk.Body()
    devir_govdesi.position = (300,200)
    sinirli_devir_govdesi = pymunk.Body()
    sinirli_devir_govdesi.position = (200,200)
    govde = pymunk.Body(50, 10000)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    devir_eklemi = pymunk.PinJoint(govde, devir_govdesi, (0,0), (0,0))
    eklem_siniri = 25
    sinirli_devir_eklemi = pymunk.SlideJoint(govde, sinirli_devir_govdesi, (-100,0), (0,0), 0, eklem_siniri)
    space.add(l1, l2, govde, devir_eklemi, sinirli_devir_eklemi)
    return l1,l2

def to_pygame(p):
    return int(p.x), int(-p.y+600)

def cizgileri_ciz(ekran, cizgiler):
    for cizgi in cizgiler:
        body = cizgi.body
        pv1 = body.position + cizgi.a.rotated(body.angle)
        pv2 = body.position + cizgi.b.rotated(body.angle)
        p1 = to_pygame(pv1)
        p2 = to_pygame(pv2)
        pygame.draw.line(ekran, THECOLORS["red"], p1, p2)

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

cizgiler = cizgi_ekle(space)
toplar = []

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            top_sekli = top_ekle(space)
            toplar.append(top_sekli)
            pass

    ekran.fill(THECOLORS["white"])
    for top in toplar:
        if top.body.position.y < 0: toplar.remove(top)
        top_cizdir(ekran, top)
    cizgileri_ciz(ekran, cizgiler)

    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)

Ne yazık ki pymunk hakkında pek fazla belge yok ve Kaynak altında verdiğim linkler ne kadar yeterli olur bilemiyorum, ama İngilizcesi yeterli olanlar sınıf isimlerinden vs. öğrenmekte zorluk çekmeye bilirler. Bende bu yazıyı yazarken bu modülü öğrendiğim için sorularınıza cevap veremezsem kusuruma bakmayın...

Kaynak:

http://code.google.com/p/pymunk/wiki/SlideAndPinJointsExample

http://pymunk.googlecode.com/svn/trunk/docs/api/index.html

Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. pymunk 2B Fizik Kütüphanesi – Bölüm 1
  2. Pygame ile Oyun Programlama – Sprite 1. Bölüm
26
Kas

pymunk kullanımı basit 2 boyutlu oyunlar için hazırlanmış 2B fizik motorudur. Bu modül chipmunk üzerine inşa edilmiştir. pymunk’u pygame, pyglet, PySFML gibi oyun kütüphaneleriyle kullanabileceğiniz gibi PyQt gibi grafik arayüz kütüphaneleriyle de kullanabilirsiniz.

pymunk modülünü öğrenirken pygame modülünden faydalanacağız…

pymunk ile daire, dikdörtgen ve çokgen şekilleri fizik kurallarına uydurabileceğimiz sınıflar ile eklem oluşturmak, engel oluşturmak gibi işlemler için de sınıflar mevcuttur.

pymunk modülünü; GNU/Linux kullanıcıları python-setuptools paketini depolarından kurduktan sonra “easy_install pymunk” ya da “easy_install pip” dedikten sonra “pip install pymunk” komutunu vererek kurabilir, Windows kullanıcıları ise buradan uygun buldukları setup dosyasını indirerek kurabilirler. Tabii GNU/Linux kullanıcıları komutları verirken yönetici yetkisi almalıdır. Yani komutunuzun başına “sudo” komutunu eklemelisiniz…

Kurulum tamamlandıktan sonra Python yorumlayıcısına

import pymunk

yazarak test edebilirsiniz. Eğer ImportError hatası almıyorsanız sorun yok demektir. O zaman motoru çalıştıralım :)

pymunk’ta fizik kurallarını uygulayacağımız bir alan oluşturmamız gereklidir. Bu işi Space() sınıfı ile yapıyoruz. Daha sonra gravity özelliği ile yer çekiminin uygulanacağı yönü belirliyoruz…

import sys
import pygame
from pygame.color import *
import pymunk

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()

    ekran.fill(THECOLORS["white"])
    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)

Örnekte görüldüğü gibi space değişkenine Space sınıfımızı atadık ve gravity özelliğine (0.0, -900.0) olarak atadık. İster bu şekilde yazalım, ister pymunk.Vec2d(0.0, -900.0) yazalım fark etmez. Sınıfımız doğru şekilde girilen veriyi kendisi Vec2d vektör nesnesine dönüştürecektir.

gravity özelliğine girilen ilk değer X koordinatını, ikincisi ise Y koordinatını temsil eder. Artı değer verilirse X için sağa, Y için yukarı doğru yer çekimi oluşur. Eksi değer girilirse tersi yönlere yer çekimi oluşur. Tabii yer çekimine maruz kalan nesnelerin vektörel değer girdiğimizden pygame koordinat tarzını ona göre ayarlamak gerekir.

Oyun döngümüzde 60 fps olarak ayarladığımız döngü sayısını fizik hesaplama süresiyle eşit tutuyoruz. step() methoduna girdiğimiz değerde oyun döngüsüyle eşit hesaplama yapmasını sağlıyor. Burada amaç simülasyonun uyumlu olmasını sağlamaktır.

Alanımızı oluşturduğumuza göre şimdi geometrik şekilleri çizdirmeye çalışabiliriz…

İlk olarak fare imleciyle ekrana tıkladığımızda bir daire çizdirelim ve fizik kurallarına göre yer çekimiyle aşağı doğru hareket etmesini sağlayalım…

def top_ekle(space):
    kutle = 1
    yaricap = 24
    eylemsizlik = pymunk.moment_for_circle(kutle, 0, yaricap)
    govde = pymunk.Body(kutle, eylemsizlik)
    pos = pygame.mouse.get_pos()
    govde.position = pos[0], 600-pos[1]
    sekil = pymunk.Circle(govde, yaricap)
    space.add(govde, sekil)
    return sekil

def top_cizdir(ekran, top):
    p = int(top.body.position.x), 600-int(top.body.position.y)
    pygame.draw.circle(ekran, THECOLORS["blue"], p, int(top.radius), 0)

top_ekle ve top_cizdir adında iki fonksiyon yazdık. top_ekle fonksiyonundan başlayalım:

Çizdireceğimiz şekle göre bir moment hesabı yapılması gerekiyor. Daire çizdireceğimiz zaman moment_for_circle fonksiyonunu dairenin moment hesabını yapmak için kullanırız. Değişken adlarından anlayacağınız gibi ilk parametresine kütle değerini, üçüncü parametresine de dairenin yarıçapını giriyoruz. 0 olan ikinci parametre ise dairenin iç yarıçapını temsil ediyor. Yani delikli para gibi bir şey düşünüyorsanız ikinci parametreye yarıçap verebilirsiniz.

Oluşturacağımız şekiller Body adında bir gövdeye ait olmalıdırlar. Body nesnemizi oluştururken şeklimizin momentinden ve kütlesinden haberdar olmasını sağlıyoruz. Sonra da çizileceği an gelince fare imleci pozisyonuna göre, ama y ekseni ekran yüksekliğinden çıkartılarak çizilmesi sağlanıyor. Çünkü matematikten hatırlarsanız y ekseni aşağı doğru eksilere inerken pygame de aşağı doğru artar. Bunu tersine çevirmek için böyle bir şey yapıyoruz.

Body nesnemiz ve yarıçap bilgisiyle bir Circle nesnesi oluşturuyoruz ve space parametresinden yararlanarak Space nesnemize gövdemizi ve şeklimizi ekliyoruz. Fonksiyonumuz bize Circle nesnemizi döndürüyor…

top_cizdir fonksiyonumuza ise ekran ve top parametrelerini almasını sağlıyoruz. p değişkeninde pygame’in anlayacağı koordinat verisini ayarlıyoruz ve draw.circle() fonksiyonumuz ile ekrana mavi renkli ve çapı 48 pixel olan bir daire çizilmesini sağlıyoruz.

Şimdi de ana kodumuza ufak eklemeler yaparak tam kodu yazalım.

import sys
import pygame
from pygame.color import *
import pymunk

def top_ekle(space):
    kutle = 1
    yaricap = 24
    eylemsizlik = pymunk.moment_for_circle(kutle, 0, yaricap)
    govde = pymunk.Body(kutle, eylemsizlik)
    pos = pygame.mouse.get_pos()
    govde.position = pos[0], 600-pos[1]
    sekil = pymunk.Circle(govde, yaricap)
    space.add(govde, sekil)
    return sekil

def top_cizdir(ekran, top):
    p = int(top.body.position.x), 600-int(top.body.position.y)
    pygame.draw.circle(ekran, THECOLORS["blue"], p, int(top.radius), 0)

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

toplar = []

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            top_sekli = top_ekle(space)
            toplar.append(top_sekli)

    ekran.fill(THECOLORS["white"])
    for top in toplar:
        top_cizdir(ekran, top)
    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)

Evet toplar adında boş bir liste oluşturduk ve ekranda fare sol tuşuyla bastığımızda şeklimizin oluşmasını ve toplar listesine eklenmesini sağladık. Oyun döngümüzde ise listeye eklenen her topun sırayla çizilmesini sağladık. Kodu çalıştırıp topları sol fare tuşuyla oluşturmaya başladıktan sonra subliminal mesaj gibi mavi topların belirip kaybolduğunu görebilirsiniz. Bu durum ya modüllerden kaynaklanan bir durum ya da listeye eklenen ama ekrandan çıkmış toplarında çizilmeye çalışmasından kaynaklı olabilir. Bir sonraki devam dersimizde bu konuyuda halletmeye çalışacağız…

Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. Pygame ile Oyun Programlama – Sprite 1. Bölüm
  2. Pygame ile Oyun Programlama – Sprite 2. Bölüm
  3. Pygame ile Oyun Programlama – Sprite 3. Bölüm
20
Eki

Uzun süredir geliştirmediğim Parçala adlı uygulamamın yeni sürümünü çıkarmış bulunuyorum. Parçala, Hj-Split ile aynı işi gören büyük boyutlu dosyaları parçalara ayırır, birleştirir ve dosya özetini çıkarır; bu sayede birleşen dosya doğru birleşmiş mi diye kontrol etmiş olursunuz. Aşağıda kullanımını gösteren bir video paylaşıyorum…

Doğrulama yaparken neden ikinci sefer dialogu açtığıma gelirsek; dosya özetinin değişmemesi kullanıcıları yanıltabilir diye doğruluğunu kanıtlamak için. Ayrıca gtk-qt tema dönüşümünden kaynaklanan bir sorundan dolayı(sanırım) dosya özetini görebilmek için girdi alanına tıklamam gerekti. Kde üzerinde ve Windows altında sorun yaşanmayacağını düşünüyorum. Uygulamanın kaynak kodlarına buradan ulaşabilirsiniz. Uygulamayı dener, hata alırsanız ve/veya şunu şöyle yap demek isterseniz proje sayfasından istekte bulunabilirsiniz(issue).

Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. Virux – GNU/Linux için bir antivirüs yazılımı :P
23
Eyl

QLineEdit’e girdiğimiz bilgiyi kontrol ederek string verilerden oluşan bir listede arama yapıp eşleşen verileri listeleyebiliriz. Bu sayede; bir arama işlemi yapıyorsanız geçmiş kaydı tutabilirsiniz.

Listede arama yapıp eşleşen sonuçları bulan sınıf ise QCompleterdir. Bu sınıfa vereceğimiz bir liste argümanı ile QLineEdit’te otomatik tamamlama yapabiliriz.

import sys
from PyQt4.QtGui import QApplication, QLineEdit, QCompleter

meyveler = ["elma", "armut", "karpuz", "ayva", "erik"]

class LineEdit(QLineEdit):
    def __init__(self, parent = None):
        QLineEdit.__init__(self, parent)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = LineEdit()
    completer = QCompleter(meyveler)
    window.setCompleter(completer)
    window.show()
    sys.exit(app.exec_())

Çok kısa bir kod ile işimizi hallettik. “meyveler” adında bir liste tanımladık ve bu listeye mevye isimlerini girdik. if blokunda ise “completer” adında bir QCompleter nesnesi oluşturduk ve argüman olarak “meyveler” adlı listeyi verdik. QLineEdit’in setCompleter() methoduyla QCompleter nesnemizi tanıttık. Yukarıdaki kodu çalıştırdığınızda girdiğini karaktere göre sonuçları QLineEdit’in altında listeleyecektir. Örneğin ilk karakteri “e” olarak girerseniz “elma” ve “erik” verileri alt alta sıralanacaktır.

Şimdi buna TAB yani sekme tuşuna basıldığında ilk sıradaki verinin QLineEdit’e yazılmasını sağlayalım…

import sys
from PyQt4.QtCore import Qt
from PyQt4.QtGui import QApplication, QLineEdit, QCompleter

meyveler = ["elma", "armut", "karpuz", "ayva", "erik"]

class LineEdit(QLineEdit):
    def __init__(self, parent = None):
        QLineEdit.__init__(self, parent)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Tab:
            for item in meyveler:
                if item.startswith(self.text()):
                    self.setText(item)
                    break
            event.accept()
        else:
            QLineEdit.keyPressEvent(self, event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = LineEdit()
    completer = QCompleter(meyveler)
    window.setCompleter(completer)
    window.show()
    sys.exit(app.exec_())

QLineEdit sınıfının keyPressEvent() methodunu kullanarak klavyeden basılan tuşları kontrol edecek kodlarımızı yazdık. Eğer klavyeden sekme tuşuna basarsak if bloku işlenecek ve listedeki elemanları sırayla kontrol edip girdiğiniz karakterlerle başlayan bir eleman varsa QLineEdit’e yazdırdık. Sekme tuşuna basılmaması durumunda da ekrana karakter yazmaya devam edebilmek için else blokunu yazdık. Eğer bu kısım olmaz ise klavyeden basılan hiç bir tuş ile QLineEdit’e veri girişi yapamayız.

Örnek olarak verdiğim listeyi veritabanından çektiğiniz verilerden de oluşturabilirsiniz ve aklınızı kullanarak girdiğiniz verileri veritabanına kayıt ederek kalıcı olmasını ve sonraki kullanımlarda hatırlanmasını sağlayabilirsiniz.

Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. QThread ile QProgressBar Kullanımında Uygulamanın Çökmesi
  2. Virux – GNU/Linux için bir antivirüs yazılımı :P
14
Eyl

PyQt kullanarak bir uygulama geliştiriyor ve bu uygulamaya ayarlar ekliyecekseniz QtCore modülünde bulunanan QSettings sınıfını kullanabilirsiniz. QSettings sınıfı ile *.ini-*.conf uzantılı dosya formatlarında ayarlarınızı saklayabilirsiniz.

QSettings sınıfı ayar dosyanızı olağan şeklinde GNU/Linux sistemlerde /home/kullanıcı/.config/ dizini altında kaydeder. Verdiğiniz parametrelere göre uygulamanızın adıyla bir dizin oluşturulup ayar dosyanız bu dizinde saklanabilir.

#-*- coding:utf-8 -*-
from PyQt4.QtCore import *

ayarlar = QSettings("AyarDizini", u"AyarDosyasi")
ayarlar.setValue(u"PencereAyarlari/PencereBoyutu", QSize(300, 300))

print ayarlar.value(u"PencereAyarlari/PencereBoyutu").toSize()

PyQt4.QtCore.QSize(300, 300) # çıktı

Örneğimizde; ayar dosyasını .config/ içerisine AyarDizini adında dizin oluşturup AyarDosyasi.conf adında olacak şekilde ayarladık. QSettings modülünün setValue() methodu ile değer yazdırmadan ne dizin oluşur, ne de dosya. Örnekte ise bu methodu kullanarak ayar bilgilerimizi yazdırdık ve value() methodu ile bu değerimizi yazdırdık. Burada value() methodu bize QVariant nesnesi döndürür ve biz bunu toSize() methoduyla QSize nesnesine çeviririz. Yazdırdığınız değere göre dönüştürme yapmanız gerekir. Bunun için QVariant dökümanını inceliyebilirsiniz.

Bu örnekte dikkat edilecek nokta “PencereAyarlari/PencereBoyutu” kısmıdır. Bu string değer ile ayar dosyamızda PencereAyarlari adında bir grup oluşturmuş ve bu grubun bir üyesi olarak PencereBoyutu‘nu eklemiş olduk. PencereBoyutu’nun değerini ise QSize(300, 300) olarak atamış olduk. Bu kodun ayar dosyasındaki çıktısı ise şöyle olur:

[PencereAyarlari]
PencereBoyutu=@Size(300 300)

Eğer setValue() methodunu kullanırken bölü(/) karakteriyle gruplamayı istemiyorsanız beginGroup() methoduyla grup oluşturabilirsiniz. Devamında yazacağınız değerlerde sadece ayarın ismini ve değerini girerek grup üyesi ayarları tanımlayabilirsiniz. Gruba son vermek için ise endGroup() methodunu kullanabilirsiniz.

#-*- coding:utf-8 -*-
from PyQt4.QtCore import *

ayarlar = QSettings("AyarDizini", u"AyarDosyasi")
ayarlar.beginGroup("PencereAyarlari")
ayarlar.setValue("PencereBoyutu", QSize(300, 300))
ayarlar.endGroup()

print ayarlar.value(u"PencereAyarlari/PencereBoyutu").toSize()
# veya
ayarlar.beginGroup("PencereAyarlari")
print ayarlar.value(u"PencereAyarlari/PencereBoyutu").toSize()
ayarlar.endGroup()

PyQt4.QtCore.QSize(300, 300) # çıktı

Genelde setValue() ile değer tanımladığınızda ayar dosyaya yazılır ve okunmaya hazır hale getirilir. Ancak herhangi bir nedenden dolayı dosyaya yazma işlemi yapılmıyorsa(Hata oluşmadıysa) sync() methodunu kullanarak senkronizasyon işlemi yapabilirsiniz.

Bir ayarı silmek istiyorsanız value() methodunu kullandığınız mantıkla remove() methodunu kullanarak ayar silebilirsiniz.

ayarlar.remove("PencereAyarlari/PencereBoyutu")
# veya
ayarlar.beginGroup("PencereAyarlari")
ayarlar.remove("PencereBoyutu")
ayarlar.endGroup()

Windows’ta ise QSetting sınıfı ayarları regeditte tutar, ama deneyimime dayanarak regedit kaydının sorunlu olduğunu söyleyebilirim. Bu yüzden Windows için de *.ini dosyası kullanmak isteyebiliriz. O zaman QSettings nesnemizi tanımlarken şu şekilde yazmalıyız.

ayarlar =  QSettings("DosyaYolu\dosya.ini", QSettings.IniFormat)

QSettings’e verdiğimiz ilk parametre dosya yolunu, ikinci parametre ise ayar formatının nasıl olacağını belirtir. Burada QSettings.IniFormat ile bir *.ini dosyası formatında olmasını sağladık.

Ayar dosyasının nerede tutulduğunu fileName() methoduyla öğrenebilirsiniz. Bu bilgiyle başlangıç ayarlarını yazmak için dosyanın varlığını kontrol etmenize olanak tanımış olur…

Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. QThread ile QProgressBar Kullanımında Uygulamanın Çökmesi
2
Eyl

Bir çok kez PyQt de QProgressBar’ı uygulama donmadan ilerletmek için QThread kullanmayı denedim, ama her seferinde uygulama çöküyordu. Bunun sebebini öğrenmek ve çözümünü bulmak için zamanında çok araştırma yapmıştım ve ODUN projesiyle uğraşırken çözümü bulmuştum. Aradan zaman geçti ve bu sefer Virux projemde QThread ve QProgressBar kullanmam icap etti. Zaman aralığı çok olduğundan çözümü unutmuştum ve aynı hataları almamla timer event kullanmak zorunda kaldım. Bugün jeton düştü ve ODUN projesinde ilgili koda bakarak nasıl yaptığımı tekrar hatırladım ve yeni sinyal yapısıyla cebelleştikten sonra uygun bir kodla sorunumu hallettim.

Bu konuda QProgressBar’ın uygulamayı dondurmadan ve çökertmeden nasıl kullanacağımızı göreceğiz… Öncelikle basit bir dialog oluşturup QProgressBar ekleyeceğiz ve uygulama çalıştığında QThread sayesinde ilerlemesini sağlayacağız.

import sys
from PyQt4.QtGui import QDialog, QApplication, QProgressBar
from PyQt4.QtCore import QThread

class Thread(QThread):
    def __init__(self, parent):
        QThread.__init__(self, parent)
        self.parent = parent
        self.sayac = 0

    def run(self):
        while self.sayac<1000000:
            self.parent.progress.setValue(self.sayac)
            self.sayac += 1

class Dialog(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.resize(400,250)
        self.progress = QProgressBar(self)
        self.progress.setGeometry(100,75,200,25)
        self.progress.setProperty("value", 0)
        self.progress.setMaximum(1000000)
        self.thread = Thread(self)
        self.thread.start()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    gui = Dialog()
    gui.show()
    sys.exit(app.exec_())

Dialog sınıfımızda dialogumuzu oluşturduk ve QProgressBar’ı ekledik. setGeometry() methodu ekrandaki konumunu ayarlamayı, setProperty() methodu ile QProgressBar’ın nasıl ilerleme yapacağını(%0-%100, 1/100 gibi), setMaximum() methodu ile de ilerleyişin en fazla hangi rakama kadar çıkacağını ayarladık. Yukarıda oluşturduğumuz Thread sınıfımızı tanımladık ve start() methodu ile de süreçi başlatmış olduk.

Thread sınıfını olabilecek en basit şekilde oluşturmaya çalıştım. Dialog sınıfında kullandığımız start() methodu Thread sınıfımızdaki run() methodunu çalıştıracaktır. Biz bu run() methodunda bir while döngüsü oluşturduk ve sayacı her döngüde +1 artırarak sonucu QProgressBar’ın setValue() methodu aracılığıyla aktardık.

Gayet basit, ama bir kaç tesadüf dışında anlam veremediğiniz hata çıktılarıyla uygulamanızın çöktüğünü göreceksiniz. Buna neden olan şey ise tek satır koddur:

self.parent.progress.setValue(self.sayac)

Nedenini bilmeme rağmen bu kodun varlığı hata oluşmasına ve uygulamanın ölmesine-çökmesine neden oluyor. Bu yüzden hatasız bir ilerleme için döngü içinde bu kodu kullanmayacağız…

QThread’ın msleep() methodu ile milisaniye olarak döngü arasında bekletme yaparak ilerleme çubuğunun hareket etmesini izleme fırsatı yakalayabilirsiniz, ama %99 ihtimal ile çökme yaşayacaksınız. Bu sorunu ortadan kaldırmak için kendi sinyalimizi oluşturacağız(PyQt ye yabancıysanız konuyu bile okumayın bence ;) ). Ve sinyalimizin bir değeri yaymasını sağlayacağız. Dialog sınıfında yazacağımız kod ile bu sinyali yakalayıp taşıdığı değeri QProgressBar’a aktaracağız. Bunu radyo sinyalini yakalayıp sesi duymaya benzetebiliriz…

import sys
from PyQt4.QtGui import QDialog, QApplication, QProgressBar
from PyQt4.QtCore import QThread, SIGNAL

class Thread(QThread):
    def __init__(self, parent):
        QThread.__init__(self, parent)
        self.parent = parent
        self.sayac = 0

    def run(self):
        while self.sayac<1000000:
            self.emit(SIGNAL("setValue(int)"), self.sayac)
            self.sayac += 1

class Dialog(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.resize(400,250)
        self.progress = QProgressBar(self)
        self.progress.setGeometry(100,75,200,25)
        self.progress.setProperty("value", 0)
        self.progress.setMaximum(10000)
        self.thread = Thread(self)
        self.thread.start()

        self.connect(self.thread, SIGNAL("setValue(int)"), self.progress.setValue)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    gui = Dialog()
    gui.show()
    sys.exit(app.exec_())

Thread sınıfımızda yukarıda söylediğimiz kodu çıkardık ve QThread’ın emit() methodunu kullandık. İlk parametreye SIGNAL() i kullanarak yayılacak sinyalin adını belirledik ve son parametreye ise yayılacak bilgiyi girdik. Biz burada tek bilgi yaymasını sağladık, ama bunu çoğaltabilirsiniz…

Dialog sınımızda self.thread.start() kod parçasıyla sürecimizi başlattık ve sinyay yaymaya başladık. QDialog’ sınıfının connect() methodu ile bu işlemi gerçekleştirdik. İlk parametreye hangi nesnenin sinyalini dinleyeceğimizi yazdık; ikinci parametrede ise hangi sinyali dinleyeceğimizi; son parametremizde ise sinyalin taşıdığı bilgiyi nereye aktaracağımızı yazdık. setValue() methodu tek parametre aldığına göre ve “setValue(int)” sinyali tek bilgi taşıdığına göre taşınan bilgi QProgressBar’ aktarılmış oldu ve sorunsuz bir şekilde ilerleme çubuğunun ilerleyişini görme imkanımız doğdu.

Ek olarak sinyal ismine bakıpta fonksiyon ismi gibi bir isim vermek, kaç bilgi taşıyacaksa o kadar argüman yazmak(“setValue(int1, int2, intN)” gibi…) gibi bir zorunluluk varmış sanmayın. Bu şekilde sinyalimiz hem anlaşılır, hemde şık durmuş oluyor…

PyQt ile ilgili sorularınıza ileri düzey olmadığı sürece yanıtlamaya çalışabilirim…

Yazım hatası varsa bildiriniz.
Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. Virux – GNU/Linux için bir antivirüs yazılımı :P
26
Ağu

Uzun uğraşlar sonucunda yeni sürümü yayınlamaktan mutluluk uyuyorum :) Bu sürümde Virux u platform bağımsız olarak sunuyorum… Bu sürümle gelen yenilikler ise şöyle:

* Yeni bir dialog eklendi.
* Sistem menüsüne Kapat ve Açılışta başlat seçeneği eklendi.
* Bu ayarların kaydedilmesi için QSettings sınıfı kullanıldı.
* Dialogların Escape tuşuyla kapanması önlendi. Bu yüzden uygulama kapanıyordu.

En son maddeyle beraber PyQt bilen arkadaşların katkı sağlamasında gerekli şartlara bir yenisi daha eklenmiş oldu.

Her QDialog’u genişleten sınıfınızda bu şekilde bir method tanımlanması gerekmektedir.

def keyPressEvent(self, event):
    if event.key() == Qt.Key_Escape:
        pass

Qt.Key_Escape i kullanabilmek için QtCore modülünde bulunan Qt’yi import etmeniz gerekmektedir…

Unutmayın QDialog’u miras alan sınıfınızın adı DMessage olmalıdır; Python dosyasının adı önemli değildir…

Yeni sürüme buradan ulaşabilirsiniz. Yalnız Windows kullanıcıları için derlenmiş halini veremiyorum. Çünkü derlemeden sonra bir takım hatalar oluşuyor.

Windows sisteminizde Python ve PyQt kurulu ise virux.py dosyasını virux.pyw yaparak çalıştırınız ki; açılışta çalıştır seçeneğini aktif yapınca işletim sisteminiz açılınca konsol çıkmasın…

Dialog olarak katkı sağlamak isterseniz belirtilen kurallara uyarak yazdığınız kodları iletişim sayfasından ya da bu yazıya yorum yazarak ulaştırabilirsiniz. Python dosyanıza __author__ değişkeni tanımlayıp isminizi yazmanız da katkıyı yapanın kim olduğunu belirtecektir…

Yazım hatası varsa bildiriniz.
Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. Virux – GNU/Linux için bir antivirüs yazılımı :P
23
Ağu
Sumru, (bilmeyenler için kısaca özetlersek) Özgürlük İçin Ajans bölümü için yazılmış, basit bir PyQt4 uygulamasıdır. Bu sürüme eklenen özellikler şöyle;
  • Yorumlar Öİ Kullanıcı resmi ile birlikte gösterilebiliyor
  • İndirme işlemine durum çubuğu eklendi
  • Arayüzde iyileştirmeler yapıldı.
Daha fazla bilgi: http://code.google.com/p/sumru/

    19
    Ağu

    Virux adında çok önceleri acemice bir betik yazmıştım. O günlerde bir kaç kişi bunu geliştirmemi söylemişler ve örnek sunmuşlardı…

    Son bir kaç ay önce bunun hatırlatılmasıyla daha güzel bir uygulama yazmaya karar verdim. Üzerine pek düşmedim ve ancak keyfim olursa kodladım ve nihayet kullanılabilir bir duruma geldi…

    Virux, aslında bir eğlence yazılımı. KNazar gibi bir süs olarak sistem çubuğunda duruyor ve hareketli bir ikona sahip. Ara sıra -şu an 4 adet olan- dialoglar ekrana çıkıyor ve biraz olsun gülümsetmeye çalışıyor…

    Yazılımın kodlarına buradan ulaşabilirsiniz. Son sürümü ise buradan indirebilirsiniz.

    Uygulama PyQt ile yapılmıştır. Sizde PyQt biliyorsanız dialog olarak katkı sağlayabilirsiniz.

    Dialoglarınızın kabul edilebilmesi için bazı şartları yerine getirmesi gerekmektedir.

    1. QDialog’u genişleten sınıfınızın adı DMessage olmalıdır. __init__ methodu ise aşağıdaki gibi olmalıdır.

    class DMessage(QDialog):
        def __init__(self, parent):
            QDialog.__init__(self, parent)
    

    2. Her dialog sınıfında closeEvent() methodu tanımlanmalı ve içeriği şöyle olmalıdır.

    def closeEvent(self, event):
        event.ignore()
        self.hide()
    

    Karşılanması gereken zorunlu şartlar bunlardır. Sınıfı tutan Python dosyasının adı önemli değildir(diğer Python dosyalarıyla çakışmamalıdır), DMessage den başka sınıf tanımlamak önemli değildir; Uygulama sadece DMessage sınıfını kullanacaktır.

    Yukarıdaki iki şartı sağlayarak yazdığınız kodları bu yazı altında yorum olarak yazabilir ya da iletişim sayfasından irtibat kurabilirsiniz… Kullandığınız cümleler ve kodun güzelliğine göre kodunuzun eklenme ihtimali artacaktır.

    Yazım hatası varsa bildiriniz.
    Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

    Benzer yazı yok.

    7
    Ağu
    PyQt4 'de uzak sunucudaki resimleri herhangi bir araç da göstermek için urllib2'den yararlanacağız. Tabi bunun dışında loadFromData özelliğini kullanacağız. İşte kodlar.

    import urllib2
    imageUrl = urllib2.urlopen("http://www.ozgurlukicin.com/media/img/ozgurlogo.png")
    imageData = imageUrl.read()
    imageUrl.close()
    image = QtGui.QPixmap()
    image.loadFromData(imageData)
    item = QtGui.QListWidgetItem(self.listWidget)
    item.setIcon(QtGui.QIcon(image))
    İlk önce görselimizin bulunduğu adresi okuttuk ve image.loadFromData() içerisinde kullandık. Ardından hangi Qt aracına ekleyecek isek ona görseli ekledik.

    Kaynak: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qpixmap.html#loadFromData
    31
    Tem
    Sumru, Özgürlük İçin Ajans bölümünü takip eden basit bir yazılımdır. Siteye eklenen ajansları bularak kendi listesine özet, sunucu ve uzunluk gibi bilgileri göstererek ekliyor ve mp3, ogg formatlarında indirebilmenizi ve dinleyebilmenize olanak verir. Şimdilik sadece siteye en son eklenen ajans ile dokuz tane en son ajans bölümlerini dinlemenize olanak veriyor. Programı işlev olarak gereksiz görebilirsiniz ama ajans için yazılmış bu program Özgürlük İçin'e değişik bir hava katıyor. :)

    İndirmek ve kurulum için proje sayfası: http://code.google.com/p/sumru/



    19
    Tem
    Yakın geçmiş zamanda Pindir'in kararlı sürümünü (sürüm 4.5.3'ü) indirme adresini proje sayfasına ve çeşitli internet adresleri ortamına ekledim. Ayrıca Pardus için depoya alınmasını da istedim. Bu kadar hatırlatma yeter sanırım.:) Başlıkta da belirttiğim gibi Pindir'e yeni bir özellik ekledim. Aslında bu özelliği en başından beri eklemek istiyordum fakat bir türlü başaramıyordum. Dün tekrar denedim ve olumlu sonuçlar elde ettim. Çoğu yerde de belirttiğim gibi Python ile hobi olarak ilgileniyorum. İyi, (orta derece bile) bilmediğimden bu kadar zaman aldı bu özellik. Lafı fazla uzatmadan söyleyeyim eklediğim özelliği. Artık Pindir YouTube'dan video araması yapabiliyor ve bulunan videoları indirebiliyor. Şimdilik yeni kodlandığından bir çok eksiği var. Henüz alfa aşamasındadır diyebiliriz. Video aramada şimdilik altı tane video buluyor ve bunları video başlıkları ve önizlemeleri ile listeye ekliyor. Yalnız şöyle saçma bir sorunum var; önizlemeleri sisteme indirterek kullanabiliyorum. Uzak sunucudan resim QListWidget'a nasıl eklenir bilemiyorum, bu yüzden şimdilik bu işlemi resimleri indirerek çözdüm. Dediğim gibi henüz çok eksiği var. Biraz daha geliştirdikten sonra indirme adreslerini vereceğim.
    Yardım etmek isteyen olursa bana ulaşabilirse sevinirim.
    Şimdilik iki tane resmini vereyim.


    16
    Tem
    Pindir'in nihayet kararlı sürümü çıktı. Elimden geldiğince çabuk olmaya çalıştım. Ancak bu gün kodların hepsinin yazımını bitirdim ve yeni sürümü hazırladım. Elimden geldiğince test ettim. Hiç bir hata ile karşılaşmadım. Ama sizler hata ile karşılaşırsanız bana bildirirseniz düzeltmeye çalışırım.
     Bu sürüme eklenen yeni özellikler ise şöyle:
    • Video indirme sırasında, YouTube'dan video hakkında bilgileri alıyor
    • Otomatik olarak indirip, kuruyor. (Bu kısmı tam olarak deneyemedim.)
    • Program içerisine Pindir'i kaldırma aracını ekledim. Sisteminizden rahatlıkla kaldırabilirsiniz. Oluşturmuş olduğu dosyaları da temizliyor.
    • Simgeler yeniden çizildi, geliştirildi.
    • Yardımcı pencerelerin açılış, kapanış anlarına kaydırma efekti eklendi.
    İndirmek içinhttp://code.google.com/p/pindir/

      Çalışma Bağımlılıkları:  gdata.youtube, youtube-dl, ffmpeg, phonon, phonon-devel, python-qt-phonon
      Gdata için  http://code.google.com/p/gdata-python-client/downloads/ adresinden indirip kurmalısınız.






      14
      Haz
       Pindir'in geçen sürümünde (Beta) indirme işlemi ve dönüştürme işlemlerini test etmediğim için bu kodlar çalışmadan beta sürümünü vermişim. Haliyle bu sürümde bu sorunlar giderildi. Bu sürüme eklediğim yenilikler löyle:
      • Önizleme resmi eskisine göre daha büyük çözünürlükte Youtube'dan alınıyor.
      • Sürüm güncelleme (otomatik indiriyor ve kuruyor) eklendi fakat tam olarak çalışmıyor. Yeni sürümü indiriyor, arşivden çıkarıyor ama kuruluma geçemiyor şimdilik.
      • Yeni sürümde eklenen yenilikleri gösterebiliyor.
      • Tasarım biraz daha düzenlendi.
      • Videolar istenilen dizine indirilebiliyor ve dönüştürülebiliyor.(Tercihler penceresinden ayarlanılıyor)
      • Hata raporu göndermek için araç eklendi. (Yazım aşamasında)
      Hatalar:
      • Video dönüştürmede bazen bilgi penceresi kapanmayabiliyor ama video indirilmiş oluyor.
      • Videoyu .flv dışında indirme seçeneği seçildiğinde video oynatma listesine eklenmiyor.
      İndir:





        6
        Haz
        Başlıktan da anlaşıldığı gibi Pindir 4.0 sürümünün betasını paylaşacağım. Bir önceki yazımda 3.5 sürümünün çıkacağını bildirmiştim. Sürüm numarasını değiştirmemde ki sebep Pindir'e eklenen özellikler ciddi anlamda önemli olduğu için versiyon 3. sürüm numaralarını kullanmamasının daha doğru olacağını düşündüm. Bu yüzden direk olarak 4. sürümlü versiyonlar üzerinden sürüm numaralandırmaya devam edeceğim.
        Bu arada artık Pindir'in yeni bir logosu var. Arşiv dosyasında da biri eski logosu olmak üzere toplam üç tane logo bulunmakta. Aşağıdaki logoda bunlardan biri. Programda aşağıdaki logoyu kullandım.
        Eklenen özellikleri bir önceki yazımda belirtmiştim. Önceki yazımı okumayanlar için tekrar yazmakta fayda var.

        • Çok fazla seçenek olmamasına rağmen biçim dönüştürme bölümünde video çözünürlüğü seçme aracı eklendi.
        • Aynı anda birden fazla video indirme işlemi yapılmakla birlikte video indirme sırasında aynı zamanda videonuzun biçimini de değiştirebilirsiniz.
        • Video URL'sini yapıştırdığınızda hemen sağ taraftaki düğme ile videonuzu internet üzerinden Pindir programı içerisinden izleyebilirsiniz. "Geri Dön" düğmesi ile de ana pencereye dönebilirsiniz. Bu özellikte tam ekran izleme olanağı da bulunmaktadır.
        Ekleyeceğim diğer bir özellikte video indirme sırasında ortaya çıkan bilgilendirici pencerede indirilen videonun önizlemesini gösteren bir resim koymayı düşünüyorum.

        Başlıkta da bildirdiğim gibi bu sürüm Beta olduğu için kodlanmamış eksik kısımlar ve çeşitli sorunlar, hatalar var. Sizden ricam kullandığınız sırada oluşan hataları geri bildirmeniz.


        Kodları incelemek isterseniz: https://pindir.googlecode.com/svn/trunk/




        1
        Haz
        Pindir uygulamasını fırsat buldukça geliştirmeye devam ediyorum. Hobi olarak başladığım programlamaya biraz ara versem de bildiklerimi unutmamak için uygulamalarıma değişik özellikler ekliyorum.
        Pindir uygulamasınada ki yenilikler, özellikler şöyle:

        • Arayüz iyileştirildi,
        • 1.0 sürümünde ki gibi çözünürlük değiştirme özelliği eklendi. 
        • İndirme veya biçim dönüştürme işlemleri sırasında Pardus Paket yöneticisinde ki gibi Pindir 'de basit bir bilgilendirici pencere kaplıyor. Resimde de belli olduğu gibi basit bir pencere :)
        • Eklenen bir diğer özellikte indirme işlemi yapılırken aynı anda bir dosyayı başka bir biçime çevirme veya yeni video indirme.
        • Video adresini yazdıktan sonra ekrana eklenen İndirmeden İzle düğmesi ile videoyu program içinden izleyebilme de eklendi.
        • Video izlerken youtube oynatıcı kullanıldığından tam ekran modu çalışıyor.
        Şimdilik bunları yaptım. Eksik kalan yerleri inşallah kısa bir süre içerisinde tamamlayıp 3.5 sürümünü kullanıma vereceğim.
        Edit: Yazı sonradan güncellendi.



        2
        Mar

        Bildiğiniz gibi form/widget tasarımlarınızı qt designer üstünde yapıp bir ui dosyası elde edebiliyorsunuz. Bu ui dosyasını da “pyuic4 uidosyası.ui -o pydosyası.py” gibi bir komutla python dosyasına çevirebiliyorsunuz. Fakat her düzenleme yaptığınızda bunu py dosyasına dönüştürmek tam bir çile. Bunun için uic modülünü kullanabilirsiniz. Bunun sayesinde ui dosyalarını çevirmeye gerek kalmadan direkt olarak kullanabiliyoruz. Hemen bir örneğe göz atalım:

        from PyQt4 import QtGui, QtCore, uic # gerekli modüller
         
        class form(QtGui.QMainWindow):
            def __init__(self, parent=None):
                QtGui.QMainWindow.__init__(self)
                uic.loadUi("ui/form.ui", self) #ui klasörünün içindeki form.ui dosyasını yüklettirdik.

        Form üzerindeki bir forma self.button olarak ulaşabilirsiniz. “self.” olmasının sebebi ikinci paranametreye self dememiz.

        self.ui = uic.loadUi("ui/form.ui")

        Bu şekilde ise form üzerindeki butona self.ui.button şeklinde ulaşabilirsiniz.

        Acaba bu yöntemin performansı kötü etkiliyen bir yönü var mı, bilmiyorum. Ama siz program üzerindeki çalışmalarınızı bu şekilde yapıp sürüm çıkarmadan önce py dosyalarına çevirerek de kullanabilirsiniz.

        16
        Şub
        Pindir 3.0 sürümü çıktı!
        Dil: İngilizce. (Türkçe sürümü de olacak)
        Proje Sayfası
        Öİ:Gönüllü Çalışmalar: Pindir-3.0 Hazır!
        32 Bit paketini buradan, 64 Bit paketini buradan indirebilirsiniz.
        İnşa dosyalarına da buradan ulaşabilirsiniz.
        Image and video hosting by TinyPic

        Image and video hosting by TinyPic
        30
        Kas
        Aslano son sürat gelişmekte. Henüz kararlı değil. Ayrıca Alfa-1 sürümü tamamının sadece %30 'u sayılabilir. Çünkü daha kodlanması ve yapılması gereken çok iş var.

        Alfa-1 sürümüne dahil edilen özellikler ise şöye:
        • Dinlediğimiz parça bitince sonraki parçayı çalma
        • Bir şarkıyı sonsuza kadar tekrarlama
        • Genel bildirimler ve seçenekler durum çubuğuna alındı
        • Görsellik en iyi düzeye getirildi
        • Video indirme ve dönüştürme ana pencereye gömüldü
        • Video ekranına ve oynatma listesi için sağ tık menüsü eklendi
        • Bilgi edin aracı geliştirildi.
        Aklıma gelen genel özellikler bunlar. aslano 'ya proje sayfasından ulaşabilirsiniz.

        http://code.google.com/p/aslano/

        7
        Kas
            PyQt ile ilgili olarak Qt kodunun etkileşimli olarak kodlanabileceğini öğrendim. Qt'de yeni bir şeyler öğrenirken çok işe yarayabilecek bir özellik. Şöyle ki konsoldan python yazarak Python yorumlayıcısını açalım. div.example { padding: 5px; font-family: Courier; border: 1px dashed #cccccc; background-color: #eeeeff; margin-left: 5%; margin-right: 5%; }
            Şimdi basit bir pencere yaratalım(kodun kopyalanabilmesi için >>> kullanılmadı):
        PyQt4.QtCore import *
        from PyQt4.QtGui import *
        app = QApplication([])
        window = QWidget()
        window.resize(400, 300)
        window.show()
          
            Şöyle pencere göreceksiniz:
            Hadi bir buton ekleyelim:
        button = QPushButton("Tikla!", window)
        button.show()
          
            İşte interaktif şekilde butonumuzu ekledik:
            Şimdi de butonumuzu pencerenin ortasına alalım:

        layout = QHBoxLayout(window)
        layout.addWidget(button)

            Şimdi addStretch() özelliğinin görünüme etkisine bakalım:
        layout.addStretch()


            Ve kolaylıkla butonumuzun tıklanma(clicked) özelliğine bir slot bağlayabiliriz(ifade biraz karışık oldu :| ):

        def mySlot():
            print "Buton Tiklandi"
        button.clicked.connect(mySlot)

            Görüldüğü üzere Qt'yi denemek için iyi bir yöntem.

        Kaynak:http://pysnippet.blogspot.com/2010/11/getting-interactive-with-pyqt.html