30 Eylül 2018 Pazar

OpenCV (C++) Kütüphanesinin Windows'a Kurulumu ve Qt ile Kullanılması

OpenCV (C++) Kütüphanesinin (Extra Modülü - Contrib ile) Windows'a Kurulumu ve Qt ile Kullanılması


OpenCV (Open Source Computer Vision Library) açık kaynak kodlu Bilgisayarla Görme kütüphanesidir. Hem akademik hem de ticari amaç için kullanımı ücretsizdir. C++, Python ve Java programlama dilleriyle Windows, Linux, Mac OS, iOS ve Android işletim sistemlerinde kullanılabilmektedir. OpenCV ile görüntü işleme (image processing), makine öğrenmesi (machine learning), bilgisayarla görme (computer vision), derin öğrenme (deep learning) alanlarında algoritma, uygulama geliştirebilirsiniz. Bunun için OpenCV size çok sayıda algoritmayı fonksiyon şeklinde kullanmanızı sağlayan imkanlar sunmaktadır. Yapmanız gereken tek şey dökümanlardan ilgili fonksiyonun aldığı parametre ve girdileri doğru vererek sonuçlarını doğru bir şekilde almak. Burada OpenCV'nin C++ programlama dili ile kullanılması için yapılması gereken derleme işlemi (kurulum) gerçekleştirilecektir ve Qt ile kullanımından bahsedilecektir. Derleme için Cmake programından faydalanılacaktır ve Qt kurulumu ile birlikte gelen MinGW derleyicisi derleme işleminde kullanılacaktır. Windows'a Qt kurulumu için önceki yazımı inceleyebilirsiniz. Ayrıca bu kurulum (derleme) esnasında OpenCV'nin extra modülü olarak anılan contrib modülü de derleme işlemine dahil edilecektir. OpenCV contrib içerisinde yer alan modüllere buradan bakabilirsiniz.


Adım 1.
OpenCV kütüphanesinin sitesinde ki releases sayfasından istediğiniz versiyonunun "Sources" linkinde yer alan kaynak kodlarını indiriniz. Bu sayfada windows için derlenmiş (Win pack) paket de olmasına rağmen bilgisayarınızda bir takım uyumsuzluktan kaynaklanan problemlerle karşılaşmamak için kaynak kodlarını kullanarak bilgisayarımızla tam uyumlu olması için derleme işlemini kendimiz gerçekleştireceğiz. (Bu kurulum için OpenCV 3.4.3 versiyonu kullanılacaktır, aşağıdaki ekran görüntüsünden de göreceğiniz gibi aslında son versiyon olarak 4.0.0-alpha çıkmış bulunmaktadır ancak son çıkan versiyonlarda bir takım hatalar çıkmaktadır bu hatalar zamanla düzeltilerek daha kararlı bir hale geldikten sonra kullanılmasını tavsiye ederim.)


Adım 2.
İndirilen sıkıştırılmış dosya (opencv-3.4.3.zip) çıkarılır. opencv-3.4.3 klasörü içerisinde "source" ve "build" adında 2 yeni boş klasörler oluşturulur ve opencv-3.4.3 klasörü içerisinde yer alan diğer tüm dosyalar "source" klasörü içerisine taşınır.






Adım 3.
OpenCV ekstra modüllerinin yer aldığı Contrib dosyası github sayfasından indirilir. Burada dikkat etmeniz gereken nokta kurulumunu yapacağınız OpenCV versiyonuyla aynı versiyondaki contrib dosyasını indirmek olacaktır. Burada OpenCV-3.4.3 kurulumu yapacağımız için opencv_contrib-3.4.3 klasörü indirildi ve sıkıştırılmış dosya çıkartıldı.



Adım 4.1.
Kurulum için cmake-gui'den faydalanacağız. Öncelikle sitesinden işletim sisteminizin 32 bit ya da 64 bit olmasına göre .zip uzantılı cmake dosyası indirilir.


Adım 4.2.
İndirilen sıkıştırılmış dosya (cmake-3.12.2-win64-x64.zip) çıkarılır.


Adım 4.3.
Çıkartılan klasör içerisinde bulunan "bin" klasörünün içerisinde yer alan "cmake-gui.exe" çift tıklanarak açılır.


Adım 5.
Ortam değişkenleri içerisinde yer alan "Path" değişkenine "cmake" ve Qt kurulumu ile birlikte gelen ve derleme için kullanacağımız "MinGW" derleyicisinin bulunduğu yollar tanımlanır.





Adım 6.

  • "Where is the source code:" yazan bölümde opencv-3.4.3 klasöründe oluşturduğumuz "source" klasörü "Browse Source ..." butonuna basılarak seçilir.
  • "Where to build the binaries:" yazan bölümde opencv-3.4.3 klasöründe oluşturduğumuz "build" klasörü "Browse Build ..." butonuna basılarak seçilir.

ve aşağıda yer alan "Configure" butonuna basılır.


Adım 7.
(1. yol)

