![]() | |
| | #1 (permalink) |
| Yönetim Kurulu Üyelik Tarihi: 01/2008 Yer: İstanbul
Mesaj: 251
|
Yazan : BALIBEY Günümüzde Python gerçekten emin adımlarla,güven vererek ilerliyor.Bizde bu ilerlemeye karınca kararınca katkıda bulunalım istedik ve elimizden geldiğince PyQt4’ü anlatmaya çalıştık,basit manada.Python ile beraber gelen Tkinter yerine QT’i isteyenler olabilir. “Qt platformlar arası bir C++ yazılım geliştirme çatısıdır. Bir arayüz kitaplığının yanında kendine özgü, standart şablon kitaplığına benzer yapıları da vardır.Bunu bizlere sunan ise Trolltech’tir. Trolltech Qt'yi geliştiren Norveç'li bir yazılım firmasıdır.” Biraz QT Designer programından bahsedelim. Qt Designer Qt araçlarını içerir ve bize grafik arabirimde çalışma kolaylığı sağlar.Tasarımımızın çoğunluğunu widgets,dialogs veya bizim için gerekli olan bütün araçları rahatlıkla kullanabiliriz.Aynı zamanda Qt tasarım aracı yaptığımız tasarımın ön izlemesini bize sunarak çalışma kolaylığı sağlar.Grafik arabirimi kullanmak bizim kod yazmamızda büyük kolaylık sağlar.Grafik için harcayacağımız zamanı programımızı gereksiz kodlardan arındırmak,kararlılığı arttırmak için kullanabiliriz. Qt tasarım aracı ui. Dosyalarında XML formatını kullanır.Qt, QUiLoader sınıfını kullanarak,ui dosyalarını uygulamaya yükler, ve dinamik ara yüzü meydana getirir.Bunu yaparken de uic kullanır.PyQt4’nin pyuic4 uygulamasını komut satırından çalıştırdığımızda uic modülü devreye girer ve tasarım hayata geçer. PyQt için gerekenler. PyQt4’ü indirin; LinuX için, http://www.riverbankcomputing.com/Do...l-4.3.3.tar.gz Windows için, http://www.riverbankcomputing.com/Do...-gpl-4.3.3.zip Py2.5 ve PyQt4.3.3 http://www.riverbankcomputing.com/Do...pl-4.3.3-2.exe Mac için, http://www.riverbankcomputing.com/Do...-gpl-4.3.3.zip Qt kurduktan sonra grafik arabirimde istediğimiz gibi programınızın ara yüzünü oluşturabiliriz. Xp Kullananlar bu reg kodlarını kullanırlarsa daha hılı çalışabilirler. Kod: Windows Registry Editor Version 5.00 ; Sağ tuş menüsünden komut satırına düşme. [HKEY_CLASSES_ROOT\*\shell\cmd] @=hex(2):43,00,4d,00,44,00,20,00,53,00,48,00,45,00 ,4c,00,4c,00,3a,00,5c,00,3e, 00,00,00 [HKEY_CLASSES_ROOT\*\shell\cmd\command] @="cmd.exe \\\"%1\\\"" [HKEY_CLASSES_ROOT\Directory\shell\cmd] @=hex(2):43,00,4d,00,44,00,20,00,53,00,48,00,45,00 ,4c,00,4c,00,3a,00,5c,00,3e, 00,00,00 [HKEY_CLASSES_ROOT\Directory\shell\cmd\command] @="cmd.exe /k \"cd %L\\\"" [HKEY_CLASSES_ROOT\Directory\shell\cmd] @=hex(2):43,00,4d,00,44,00,20,00,53,00,48,00,45,00 ,4c,00,4c,00,3a,00,5c,00,3e, 00,00,00 [HKEY_CLASSES_ROOT\Directory\shell\cmd\command] @="cmd.exe /k \"cd %L\\\"" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shel l\cmd] @=hex(2):43,00,4d,00,44,00,20,00,53,00,48,00,45,00 ,4c,00,4c,00,3a,00,5c,00,3e, 00,00,00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shel l\cmd\command] @="cmd.exe /k \"cd %L\\\"" bu kodlarıda .reg formatında kaydedin ve dosyaya sağ tıklayın CMD’yi açın. Linux kullananlar F4 yaparak olayı halledebilirler(herhangi bir ayar yapmaya gerek yok) pyuic4 deneme.ui -o deneme.pyw şeklinde komutumuzu icra ettiğimizde deneme.pyw isimli python dosyamız oluşacaktır. Yalnız oluşan bu dosyamız çalışmayacaktır bu dosyaya hemen şu komutları ekliyoruz. Kod: app = QtGui.QApplication(sys.argv) window = QtGui.QMainWindow() ui = Ui_MainWindow() ui.setupUi(window) window.show() sys.exit(app.exec_()) birde sys modulünü ekliyoruz. Kod: import sys Örnekleri indirebileceğiniz adres: Örnekler Dilerseniz programların anlatımına geçelim. Deneme Kod: # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui app = QtGui.QApplication(sys.argv) widget = QtGui.QWidget() widget.resize(250, 150) widget.setWindowTitle("Deneme") widget.show() sys.exit(app.exec_()) Gerekli modülleri ekliyoruz.GUI çizebilmek için temel QtGui modülünü yüklüyoruz. Kod: App = QtGui.QApplication(sys.argv) Tüm PyQt4 uygulamalarında nesnelerimizi oluşturmak için gerekli olan nesnedir.sys.argv parametresi komut satırı için gerekli olan nesneleri içerir.Python scriptleri derlenmeden çalıştıralabildiği için kontrol etme kolaylığı sağlar. Kod: widget = QtGui.QWidget() Penceremizi widget yardımıyla oluşturuyoruz.Çalışma alanımızı oluşturuyoruz. Kod: Widget.resize(250,150) resize() metoduyla penceremizin(widget)boyutunu ayarlıyoruz.250px genişliğinde ve 150px yüksekliğinde olsun istedik. Kod: Widget.setWindowTitle(‘Deneme’) Penceremizin başlığını belirledik. Kod: widget.show() show() metodu penceremizin ekranda görüntülenmesini sağlıyoruz. Kod: Sys.exit(app.exec_()) Nihayet uygulamamızı tamamladık.Ana döngüyü tam olarak sonlandırmak için sys.exit() kullandık.exit() metodu widget’i tamamen temizlerken,sys.eixt() ile garantili bir şekilde temizledik ve çıktık. Showing a Tooltip Herhangi bir butonun yada görev atanmış nesne’nin üzerine faremizi getirdiğimizde ortaya çıkan mesaj,yani yardım balonu uygulaması.Dilerseniz açıklamaya çalışalım. Kod: # -*- coding: utf-8 -*- # tooltip.py import sys from PyQt4 import QtGui from PyQt4 import QtCore class Tooltip(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Tooltip') self.setToolTip('This is a <b>QWidget</b> widget') QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10)) app = QtGui.QApplication(sys.argv) tooltip = Tooltip() tooltip.show() app.exec_() Şimdi önceden görmediğimiz bazı satırları açıklığa kavuşturalım. Self.setToolTip(‘LinuX bir <b>Özgür</b> sistemdir.’) Burada bir tooltip oluşturduk,bunu set.ToolTip() metoduyla çağırdık.Bunu yaparken zengin yazı formatlarına sahibiz,unutmayın ve Kod: QtGui.QToolTipSetFont(QtGui.QFont(‘Arial’,’10’)) Satırıyla destekledik. Genellikle pencerelerimizi işletim sisteminin bize sağladığı kapatma butonlarıyla kapatırız.Bu örnekte kendi penceremizi kendimiz nasıl kapatırız,buna değineceğiz.Bu esnada da kısaca signal ve slots olaylarına göz atacağız. Örneğimizde kullanmak üzere bir buton oluşturuyoruz. Kod: QPushButton(string text,QWidget parent = None) Butonumuz QWidget parent = None ile ana döngü içerisinde yükseldi. Kod: Self.connect(quit,QtCore.SIGNAL(‘clicked()’), QtGui.qApp,QtCore.SLOT(‘quit()’)) PyQt4’ün kullandığı yapılarda olayların süreçleri signal & slots mekanizmasıyla çözülür.Butona tıkladığımızda clicked() signali icra edilir.QtCore.QObject.connect() metodu slots aracılığıyla signal’e bağlanır.İki nesne iletişim bittiğinde,istenen gönderilmiş ve alınmıştır.Gönderen oluşturduğumuz buton,alıcı ise tasarladığımız sınıf,fonksiyon yani uygulanacak kod. MessageBox Normalde penceremizin X butonuna tıkladığımızda QWidget sonlanır,penceremiz kapanır.Bazı zamanlarda bunun olmamasını isteriz.Misal,bir dosyayı açtık ve üzerinde değişiklik yaptık,bu arada kapatırken uygulamanın bizi uyarmasını istiyoruz.Hemen başlayalım. Kod: # -*- coding: utf-8 -*- # messagebox.py import sys from PyQt4 import QtGui class MessageBox(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('message box') def closeEvent(self, event): reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore() app = QtGui.QApplication(sys.argv) qb = MessageBox() qb.show() sys.exit(app.exec_()) QWidget()’i kapatırken closeEvent’in araya girerek mesaj kutusunu çıkarmasını istiyoruz. Kod: reply = QtGui.QMessageBox.question(self, 'Mesaj', "Çıkmak istiyor musun?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) Yes ve NO olarak iki butonlu mesaj kutusu görüyoruz.İlk ifademiz görev çubuğunda görünen ifademiz.İkinci ise mesaj kutumuzda görünen ifade.Aynı zamanda değişkenimizin sürekli dönmesini sağlıyoruz. Kod: İf reply == QtGui.QMessageBox.Yes: event.accept() Else: event.ignore() Bu döngüde değişkenimizi test ediyoruz.Eğer Yes butonuna basıldı ise döngüyü sonlandırıyoruz.(burada python’un kapsamlı özelliklerinden herhangi biri de istenebilir) Diğer seçenekte ise döngünü başına alıyoruz.Tekrarlıyoruz. Penceremizi Masaüstünü Ortasına Yerleştirme Bu betik penceremizi ekranımızın ortasına yerleştirebilmemizi sağlar.Buyrun, Kod: # -*- coding: utf-8 -*- # ortala.pyw import sys from PyQt4 import QtGui class Center(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Ortada') self.resize(250, 150) self.center() def center(self): screen = QtGui.QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2) app = QtGui.QApplication(sys.argv) qb = Center() qb.show() sys.exit(app.exec_()) Burada resize() ile 250px genişliğinde,150px yüksekliğinde QWidget oluşturduk. Kod: Screen = QtGui.QDesktopWidget().screenGeometry() Monitörümüzün ekran çözünürlüğünü aldık. Kod: Size = self.geometry() Penceremizin oluşturulacağı boyutu elde ettik. Kod: self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2) Burada da penceremizi ekranımız ortasına terleştirdik. Dilerseniz sağ alt köşeye de yerleştirmeye de bakalım. Kod: def center(self): screen = QtGui.QDesktopWidget().screenGeometry() size = self.geometry() self.move((100+800), (600+60)) bu foksiyonla sağ-alt köşeye yerleştirebiliriz.(1024x768 için) Ana Pencere QMainWindow ana uygulama penceremizi bir sınıf içinde oluşturabilmemizi sağar.Menubar,Toolbar ve Statusbar’ları uygulama içerisinde oluşturmamıza imkan verir. Statusbar Kod: # -*- coding: utf-8 -*- # status.py import sys from PyQt4 import QtGui class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.resize(250,150) self.setWindowTitle("StatusBar") self.statusBar().showMessage("Ready") app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) QApplication sınıfıyla statusBar() metodunu çağırdık ve statusbar’ı elde ettik.showMesaage() sayesinde de statusbar üzerinde mesajımızı görüntüledik. Menubar GUI uygulamalarında çok tercih edilen bir nesnedir.Çeşitli gurupları ve menüleri konumlandırmamıza yardımcı olur.Yeni uygulamaları yerden kazanarak yerleştirmemizi sağlar. Kod: # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.resize(250, 150) self.setWindowTitle('menubar') exit = QtGui.QAction(QtGui.QIcon('exit.png'), 'Çıkış', self) exit.setShortcut('Ctrl+Q') exit.setStatusTip('Çıkış') self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()')) self.statusBar() menubar = self.menuBar() file = menubar.addMenu('&Dosya') file.addAction(exit) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) menuBar() metoduyla ilk menubar’ı QMainWindow içerisinde oluşturduk.AddMenu() metoduyla da menüye eklemede bulunduk.Son olarak Dosya menüsü içerisine yerleştirdik. Toolbar Menüleri ve gurupları tüm uygularımızda kullanırız,bu da bize hızla giriş yapma imkanı verir. Kod: # -*- coding: utf-8 -*- # toolbar.pyw import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.resize(250, 150) self.setWindowTitle('toolbar') self.exit = QtGui.QAction(QtGui.QIcon('exit.png'), 'Çıkış', self) self.exit.setShortcut('Ctrl+Q') self.connect(self.exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()')) self.toolbar = self.addToolBar('Çıkış') self.toolbar.addAction(self.exit) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) GUI uygulamaları komutlarla kontrol edilir.Bu komutlar menüde yeni bir iş başlatmak,menüye bağlanmak gibi özelliklerle karşımıza çıkar.PyQt’nin özelliği aynı zamanda bazı nesneleri çok basit şekilde yapmamıza imkân vermesidir.Bu özellikler,yazı alanı olşturmak,icon yerleştirmek,durum metni yerleştirmek gibi geniş bir alanı kapsar.Örneğimizde de bu özellikleri nasıl tanımlayabileceğimizi gösterdik. Kod: self.connect(self.exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()')) triggered() sinyaliyle durumu close() sinyaline bağladık. Kod: self.toolbar = self.addToolBar('Çıkış') self.toolbar.addAction(self.exit) Burada bir toolbar oluşturduk ve toolbar’ın ne yapacağı belirledik. Kod: # -*- coding: utf-8 -*- # mainwindow.py import sys from PyQt4 import QtGui, QtCore class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.resize(350, 250) self.setWindowTitle('mainwindow') textEdit = QtGui.QTextEdit() self.setCentralWidget(textEdit) exit = QtGui.QAction(QtGui.QIcon('exit.png'), 'Çıkış', self) exit.setShortcut('Ctrl+Q') exit.setStatusTip('Çıkış') self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()')) self.statusBar() menubar = self.menuBar() file = menubar.addMenu('Dosya') file.addAction(exit) toolbar = self.addToolBar('Çıkış') toolbar.addAction(exit) app = QtGui.QApplication(sys.argv) main = MainWindow() main.show() sys.exit(app.exec_()) Burada toolbar,menubar,statusbar uygulamalarını birleştirdik.Ana widget’i QMainWindow şeklinde biçimlendirdik. Nesnelerimiz ve PyQt4 Dilerseniz signal ve slots diyarında biraz gezinelim. Nesneler GUI programlamada çok önemlidir.Nesneler sistem için oluşturduğumuz isteklerdir.Biz bir uygularının exec_() metodunu çağırdığımızda,uygulama ana döngüye girer.Ana döngüden istediğimizi alıp getiri ya da elimizdekini gönderir.Trolltech bu olayı signal ve slots mekanizmasıyla ortaya koymuştur. Signal & Slots Kullanıcı tarafından butona tıklandığı zaman sinyal işletilir,kaydırılır.Bunu saatin işleyişine benzetebiliriz.Slot metodu sinyale tepki gösterir.Aynı zamanda python hiç nesne çağırmadan slots yapabilir. Kod: # -*- coding: utf-8 -*- # sigslot.py import sys from PyQt4 import QtGui, QtCore class SigSlot(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('signal & slot') lcd = QtGui.QLCDNumber(self) slider = QtGui.QSlider(QtCore.Qt.Horizontal, self) vbox = QtGui.QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(slider) self.setLayout(vbox) self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)') ) self.resize(250, 150) app = QtGui.QApplication(sys.argv) qb = SigSlot() qb.show() sys.exit(app.exec_()) Bu örneğimizde,lcd ve kaydırma çubuğu görüntüledik.Çubuğu kaydırdıkça lcd değeri değişmektedir. Kod: self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)') ) Burada valueChanced()’e bağlandık,kaydırma çubuğunun sinyali display() metoduyla lcd değerini slot’layarak değiştirdi. Bağlanma olayı 4 adımda meydana gelir.Gönderen(value),nesneye sinyali gönderir.Sinyalin ne tür sinyal olduğu algılanır.Alıcı nesne,sinyali alır.Sonuç olarak slot metodu,sinyale tepki göstermiş olur. Sonlandırma Kod: # -*- coding: utf-8 -*- # escape.pyw import sys from PyQt4 import QtGui, QtCore class Escape(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('escape') self.resize(250, 150) self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()')) def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.close() app = QtGui.QApplication(sys.argv) qb = Escape() qb.show() sys.exit(app.exec_()) Eğer escape butonuna basarsak,uygulamamız kapanır.QtCore.QObject ile nesnemizin sinyali oluşturulur.Eğer biz butona basarsak clicked() sinyali meydana gelir. Kod: # -*- coding: utf-8 -*- # emit.py import sys from PyQt4 import QtGui, QtCore class Emit(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('emit') self.resize(250, 150) self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') ) def mousePressEvent(self, event): self.emit(QtCore.SIGNAL('closeEmitApp()')) app = QtGui.QApplication(sys.argv) qb = Emit() qb.show() sys.exit(app.exec_()) http://img239.imageshack.us/img239/9371/emitqm8.jpg closeEmitApp() ile yeni bir sinyal oluşturduk.Bu sinyal faremizle tıkladığımızda sonlanacaktır. Kod: def mousePressEvent(self, event): self.emit(QtCore.SIGNAL('closeEmitApp()')) emit() metodu sinyalimiz sonlandırdı. Kod: self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') ) closeEmitApp()sinyalimize manuel olarak bağlandık ve slot metoduyla close()’i çağırdık. Eğer programlarımızı exe formatına çevirmek istersek. PythonWin Programını açın.Menulerden Tools>Edit Python Path'e tıklayın http://img141.imageshack.us/img141/1308/exefw9.jpg PythonPath kısmına pythonumuzun kurulu olduğu dizini yazın. Sonra bir dosya oluşturalım Qt Designer ile yaptığımız deneme.ui hazır ve bunu deneme.pyw dosyasına dönüştürdük.Şimdide, Kod: from distutils.core import setup import py2exe setup(windows=[{"script" : "hesap.py"}], options={"py2exe" : {"includes" : ["sip", "PyQt4._qt"]}}) bu kodu satup.py olarak kaydedelim.Tüm dosyalarımız klasörümüzün içinde.Klasöre sağ tıklayarak CMD'yi açalım Kod: python setup.py py2exe komutunu verelim. Exe dosyamız hazır fakat dosya boyutu biraz fazla olabilir bunuda library.zip içindeki kullanmadığımız modülleri silerek çare bulabiliriz. Buradaki amacımız PyQt hakkındaki kısıtlı Türkçe kaynağa bir nebze olsun destek olmaktır.Bu yazımda kısmen çeviri,kısmen formlardan yararlanarak ve kendi deneyimimi ekleyerek toplu bir kaynak oluşturmaya çalıştım.İnşallah yararlı olur. |
| | |
![]() |
| Bookmarks |
| Seçenekler | |
| |
Benzer Konular | ||||
| Konu | Konuyu açana göre | Forum | Cevap | En Son Mesaj |
| Pyqt Kullanılarak Yapılan Python Betiğini Exe'ye Dönüştürme | Muallim-i Âli | Python / Zope | 3 | 27/05/2008 03:24 |
| son giriş bilgisi | msk1977 | PHP | 2 | 23/10/2007 13:48 |
| Python’a Giriş | turker | Haberler | 0 | 25/05/2007 00:10 |
| Ağ giriş sorunu | overworld | Ağ / Güvenlik | 10 | 10/05/2005 23:44 |
| PHP ye giriş.... | FatalFear | PHP | 15 | 07/10/2004 13:13 |
| Reklamlar & Desteklenenler | |
| Hassas Valf | Hassas Kaplama | Antalyamız | Gazete | Ticari Bilişim | Hakan Müştak | Rüya Tabirleri | Kadın | Hastalıklar | Cepte msn ve e-posta | Webmaster | Antalya Aupair | Turkish Property Antalya | Forum | Chat | Perde | Adsl | Araba | bolindir.com | guncelle.com | livescore | Web Tasarım | evden eve nakliyat | forum | evden eve | sohbet | Resimcim| Kalifiye İnsan Kaynakları | Web Tasarım | Oyun | Yusuf KOÇ | Akın Yorulmaz | şiir | UFO | Web Tasarım | Oyunlar | Canlı Tv | |