PyQt harikaları
Merhaba PyQt harikaları yazı dizimize hoş geldiniz, bu arada başlık iddialı olmuş biraz ama hak ediyor bence. Bu ara fırsat buldukça bir dizi halinde PyQt ile yapabileceğiniz “değişik” ve “işlevsel” şeylerden bahsedeceğim. İlki bu yazı, gelen tepkileri beğenirsem diğerlerini de yazarım, +rep’lerinizi bekliyorum
Hemen senaryomuza geçelim. Bir resim gösterici uygulaması geliştiriyorsunuz ama uygulamanızın normal pencere şeklinde görünmesini istemiyorsunuz, formunuzun çerçeve şeklinde olmasını ve içinde resimlerinizin görünmesini istiyorsunuz. PyQt ile çok kolay. Pencerenizi herhangi bir çizim programıyla çizin ve gerisini PyQt’ye bırakın.
Örnek uygulamayı vermeden önce içeriğinden bahsedeyim, örneğimizde ana formumuz, kapatma ve minimize butonları ile ileri - geri butonlarını gösteren toplam 5 adet resim bulunmakta. Amacım pencere dekorasyonunu göstermek olduğu için resim gösterme kısmını yazmadım.
Anlatımı kodun içerisinde uygun yerlerde açıklama satırları ile yaptım. Kafanıza takılan, anlamadığınız bir kısım olursa sormaktan çekinmeyiniz.
Kodumuz şöyle:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'widget.ui' # # Created: Thu Jan 19 21:53:03 2009 # by: PyQt4 UI code generator 4.4.4 # # Yazan : Aydın Şen from PyQt4 import QtCore, QtGui import sys class Ui_Form(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setObjectName("Picture Viewer") """ # Pencereyi olusturacagimiz ana resmimizi yukluyoruz. # Penceremiz once bu resme göre kesilip-biciliyor, # daha sonra aynı resim kesili-bicilen pencereye arkaplan olarak label'in icine yerlestiriliyor """ self.pixMap = QtGui.QPixmap("pict_frame.jpg") # Ana pencerenin enini ve boyunu yukledigimiz resme gore ayarliyoruz self.w = self.pixMap.width() self.h = self.pixMap.height() # Ana penceremizi yeni boyutuna resize ediyoruz self.resize(self.w, self.h) # Kestigimiz pencereye arkaplan olarak doseyecegimiz label'imizi tanimliyoruz self.labelBackground = QtGui.QLabel(self) self.labelBackground.setObjectName("labelBackground") self.labelBackground.setPixmap(self.pixMap) # Penceremize title ve icon verilerini giriyoruz self.setWindowTitle("Picture Viewer") self.setWindowIcon(QtGui.QIcon("windowIcon.png")) """ # Penceremizi ozellestirdigimiz icin kendi kapatma ve minimize butonlari yok # elimizde bulunan buton resimlerini butonlara atiyoruz # burada paletteButImage adinda bir palet nesnesi olusturduk # bu nesne ile resmin kendisinin buton olarak gorunebilmesi icin ayarlamalar yaptik # flat olmasi, focus ozelligi olmamasi gibi. # bu palet nesnesini resim olarak kullanacagimiz butun butonlara aktardik""" self.butClose = QtGui.QPushButton(self) self.butClose.setGeometry(QtCore.QRect(365, 4, 25, 25)) paletteButImage = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(239, 239, 239, 0)) brush.setStyle(QtCore.Qt.SolidPattern) paletteButImage.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) paletteButImage.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(239, 239, 239, 0)) brush.setStyle(QtCore.Qt.SolidPattern) paletteButImage.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) paletteButImage.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(239, 239, 239, 0)) brush.setStyle(QtCore.Qt.SolidPattern) paletteButImage.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) paletteButImage.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush) self.butClose.setPalette(paletteButImage) self.butClose.setFocusPolicy(QtCore.Qt.NoFocus) # butona koyacagimiz resmi yukledik icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("btn_close.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.butClose.setIcon(icon) self.butClose.setIconSize(QtCore.QSize(21, 21)) self.butClose.setFlat(True) self.butClose.setObjectName("butClose") self.butMinimize = QtGui.QPushButton(self) self.butMinimize.setGeometry(QtCore.QRect(340, 4, 25, 25)) self.butMinimize.setPalette(paletteButImage) self.butMinimize.setFocusPolicy(QtCore.Qt.NoFocus) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("btn_min.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.butMinimize.setIcon(icon1) self.butMinimize.setIconSize(QtCore.QSize(21, 21)) self.butMinimize.setFlat(True) self.butMinimize.setObjectName("butMinimize") self.butNext = QtGui.QPushButton(self) self.butNext.setGeometry(QtCore.QRect(230, 300, 50, 35)) self.butNext.setPalette(paletteButImage) self.butNext.setFocusPolicy(QtCore.Qt.NoFocus) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap("btn_right_arrow.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.butNext.setIcon(icon2) self.butNext.setIconSize(QtCore.QSize(45, 28)) self.butNext.setFlat(True) self.butNext.setObjectName("butNext") self.butPrevious = QtGui.QPushButton(self) self.butPrevious.setGeometry(QtCore.QRect(140, 300, 50, 35)) self.butPrevious.setPalette(paletteButImage) self.butPrevious.setFocusPolicy(QtCore.Qt.NoFocus) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap("btn_left_arrow.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.butPrevious.setIcon(icon3) self.butPrevious.setIconSize(QtCore.QSize(45, 28)) self.butPrevious.setFlat(True) self.butPrevious.setObjectName("butPrevious") """ # Butonlar icin toolTip girdik # Kapat ve Minimize butonlarinin actionlarini belirledik # ileri ve geri butonlarina herhangi bir action atamadik """ self.butClose.setToolTip(QtGui.QApplication.translate("Form", "Kapat", None, QtGui.QApplication.UnicodeUTF8)) self.butMinimize.setToolTip(QtGui.QApplication.translate("Form", "Simge durumuna küçült", None, QtGui.QApplication.UnicodeUTF8)) self.butNext.setToolTip(QtGui.QApplication.translate("Form", "Sonraki", None, QtGui.QApplication.UnicodeUTF8)) self.butPrevious.setToolTip(QtGui.QApplication.translate("Form", "Önceki", None, QtGui.QApplication.UnicodeUTF8)) QtCore.QObject.connect(self.butClose, QtCore.SIGNAL("clicked()"), self.close) QtCore.QObject.connect(self.butMinimize, QtCore.SIGNAL("clicked()"), self.showMinimized) self.setWindowTitle(QtGui.QApplication.translate("Form", "Picture Viewer", None, QtGui.QApplication.UnicodeUTF8)) self.ortala() def ortala(self): """ # Bu fonksiyon uygulama calistiginda pencerenin ekranin # ortasine yerlesmesini sagliyor """ screen = QtGui.QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2) def mousePressEvent(self, event): """ # Kendimize ozel pencere belirledigimiz icin mouse eventlarini override ediyoruz """ if event.button() == QtCore.Qt.LeftButton: self.dragPosition = event.globalPos() - self.frameGeometry().topLeft() event.accept() def mouseMoveEvent(self, event): if event.buttons() == QtCore.Qt.LeftButton: self.move(event.globalPos() - self.dragPosition) event.accept() def resizeEvent(self, event): """ # Eveeeet, uygulamamizin esas oglani!!!!! # Pencereyi "kesip-bictigimiz" kisim # hatirlarsaniz programin basinda self.pixMap icerisine pencere olarak # kullanmak istedigimiz resmi yuklemistik. # Burada yukledigimiz resmi kullanarak bir maske uretiyoruz # ve Pencerenin (self) setMask metoduna maske nesnemizi gondererek # penceremizin resimdeki gibi olmasini sagliyoruz. # Kendisi kucuk ama islevi buyuk.. """ maske = self.pixMap.createMaskFromColor(QtGui.QColor(0,0,0,0)) self.setMask(maske) def main(): app=QtGui.QApplication(sys.argv) form = Ui_Form() form.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
Yok ben indirip denemeyeyim çalışan halini görsem yeter derseniz buyrun.
Uygulamayı kullanılan resimlerle birlikte buradan indirebilirsiniz.
Bu arada unutmadan, uygulamanın arka plan resmini buradan, pencereye koyduğum icon’u da buradan aldım.

Uzuun zamandır birşey yazamıyordum. Hatta yazdığım en son yazının bitirme projemin taslağı olduğunu gördüğümde utanmadım desem yalan olur. Bu arada hayatımda önemli gelişmelerde oldu tabi. Bu yazıda onlardan bahsedip aradaki geçen süreyi hızlı bir şekilde kapatmayı planlıyorum.