"Configure" butonuna bastıktan sonra yeni bir pencere açılacaktır. Bu pencerede derleme işlemi için kullanılacak derleyicinin seçilmesi istenmektedir. Ben daha önce bilgisayarıma Qt'nin MinGW derleyicisi ile kurulumunu yaptığım için burada yine tanımlı yerel (default native compiler) MinGW derleyicisini seçiyorum. Windows'a Qt Kurulumu için yazımı buradan inceleyebilirsiniz.


(2.yol)
"Specify native compilers" seçeneği ile yerel derleyicilerinizi kendiniz belirleyebilirsiniz. Burada eğer Qt kurulumu yaptıysanız " Qt > Qt5.11.1 > Tools > mingw530_32 > bin " klasöründe yer alan gcc.exe C derleyicisi olarak g++.exe C++ derleyicisi olarak seçilebilir.



Adım 8.1.
Derleyiciyi seçtikten sonra konfigürasyon işlemi başlayacaktır. "Configuration done" mesajını görene kadar bekleyiniz. Konfigurasyon işlemi sırasında OpenCV kütüphanesi ile kullanılabilecek diğer araçların bilgisayarınızda kurulu olup olmadığına bakılır ve sonunda size bunlar hakkında bilgiler verir. Bu kısım aslında çok detaylı bilgiler içermektedir ve hepsini tek tek açıklamak mümkün değildir. Şu an konfigurasyona dahil edilmeyen ancak ileride OpenCV'nin bir modülünü kullanmak istediğinizde bir takım eksik araçlardan kaynaklanan hatalar aldıkça hangi araçlara nerede ne zaman ihtiyaç duyacağınızı daha iyi anlayacaksınız. Biz burada Qt ile kullanmak istediğimizden WITH_QT özelliğini aktif duruma getiriyoruz.


Adım 8.2.
OpenCV'nin extra modüllerini (opencv contrib) yüklemek için OPENCV_EXTRA_MODULES_PATH özelliğinde indirmiş olduğumuz opencv_contrib-3.4.3 klasörü içerisinde yer alan modules klasörünün yolu tanımlanır.


Adım 8.3.
Derleme işleminde (‘nullptr’ was not declared in this scope..) hatası almamak için ENABLE_CXX11 aktif duruma getirilir.


Adım 8.4.
Derleme esnasında (... windres.exe: unknown option -- W ...) hatası almamak için ENABLE_PRECOMPILED_HEADERS özelliği kapatılır.


Adım 8.5.
Derleme sırasında (modules\videoio\src\cap_msmf.cpp) ile ilgili hata almamak için WITH_MSMF özelliği kapatılır.


Adım 8.6.
Derleme yapılırken (opencv/source/modules/videoio/src/cap_dshow.cpp dosyasında sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared in this scope ) hatası almamak için ../opencv-3.4.3/source/modules/videoio/src/cap_dshow.cpp dosyasında #include "DShow.h" satırından önce #define NO_DSHOW_STRSAFE satırı eklenir.



Adım 8.7.
Eğer tüm OpenCV modüllerini tek bir kütüphane şeklinde kullanmak istiyorsanız BUILD_opencv_world özelliğini seçmelisiniz. Bunun hem artısı hem de eksisi vardır. Avantajı tek tek her bir modülü eklemek yerine sadece tek bir modülü eklemenin daha kolay olmasıdır. Ancak kullanılmayacak olan bir çok modül koda eklenmiş olur hem de tüm modüller bir arada olduğu için dosya boyutu yüksektir. Derleme esnasında hata alma ihtimalini arttırdığı için ben bu özelliği kullanmayacağım. Şimdilik bu seçimler basit bir kurulum için yeterli. Siz ihtiyaç duyduğunuz araçları yükleyip ekleyip çıkarmakta özgürsünüz. Dediğim gibi bu ihtiyaçlar OpenCV kütüphanesini kullandıkça ortaya çıkacaktır. Bende bundan sonraki yazılarımda ihtiyaç duyduğum durumlarda bu konfigurasyonlarda yapılması gereken değişiklikleri belirtmeyi düşünüyorum.
Tüm bu işlemlerden sonra "Configure" butonuna birkez daha basılır "Configuring done" mesajını gördükten sonra "Generate" butonuna basılır.


Not.
Derleme esnasında hata almamak için Adım 5'te belirtildiği gibi ortam değişkenlerine gerekli tanımlamaları eksiksiz yapmış olmanız gerekmektedir. Yoksa Qt'nin nerede kurulu olduğunu Cmake bulamaz ve hata verir. Qt path tanımlamaları aşağıdaki örnekte verildiği gibi otomatik bulunacaktır.


Adım 9.
Komut satır programı (cmd, terminal) açılır ve derleme işleminin gerçekleştirildiği "build" klasörüne geçilir.


mingw32-make


komutu çalıştırılır. Bu komutu hızlı derleme için mingw32-make -j4 formatında da yazabilirsiniz. Burada "-j4" ifadesiyle derleme esnasında bilgisayarın 4 çekirdeğininde kullanılması gerektiği belirtilir. Kullanılacak çekirdek sayısını arttırıp azaltabilirsiniz. Ancak bu şekilde birden fazla çekirdek kullanılarak derleme yapıldığında hata alınabilmektedir. Benim tavsiyem tek çekirdek ile derleme işlemini yapmanız.



