8 Ağustos 2014 Cuma

PyQt Birbiriyle Bağımlı Parçacıklar

       Grafiksel kullanıcı arayüzüne sahip programlarda; kullanıcı tarafından fare tıklanması, klavyeden bir tuşa basılması gibi durumlar program tarafından dinlenilerek parçacıklarla ilgili tepkilerde belirli sinyaller için belirlediğimiz metotları çağırıyorduk. Biz bu oluşan sinyalleri bir başka parçacığa ait herhangi bir özellikle ilişkilendirebiliriz. Bu durumda ilk parçacıktaki değişim diğerinde de bir etki oluşturacaktır. Üstüne bir de ikinci parçacık için oluşacak bir sinyali de ilk parçacığın bir özelliğine bağlarsak, bu parçacıklar birbirlerini etkiler duruma gelecektir.

       Şöyle bir örnek ile açıklamaya devam edeyim. Örneğin ses seviyesini belirlediğimizi düşünelim. Seviye belirlediğimiz bir parçacıkla (QSlider) aynı seçimi sayıyla gösterir halde seçmemizi sağlayan bir döner kutu (QSpinBox) olabilir. Bu durumda ikisi de aynı değer üzerinde değişiklik yapmamızı sağlamaktadır. Bunun için bu parçacıkların birindeki değişim diğerini de değiştirmelidir.
       Bizim bu iki parçacığın aynı özelliklerini ortak bir değer için birbiriyle ilişkilendirebilmemiz için her iki parçacıkta da bu özelliklerin mevcut olması gerekir. Bizim burada QSlider ile QSpinBox parçacıklarını ilişkilendirmemizi sağlayan, ikisinin de valueChanged(int) sinyali ile setValue() metoduna sahip olmalarıdır. Parçacıklar ilişkilendirilirken bu duruma dikkat edilmelidir.

Yapacağımız örneğe şöyle bir görsellik daha katalım; biri yatay biri dikey iki tane QSlider ve bir tane QSpinBox kullanalım. Ve bu üç parçacıktan herhangi birinin valueChange(int) sinyalini diğerlerinin setValue() özelliklerine bağlayalım.
Kodlarımız şu şekilde:
# !/usr/bin/env python
# -*- coding: cp1254 -*-

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class BirbiriyleBagimliParcaciklar(QDialog):
    def __init__(self, parent=None):
        super(BirbiriyleBagimliParcaciklar, self).__init__(parent)

        yataySlider = QSlider()
        yataySlider.setRange(0, 10)
        yataySlider.setOrientation(Qt.Horizontal) #Slider'ın yatay olması için

        dikeySlider = QSlider()
        dikeySlider.setRange(0, 10)
        dikeySlider.setOrientation(Qt.Vertical) #Slider'ın dikey olması için

        dKutu = QSpinBox()
        dKutu.setRange(0, 10)

        self.connect(dikeySlider, SIGNAL('valueChanged(int)'), yataySlider.setValue)
        self.connect(yataySlider, SIGNAL('valueChanged(int)'), dKutu.setValue)
        self.connect(dKutu, SIGNAL('valueChanged(int)'), dikeySlider.setValue)
        
        grid = QGridLayout()
        grid.addWidget(dikeySlider, 0, 0, 2, 1)
        grid.addWidget(yataySlider, 0, 1)
        grid.addWidget(dKutu, 1, 1)


        self.setLayout(grid)
        self.setFixedSize(300, 150)
        self.setWindowTitle('PyQt QSlider & QSpinBox')

uygulama = QApplication([])
pencere = BirbiriyleBagimliParcaciklar()
pencere.show()
uygulama.exec_()

Programımızı çalıştırdığımızda karşımıza şu şekilde bir pencere gelecektir.
Burada parçacıklar üzerinde herhangi bir değişiklik yaptığımızda diğer parçacıkların değiştiğini de göreceksiniz. Şimdi de koddaki  bir kaç noktaya değinelim.
13-17. Satırlar = Bu iki satırda yorumda da belirttiğimiz gibi Slider'ımızın yatay konumda mı yoksa dikey konumda mı olması gerektiğini belirtiyoruz. Bu satırı yazmazsak varsayılan olarak dikey konumlandırılıyor.
22-23-24. Satırlar = Bu satırlarda üç parçacığa ait sinyaller birbirlerini etkileyecek şekilde birbirlerine bağlanmışlardır. Halka gibi düşünülebilir. Böylelikle bir tanesinde oluşan değer değişikliği sonucu o değer diğer parçacıklara gönderilmektedir.


Kaynaklar:
-Mustafa Başer - Python Kitabı

0 yorum :

Yorum Gönder