Qt Ve Python Maceralarım

Ramazan dolayısıyla bloguma çok fazla yazı giremediğimin farkındayım.Bi tam başlarda başladığım Arduino tutkusu ile birlikte yazdığım yazılar var.Arduino tutkum tabikide geçmedi hatta daha da arttı diyebilirim.Ancak aklımda olan Arduino ile kullanabileceğim gui programlamarın nasıl yapılacağıydı.Python bana tamamen yeten bir dil olduğu için direk onunla başladım yola.Önceden beri gorduğum ama beni hiç içine çekmeyen Gtk,PyQt,Tkinter hepsine baktım.Örnekleri bir bir inceledim,karşılaştırmaları okudum.Ve sonunda kesinlikle doğru karar verdiğime inandığım Qt macerasına başladım.Python ile yazdığım kodlara artık guzel bir grafik arayuzu oluşturabiliyorum.

PyQt Python

Oluşturuğum Gui'lere Python ile seri porttan Arduino ile haberleşmesini sağlayabiliyorum.Hatta Django kullanarak bu verileri web arayuzlu olarakta yayınlayabiliyorum.Kısacası tam anlamıyor bir Python 3lusu kurdum.Web,Gui,Konsol.Hepsinde Python'un parmağı var.

Aslında Python için gui arayışlarımın butun sebebi Arduino değildi.Çunku gerçekten bir zaman sonra sadece konsol uygulamaları yetmiyor.Biraz da goze hitap eden programlamar yazmak gerekiyor.Sonuçta şu anda bu satırları yazdığım webbrowser olan Firefox'ta bir grafik arayuzune sahip.Kullandığım masaustu ortamı Gnome'da bir grafik arayuzune sahip.Bu yuzden benimde bir yerden başlamam gerekiyordu.Aralarında yaptığım incelemelerde PyQt'ye karar kıldım.Ve bundan çok memnunum.Şu anda ufak çaplı uygulamalar yapıp kullanma alışkanlıklarımı arttırıyorum.

Yıllar once Delphi,Visual Basic hatta Yunus adında(tam bir dil olmasada programlama motoru ve çok eski) birçok gui tasarımına yarayan araçla,programlama diliyle uğraşan biri olarak Qt Designer'ın arayuzu beni korkutmadı.Hatta bir hayli hoşuma gitti.Hemen C#'ın .Net'i ile kafam kıyaslama yaptım.Ve farkettiğim kadarıyla eksiği yok fazlası var :D

İşte yaptığım ilk programın gui tasarımı.

Toplu Mail Sender Qt Tasarimi

Gui tasarımı yapmak bir hayli kolay ve hoş.Özellikle sinyal olayına baya bi hasta oldum.Sinyal moduna bastıktan ozellik atamak istediğinizi seçip uzatıyorsunuz.Ve istediğiniz yerde bırakıp ozellik seçiyorsunuz.

Yukarıdaki gibi gui tasarımını yaptıktan sonra pyuic4 kullanarak bu ui tasarımını python diline çeviriyoruz.Bunun için vermemiz gereken komut.

pyuic4 -x arayuz.ui -o arayuz.py

Şimdi ise bu arayuze istediğimiz python kodunu entegre ediyoruz.Ve işin eğlenceli kısmı burada bitiyor.Artık bundan sonra sizin hayal gucunuz ve yetenekleriniz başlıyor.Aşağıda benim sadece işimi gormesi için yazdığım bir kod parçacığı var.Sadece komutların nasıl entegre edildiğini anlamanız için yararlı olacaktır.

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

from PyQt4 import QtCore
from PyQt4 import QtGui
from toplu_mail2 import Ui_MainWindow
from mail import mail
import sys, re, time

def dogrula(email):
    if len(email) > 7:
        if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) != None:
            return 0
    return 1

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.statusBar().showMessage(unicode("Hazir\n"))

    @QtCore.pyqtSignature("bool")
        def on_pushButton_2_clicked(self):
            liste = self.listWidget
            ekle  = str(self.lineEdit_7.text())
            if(ekle == "" or dogrula(ekle)):
                a = QtGui.QMessageBox()
                a.setWindowTitle("Bos veya hatali giris")       
                a.setText("Yanlis mail girisi yaptiniz!")
                a.setIcon(a.Information)
                a.exec_()               
            else:
                liste.addItem(ekle)
                self.lineEdit_7.clear()


    @QtCore.pyqtSignature("bool")
        def on_pushButton_3_clicked(self):
            mailler = open("mail.txt")
            liste = self.listWidget
            for mail in mailler:
                liste.addItem(str(mail).replace("\n",""))

    @QtCore.pyqtSignature("bool")
        def on_pushButton_clicked(self):

            gmail_user  = str(self.lineEdit_4.text())
            gmail_pwd   = str(self.lineEdit.text())

            konu        = str(self.lineEdit_5.text())
            metin       = str(self.textEdit.toPlainText())

            kimden      = str(self.lineEdit_6.text())

            mserver     = str(self.lineEdit_2.text())
            mport       = int(self.lineEdit_3.text())

            i = 0
            while(i < self.listWidget.count()):
                gonderilcek = str(self.listWidget.item(i).text())
                self.statusBar().showMessage(unicode("Gonderiliyor: %i\n")%(i+1))               
                try:
                    mail(gonderilcek, kimden, konu, metin, gmail_user, gmail_pwd, mserver, mport)
                except:
                    a = QtGui.QMessageBox()
                    a.setWindowTitle("Hata")        
                    a.setText("Bilgileri kontrol ediniz!")
                    a.setIcon(a.Warning)
                    a.exec_()                                               
                i = i +1
                self.progressBar.setValue(int(i/self.listWidget.count())*100)
                time.sleep(1)
            self.statusBar().showMessage(unicode("Hazir\n"))


app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Bu ve birkaç tane daha çalışan PyQt çalışmasını koyduğum Github depoma bakabilirsiniz.Widgetlerin nasıl kullanıldıklarını anlamak için faydalı olabilir.

İşte bu kadar guzel bir dil ve bu kadar guzel bir gui için maalesef Turkçe kaynak kıtlığı var.Nette gorduğum en sağlam python kaynağı istihza'da bile PyQt yerine Gtk ve Tkinter'a ağırlık verilmiş.Eğer siz PyQt ile ilgileniyorsanız kesinlikle bakmanız gereken 2 site var.Bunlar Ozgurlukicin(Giriş yaptıktan sonra sağ taraftan dersleri değiştirebilirsiniz) ve Pardus Wiki(Aynı şekilde alt kısımdan değiştirebilirsiniz).

Bu iki site dışında ise genelde hep ufak çaplı konulara değinilmiş.Bazı forumlarda başlangıçlar yapılmış ama devamları gelmemiş.Eğer ciddi olarak ilgileniyorsanız yardım alabileceğiniz yerlerin başına orjinal sitesindeki referans sayfası.Ben bura ile irc.freenode.net #pyqt kanalından faydalanıyorum.Özellikle irc'ta sorduğunuz sorulara çok kısa surede cevap geliyor.

Qt ile soylemek istediğim bir guzel nokta da C++ ile de kullanılıyor olması.Hatta o dil ile yazılıp Python'dan daha fazla onunla kullanılıyor.Benimde bildiğim ama çok uzun suredir uğraşmadığım C++ ile yaklaşık 1 sene sonra okulda uğraşmaya başlayacağım için C++ için gui olarak Qt kullanmayı duşunuyorum.Hem Qt hemde C++ guzelce pekişir.

comments powered by Disqus