Adım 10.
Hiç hata almadan 100% derleme işlemi başarılı bir şekilde yapıldıysa aşağıdaki komut çalıştırılır.


mingw32-make install




Bu aşamayla birlikte kurulumun başarılı bir şekilde yapılıp yapılmadığını anlamak için ../opencv-3.4.3/build/install/include klasörü kontrol edilir. Aşağıdaki ekran görüntülerinde gösterildiği gibi opencv2 klasörü içerisinde opencv modüllerini görmemiz gerekir.


Adım 11.
Bu aşamada OpenCV'nin Qt ile kullanılmasından bahsedilecektir. ../opencv-3.4.3/build/install/x86/mingw/bin klasöründe ".dll" uzantılı derlenen opencv kütüphanelerinin Qt'de tanımlanması gerekmektedir. OpenCV'nin ekstra kütüphanelerini de derleme esnasında kullandığımızdan derlenen kütüphane sayısı bir hayli fazladır. Qt'de OpenCV kütüphanesini kullanmamız için 2 farklı yöntem mevcuttur.


(1.yol)
Qt açılır sonra (.pro uzantılı) proje dosyası açılır ve aşağıda belirtildiği gibi OpenCV kütüphaneleri eklenir. Qt proje dosyasında (.pro) '\' simgesi bir alt satırdan devam et anlamında kullanılır. Klasör yolu tanımlanırken ya '/' simgesi ya da '\\' simgesi kullanılır. Ayrıca Qt proje dosyasında (.pro) kütüphane tanımlanırken -L(kütüphane yolu), -l(kütüphane) şeklinde önekleri kullanılmaktadır.

INCLUDEPATH += C:\\Users\\Eyyup\\Downloads\\opencv-3.4.3\\build\\install\\include \
LIBS += -L"C:\\Users\\Eyyup\\Downloads\\opencv-3.4.3\\build\\install\\x86\\mingw\\bin" \
libopencv_aruco343 \
libopencv_bgsegm343 \
libopencv_bioinspired343 \
libopencv_calib3d343 \
libopencv_ccalib343 \
libopencv_core343 \
libopencv_cvv343 \
libopencv_datasets343 \
libopencv_dnn_objdetect343 \
libopencv_dnn343 \
libopencv_dpm343 \
libopencv_face343 \
libopencv_features2d343 \
libopencv_flann343 \
libopencv_fuzzy343 \
libopencv_hfs343 \
libopencv_highgui343 \
libopencv_img_hash343 \
libopencv_imgcodecs343 \
libopencv_imgproc343 \
libopencv_line_descriptor343 \
libopencv_ml343 \
libopencv_objdetect343 \
libopencv_optflow343 \
libopencv_phase_unwrapping343 \
libopencv_photo343 \
libopencv_plot343 \
libopencv_reg343 \
libopencv_rgbd343 \
libopencv_saliency343 \
libopencv_shape343 \
libopencv_stereo343 \
libopencv_stitching343 \
libopencv_structured_light343 \
libopencv_superres343 \
libopencv_surface_matching343 \
libopencv_text343 \
libopencv_tracking343 \
libopencv_video343 \
libopencv_videoio343 \
libopencv_videostab343 \
libopencv_xfeatures2d343 \
libopencv_ximgproc343 \
libopencv_xobjdetect343 \
libopencv_xphoto343


(2.yol)
Yukarıda anlatılan yöntemle proje dosyasına OpenCV kütüphanesinin derlendiği klasör yolunu tanımladığınızı ve bu şekilde onlarca proje oluşturduğunuzu düşünün. Yeni bir OpenCV versiyonu çıktığında ya da klasörü farklı bir yere taşıdığınızda oluşturduğunuz onlarca projeyi tek tek açarak bu tanımlamaları düzeltmeniz gerekecektir. Bu sıkıntılı durumu yaşamamak için yukarıda yapılan tanımlar bir text dosyası açılarak buraya yazılır. Daha sonra ".txt" olan dosya uzantısı ".pri" olarak değiştirilir ve bu dosya aşağıda tanımlandığı gibi Qt proje dosyasına (.pro) eklenir.

include(C:\Users\Eyyup\Downloads\opencv-3.4.3\opencv_library_path.pri)





29 Eylül 2018 Cumartesi

Dlib (C++) Kütüphanesinin Windows'a Kurulumu ve Qt ile Kullanılması

Dlib (C++) Kütüphanesinin Windows'a Kurulumu ve Qt ile Kullanılması


Dlib, yapay öğrenme - makine öğrenmesi (machine learning) algoritmalarını içeren C++ kütüphanesidir ve günlük hayatımızda karşılaştığımız problemleri çözmek için kullanabileceğimiz kompleks yazılımlar geliştirebileceğimiz bir araçtır. Yüz tanıma (face recognition), yüz tespiti (face detection), yüz modelleme (facial landmarks) gibi uygulamaları Dlib kütüphanesi ile kolayca geliştirebilirsiniz. Dlib, C++ programlama dili ile kullanılan bir araç olmasının yanında Python programlama dili ile de kullanılabilmektedir. Python ile kullanmak için kurulumunuzu ona göre yapmanız gerekmektedir. Bu yazımda C++ dili için kurulum yapılacaktır ilerleyen günlerde Python dili için kurulumun nasıl yapıldığını anlatmayı planlıyorum. Aşağıdaki adımları takip ederek Windows işletim sisteminize Dlib kütüphanesinin kurulumunu yapabilir ve Qt ile uygulama geliştirebilirsiniz.


Adım 1. Dlib kütüphanesinin en son yayınlanan versiyonu sitesinden indirilir (Bu yazıda 19.16 versiyonu indirildi). Dlib, hızlı gelişim gösteren bir kütüphane olduğunda sürekli yeni versiyonları çıkmaktadır.



Adım 2. İndirilen sıkıştırılmış dosya (dlib-19.16.zip) çıkarılır.


Adım 3. dlib-19.16 klasörü içerisine "build" adında boş bir klasör oluşturulur.


Adım 4.1. Kurulum için cmake-gui'den faydalanacağız. Öncelikle sitesinden işletim sisteminizin 32 bit ya da 64 bit olmasına göre .zip uzantılı cmake dosyası indirilir.


Adım 4.2. İndirilen sıkıştırılmış dosya çıkarılır.


Adım 4.3. Çıkartılan klasör içerisinde bulunan "bin" klasörünün içerisinde yer alan "cmake-gui.exe" çift tıklanarak açılır.


Adım 5.

  • "Where is the source code:" yazan bölümde indirmiş olduğumuz dlib-19.16 klasöründe bulunan "dlib" klasörü "Browse Source ..." butonuna basılarak seçilir.
  • "Where to build the binaries:" yazan bölümde indirmiş olduğumuz dlib-19.16 klasöründe sonradan oluşturduğumuz "build" klasörü "Browse Build ..." butonuna basılarak seçilir.

ve aşağıda yer alan "Configure" butonuna basılır.


Adım 6.
(1. yol)
"Configure" butonuna bastıktan sonra yeni bir pencere açılacaktır. Bu pencerede derleme işlemi için kullanılacak derleyicinin seçilmesi istenmektedir. Ben daha önce bilgisayarıma Qt'nin MinGW derleyicisi ile kurulumunu yaptığım için burada yine tanımlı yerel (default native compiler) MinGW derleyicisini seçiyorum. Windows'a Qt Kurulumu için yazımı buradan inceleyebilirsiniz.


(2.yol) "Specify native compilers" seçeneği ile yerel derleyicilerinizi kendiniz belirleyebilirsiniz. Burada eğer Qt kurulumu yaptıysanız " Qt > Qt5.11.1 > Tools > mingw530_32 > bin " klasöründe yer alan gcc.exe C derleyicisi olarak g++.exe C++ derleyicisi olarak seçilebilir.



Adım 7. Derleyiciyi seçtikten sonra konfigürasyon işlemi başlayacaktır. "Configuration done" mesajını görene kadar bekleyiniz. Konfigurasyon işlemi sırasında Dlib kütüphanesi ile kullanılabilecek diğer araçların bilgisayarınızda kurulu olup olmadığına bakılır ve sonunda size bunlar hakkında bilgiler verir. Aşağıdaki ekran görüntüsünü inceleyecek olursak bilgisayarımda CUDA ve BLAS araçlarının kurulu olmadığını ve Dlib kütüphanesinin bu araçları kullanamayacağı belirtilmiş. Eğer CUDA kurulumunu önceden yapmış olsaydım Dlib kütüphanesini kullanarak geliştirdiğim algoritmayı GPU üzerinde çalıştırabilecektim. Buradan JPEG ve PNG formatlarındaki resimlerin Dlib ile kullanılabileceği gibi detaylı bilgilere ulaşmak mümkün. Ben sadece bir kaçından bahsettim siz detaylı inceleyebilirsiniz. Burada şimdilik bu konfigurasyonun yeterli olduğunu düşünerek "Generate" butonuna basıyoruz. "Generating done" mesajını gördüysek kuruluma başarılı bir şekilde devam ediyoruz demektir.



Adım 8. Komut satır programı (cmd, terminal) açılır ve derleme işleminin gerçekleştirildiği "build" klasörüne geçilir.


mingw32-make


komutu çalıştırılır. Bu komutu hızlı derleme için mingw32-make -j4 formatında da yazabilirsiniz. Burada "-j4" ifadesiyle derleme esnasında bilgisayarın 4 çekirdeğininde kullanılması gerektiği belirtilir. Kullanılacak çekirdek sayısını arttırıp azaltabilirsiniz. Ancak bu şekilde birden fazla çekirdek kullanılarak derleme yapıldığında hata alınabilmektedir. Benim tavsiyem tek çekirdek ile derleme işlemini yapmanız.



Adım 9. dlib-19.16 klasörü içerisinde "include" adında boş bir klasör oluşturuyoruz ve "dlib" klasörünü bu boş klasör içerisine taşıyoruz.



Adım 10. Sisteminize Qt kurulumu yaptıktan sonra Qt Creator açılır ve yeni proje oluşturulduktan sonra proje dosyasına (.pro uzantılı dosya) dlib kütüphanesinin derlendiği klasörün yolu aşağıdaki gibi tanımlanır.

Kurulum esnasında CUDA ve BLAS ile derleme yapılmadıysa sadece Dlib kütüphanesinin derlendiği klasörün yolunu tanımlamamız yeterlidir. CUDA ve BLAS ile derleme yapıldıysa Dlib kütüphanesinin derlendiği klasörün yolu ile CUDA ve BLAS kütüphanelerinin yolunu da tanımlamamız gerekmektedir.

INCLUDEPATH += C:\Users\Eyyup\Downloads\dlib-19.16\include
LIBS += -L"C:\Users\Eyyup\Downloads\dlib-19.16\build"
LIBS += -ldlib

Qt proje dosyasında (.pro) kütüphane tanımlanırken -L(kütüphane yolu), -l(kütüphane) şeklinde önekleri kullanılmaktadır.


(Kısa yol) Yukarıda anlatılan yöntemle proje dosyasına dlib kütüphanesinin derlendiği klasör yolunu tanımladığınızı ve bu şekilde onlarca proje oluşturduğunuzu düşünün. Yeni bir dlib versiyonu çıktığında ya da klasörü farklı bir yere taşıdığınızda oluşturduğunuz onlarca projeyi tek tek açarak bu tanımlamaları düzeltmeniz gerekecektir. Bu sıkıntılı durumu yaşamamak için yukarıda yapılan tanımlar bir text dosyası açılarak buraya yazılır. Daha sonra ".txt" olan dosya uzantısı ".pri" olarak değiştirilir ve bu dosya aşağıda tanımlandığı gibi Qt proje dosyasına (.pro) eklenir.

include(C:\Users\Eyyup\Downloads\dlib-19.16\dlib_library_path_19_16.pri)





2 Eylül 2018 Pazar

PySide2 ile Grafiksel Kullanıcı Arayüzü (GUI) Geliştirme

PySide2 ile Grafiksel Kullanıcı Arayüzü (GUI) Geliştirme


PySide2 hakkında detaylı açıklamaların yer aldığı ve PySide2 Kurulumunun anlatıldığı önceki yazımı aşağıdaki linkte bulabilirsiniz.

Qt for Python : PySide2 Kurulumu

Burada PySide2 ile ilk uygulamamızı geliştireceğiz. Daha önce PyQt5 ile geliştirmiş olduğumuz arayüzün aynısını geliştireceğiz.


1. Kod Yazarak Arayüz Geliştirme

Geliştireceğimiz arayüz aşağıdaki ekran görüntüsünde gösterilmiştir. Bu arayüz bir etiket (QLabel) iki tane düğmeden (QPushButton) oluşmaktadır. Etikette "Qt for Python" yazmaktadır. Temizle düğmesi ile etikette yazan yazı silinmektedir. Göster düğmesi ile etikete yeniden "Qt for Python" yazılmaktadır. Sinyal-slot yapısından PyQt5 ile ilk uygulamamızda bahsettiğimden burada bahsetme gereği duymadım. İsteyenler yukarıda linkini verdiğim PyQt5 ile arayüz geliştirme yazısını inceleyebilirler.


Bu arayüzü elde etmek için yazacağımız kod aşağıda belirtilmiştir.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import sys
from PySide2.QtCore import Qt
#from PySide2.QtWidgets import (QApplication, QWidget, QPushButton, QLabel, QVBoxLayout)
from PySide2.QtWidgets import*

class MyWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.label_text = QLabel("Qt for Python")
        self.label_text.setAlignment(Qt.AlignCenter)
        self.label_text.setStyleSheet("color: rgb(0,0,255);font-weight: bold; font-size: 16pt")

        pushButton_clear = QPushButton("Temizle")
        pushButton_clear.setMinimumHeight(40)
        pushButton_clear.setStyleSheet("font-weight: bold; font-size: 16pt")
        pushButton_show = QPushButton("Göster")
        pushButton_show.setMinimumHeight(40)
        pushButton_show.setStyleSheet("font-weight: bold; font-size: 16pt")

        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.label_text)
        vertical_layout.addWidget(pushButton_clear)
        vertical_layout.addWidget(pushButton_show)

        self.setLayout(vertical_layout)
        self.setWindowTitle("Qt for Python : PySide2")

        pushButton_clear.clicked.connect(self.clear_text)
        pushButton_show.clicked.connect(self.show_text)
        

    def clear_text(self):
        self.label_text.clear()

    def show_text(self):
        self.label_text.setText("Qt for Python")
        

if __name__ == "__main__":

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.resize(400, 300)
    widget.show()
    sys.exit(app.exec_())

Şimdi bu kodları adım adım açıklayalım.

1
2
3
4
import sys
from PySide2.QtCore import Qt
#from PySide2.QtWidgets import (QApplication, QWidget, QPushButton, QLabel, QVBoxLayout)
from PySide2.QtWidgets import*

1 nolu satırda sys modülü eklenir. 2 nolu satırda QtCore modülünden Qt 11 nolu satırda kullanmak için eklenir. 3 ve 4 nolu satırlar birbiri yerine kullanılabilir. İstersek 4 nolu satırda olduğu gibi QtWidgets modülüne ait tüm bileşenler kod içerisinde kullanmak için eklenir. İsterseniz 3 nolu satırda belirtildiği gibi sadece ihtiyaç duyulan bileşenleri kod içerisine ekleyebilirsiniz.

6
7
8
class MyWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)

6 nolu satırda QWidget sınıfından ürettiğimiz "MyWidget" adında sınıfı tanımlıyoruz. Burada QWidget yerine QDialog ya da QMainWindow tipinde bir sınıf oluşturabilirdik. Her sınıfın __init__() fonksiyonu vardır ve sınıf çağrıldığında ilk olarak bu fonksiyon çalıştırılır. self ifadesi bir sınıfta tanımlanan değişkenlerin, fonksiyonların sınıf dışından çağrılabilmesi için o sınıfa ait bir fonksiyon, değişken olduğunu belirtmek için kullanılır. C++ programlama dilinde kullanılan this ifadesi ile aynı kullanıma sahiptir. 7 nolu satırda sınıfımıza ait __init__() fonksiyonunu, 8 nolu satırda ise Miras aldığımız QWidget sınıfının __init__() fonksiyonunu tanımlıyoruz.

10
11
12
        self.label_text = QLabel("Qt for Python")
        self.label_text.setAlignment(Qt.AlignCenter)
        self.label_text.setStyleSheet("color: rgb(0,0,255);font-weight: bold; font-size: 16pt")

10 nolu satırda QLabel etiket parçacığı (widget) "Qt for Python" yazısını içerecek şekilde oluşturulur. Nesne adı (object name) "label_text" olarak tanımlanmıştır ve sınıf dışında (slot tanımlamalarında) bu etikete ulaşmamız gerekeceğinden bu parçacık self ifadesiyle tanımlanmıştır.
11 nolu satırda etiket içerisinde yazan yazının hizalaması ortalanmıştır. Bu hizalamayı setAlignment fonksiyonu sağlamaktadır.
12 nolu satırda etikette yazan yazının rengini, font büyüklüğünü ve font kalınlığını setStyleSheet fonksiyonunu CSS tanımlamaları kullanarak ayarlıyoruz.


14
15
16
17
18
19
        pushButton_clear = QPushButton("Temizle")
        pushButton_clear.setMinimumHeight(40)
        pushButton_clear.setStyleSheet("font-weight: bold; font-size: 16pt")
        pushButton_show = QPushButton("Göster")
        pushButton_show.setMinimumHeight(40)
        pushButton_show.setStyleSheet("font-weight: bold; font-size: 16pt")

14 nolu satırda üzerinde "Temizle" yazan QPushButton (buton, düğme, tuş) parçacığı tanımlıyoruz. Bu düğmenin minimum yüksekliğini 40 piksel olarak 15 nolu satırda setMinimumHeight fonksiyonunu kullanarak tanımlıyoruz.
16 nolu satırda daha önce etiket için yaptığımız gibi setStyleSheet fonksiyonunu kullanarak düğme üzerinde yazan yazının font özelliklerinde daha güzel görünmesini sağlayacak değişiklikler yapıyoruz. Bu düğmemizin adını "pushButton_clear" olarak tanımlıyoruz. Ben hangi parçacık olduğunu belirten (pushButton) ve ne işe yarayacağını belirten (temizle, clear) kelimeleri birleştirerek isimlendirme yapıyorum. Böylece kod içerisinde hangi tipte bir düğme olduğunu ve ne işe yaradığını anlamak kolay oluyor ve kodun anlaşılabilirliğini arttırıyor. Burada etiketten farklı olarak oluşturduğumuz düğmeyi self'e atamadık çünkü sınıf dışında ihtiyacımız olmayacak eğer ihtiyaç duyarsak self olarak tanımlamalıyız.
17, 18 ve 19 nolu satırlar önceki satırların 2. düğme olan "Göster" düğmesini oluşturmamıza ve aynı işlemleri onun üzerinde yapmamızı sağlamaktadır.


21
22
23
24
        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.label_text)
        vertical_layout.addWidget(pushButton_clear)
        vertical_layout.addWidget(pushButton_show)

21 nolu satırda dikey yerleşim düzeni ( QVBoxLayout ) tanımlıyoruz ve 22, 23, 24 nolu satırlarda addWidget fonksiyonunu kullanarak sırasıyla oluşturduğumuz etiket ve düğmeleri bu dikey yerleşim planı içerisine ekliyoruz. Tasarımınıza göre Yatay yerleşim düzeni ( QHBoxLayout ) veya ızgara yerleşim düzeni ( QGridLayout ) kullanabilirsiniz.

26
27
        self.setLayout(vertical_layout)
        self.setWindowTitle("Qt for Python : PySide2")

26 nolu satırda oluşturduğumuz dikey yerleşim düzenini sınıfımızın (oluşturacağımız arayüzün) yerleşim düzeni olmasını sağlamak için setLayout fonksiyonuyla tanımlıyoruz.
27 nolu satırda arayüzün gösterileceği pencerenin adının "Qt for Python : PySide2" olmasını setWindowTitle fonksiyonunu kullanarak sağlıyoruz.

29
30
        pushButton_clear.clicked.connect(self.clear_text)
        pushButton_show.clicked.connect(self.show_text)

29 ve 30 nolu satırlar, sinyaller ile fonksiyonları (slotları) birbirine connect metodunu kullanarak bağladığımız satırlardır. "Temizle" düğmesinin clicked sinyalini "clear_text" fonksiyonuyla birbirine bağladık ve "Temizle" düğmesine tıklandığında "clear_text" fonksiyonu çağrılacaktır. "Göster" düğmesinin clicked sinyalini de "show_text" fonksiyonuna bağladık. Kod yazarken türkçe karakter kullanamadığımızdan anlaşılabilir olması için ingilizce değişken ve fonksiyon adı kullanmayı tercih ediyorum.

33
34
    def clear_text(self):
        self.label_text.clear()

33 nolu satırda "Temizle" düğmesinin tıklama sinyaline bağlanan "clear_text()" slotunu (fonksiyonunu) tanımlıyoruz. Değişken olarak self değişkenini almaktadır. İşlem olarak QLabel sınıfının clear() fonksiyonu ile etiket içerisinde yazan yazı temizlenir.

36
37
    def show_text(self):
        self.label_text.setText("Qt for Python")

36 ve 37 nolu satırlarda "Göster" düğmesinin "show_text()" slotu tanımlanmaktadır. Bir etikete yazı yazmak için setText() fonksiyonu kullanılmaktadır ve bu düğmeye tıklandığında "Qt for Python" yazısı yazacaktır. Bu düğmenin yaptığı işi gözlemlemek için öncelikle etikette yazan yazı silinmelidir.


40
41
42
43
44
45
46
47
if __name__ == "__main__":

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.resize(400, 300)
    widget.show()
    sys.exit(app.exec_())

Sınıf ve slot tanımlamalarından sonra 42 nolu satırda QApplication sınıfından "app" adında bir nesne tanımlıyoruz. 44 nolu satırda "MyWidget" adında tanımladığımız sınıftan "widget" adında bir nesne oluşturuyoruz. 45 nolu satırda kodu çalıştırdığımızda ekrana gelecek pencerenin boyutlarını resize() fonksiyonu ile ayarlıyoruz. widget nesnesinin show() fonksiyonunu kullanarak arayüz için oluşturduğumuz pencereyi gösteriyoruz (46 nolu satır). 47 nolu satırda QApplication sınıfının exec_() fonksiyonu ile sonsuz bir döngü oluşturulur. Bu ifade ile kullanıcının arayüzü kullanarak fare ve klavye ile yapmış olduğu tüm işlemler yakalanarak komutlar yerine getirilir. Pencere kapatılana kadar döngü devam eder.
Böylece kod yazarak PySide2 ile kullanıcı arayüzü geliştirmiş olduk.

2. Qt Designer ile Arayüz Geliştirme

Kod yazarak geliştirmiş olduğumuz arayüzün aynısını Qt Designer ile de gerçekleştirebiliriz. Qt Designer'ı ..\Python37\Lib\site-packages\PySide2 klasöründe bulabilirsiniz. Yani Python kurulum dosyalarının yer aldığı ..\Lib\site-packages\PySide2 klasöründe. Qt Designer ile PySide2 kullanılarak arayüz geliştirmenin nasıl yapıldığını öğrenmek için aşağıdaki videoyu izleyebilirsiniz.


Designer ile yapmış olduğumuz tasarımı kullanabilmek için aşağıdaki kodlara ihtiyacımız var.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import sys
from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile

class MyWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        designer_file = QFile("example_widget.ui")
        designer_file.open(QFile.ReadOnly)

        loader = QUiLoader()
        self.ui = loader.load(designer_file, self)

        designer_file.close()

        self.ui.pushButton_clear.clicked.connect(self.clear_text)
        self.ui.pushButton_show.clicked.connect(self.show_text)

        self.setWindowTitle("Qt for Python : PySide2")


    def clear_text(self):
        self.ui.label_text.clear()


    def show_text(self):
        self.ui.label_text.setText("Qt for Python")


if __name__ == "__main__":

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.show()

    sys.exit(app.exec_())

Burada kod yazarak geliştirdiğimiz arayüzden farklı olarak yazılan kısımları açıklayalım. 3 ve 4 nolu satırlarda Designer tasarım dosyasını yüklemek için kullandığımız QUiLoader ve QFile modüllerini kodumuza ekliyoruz.
10 ve 11 nolu satırlarda tasarım dosyasını okuyoruz. 14 nolu satırda tasarımımızı 13 nolu satırda tanımlanan loader nesnesi ve load() fonksiyonunu kullanarak yüklüyoruz.
16 nolu satırda, self.ui 'ye atadığımız tasarım dosyasını kapatıyoruz. Kodun geriye kalan kısımları ilk bölümle aynı olduğu için ilk bölümdeki açıklamalara bakabilirsiniz.

Qt for Python : PySide2 Kurulumu

Qt for Python : PySide2 Kurulumu


Qt bir Grafiksel Kullanıcı Arayüzü (GKA, Graphical User Interface, GUI) geliştirme aracıdır. Qt'yi tercih etmemin sebebi hem kolay bir şekilde arayüz geliştirme imkanı sunması hem de birçok platformda (işletim sisteminde, Windows, Linux, Mac) kullanılabiliyor olması. Qt ile arayüz geliştirirken C++ Programlama dili kullanılmaktadır. Python programlama dilinin son yıllarda popülerliği giderek artmaktadır ve yapay zeka, veri bilimi gibi alanlarda en çok tercih edilen programlama dilidir. C++ programlama dili ile veri işlemek Python programlama diline göre biraz daha zordur. Bu sebeple arayüz geliştirme için mükemmel bir araç olan Qt'nin Python ile kullanılabiliyor olması benim açımdan çok önemli. Tkinter, Python için GUI tasarımında kullanılan bir araçtır ama genel olarak Tkinker hakkında olumsuz yorumlarla karşılaştım. Qt'nin Python ile kullanılması için Riverbank'ın geliştirdiği PyQt programı mevcuttur ama bu Qt'nin Resmi olarak desteklediği bir araç değildir. PyQt'nin kurulumu ve Uygulama geliştirmek için aşağıdaki bağlantıları kullanabilirsiniz.

Windows PyQt5 Kurulumu

PyQt5 ile Arayüz Geliştirme



Yakın zamanda Qt'nin resmi olarak desteklediği (Python için Qt) Qt for Python PySide2 kullanıcılara sunuldu. Bu yazımızda PySide2'nin hem Windows hem de Ubuntu 16.04 için kurulumunu gerçekleştireceğiz. Kurulum için 3 farklı yöntem mevcuttur:
  1. pip komutu ile PyPI ile
  2. Qt'nin sitesinden .whl uzantılı kurulum dosyası indirilerek
  3. Kaynak kodlarından derleme yapılarak

3 numaralı yöntem ile kurulum çok kolay değil bu sebeple tavsiye etmiyorum. Eğer kaynak kodlarından derleme yapacaksanız ilgili kaynak kodlarını 2 nolu yöntem için verilen linkte bulabilirsiniz. 2 numaralı yöntem için Qt sitesinde bulunan .whl uzantılı wheel kurulum dosyalarından işletim sisteminiz ve kullanacağınız Python versiyonuna göre bir seçim yapmanız gerekiyor. Linux için hem Python2 hem de Python3 için kurulum dosyası mevcuttur ancak Windows için sadece Python 3 için kurulum dosyası mevcuttur. Python wheel nedir ? Nasıl Kurulum Yapılır ? sorularının cevaplarını önceki yazımda bulabilirsiniz.


Biz burada 1 nolu yöntem ile yani pip komutu kullanarak kurulum yapacağız. PySide2 kurulumu yapabilmek için işletim sisteminizde Python daha önceden kurulmuş olmalıdır. Eğer işletim sisteminizde kurulu Python versiyonu yoksa Python Kurulumu için önceki yazımı takip edebilirsiniz. Dikkat etmeniz gereken bir diğer konuda PySide2 ile uyumlu bir Python versiyonuna sahip olmanızdır. Bu yazının yazıldığı tarih itibariyle geçerli PySide2 ile uyumlu Python versiyonlarını aşağıdaki ekran görüntüsünde ya da PyPI'dan kontrol edebilirsiniz.


Pip ile kurulum yapmak için aşağıdaki komut çalıştırılır.

pip install PySide2

1. Windows için PySide2 Kurulumu

Aşağıdaki video'yu izleyerek Windows için PySide2 kurulumunu gerçekleştirebilirsiniz. Hem de kurulumun başarılı olup olmadığını nasıl test edeceğinizi öğrenebilirsiniz.


2. Ubuntu için PySide2 Kurulumu

Aşağıdaki video'yu izleyerek Ubuntu için PySide2 kurulumunu gerçekleştirebilirsiniz. Hem de kurulumun başarılı olup olmadığını nasıl test edeceğinizi öğrenebilirsiniz. Sisteminizde birden fazla Python versiyonu kurulu ise kurulumun başarılı bir şekilde yapılabilmesi için pip ve pip3 komutlarının hangi Python versiyonu için kurulumu gerçekleştireceğini kontrol etmelisiniz. pip ve pip3 komutlarının kullanımı için önceki yazımı inceleyebilirsiniz. Ya da bu tür sıkıntılarla uğraşmamak için python'un farklı versiyonları için farklı sanal ortamlar kurabilirsiniz. Sanal ortam kurulumu ve kullanımı hakkında ilgi almak için aşağıda linkte verilen yazımı takip edebilirsiniz.
Python Sanal Ortam (virtualenv, virtualenvwrapper) Kurulumu/ Kullanımı


PySide2 ile kullanılabilen modüller, sınıflar, fonksiyonlar ve değişkenler hakkında detaylı bilgiye aşağıdaki bağlantılar aracılığıyla ulaşabilirsiniz.
https://wiki.qt.io/Qt_for_Python
https://doc.qt.io/qtforpython/index.html
https://doc-snapshots.qt.io/qtforpython/contents.html
https://doc-snapshots.qt.io/qtforpython/overviews/qthelp-framework.html#the-qt-help-framework