PyQt/PySide'a Giriş ve Kurulum
Tkinter, basit GUI uygulamaları için harika bir başlangıç noktası olsa da, daha karmaşık, görsel olarak çekici ve özellik açısından zengin masaüstü uygulamaları geliştirmek istediğimizde PyQt veya PySide gibi daha güçlü kütüphanelere ihtiyaç duyarız. Her iki kütüphane de Qt framework'ünün Python bağlayıcılarıdır. Qt, C++ ile yazılmış, platformlar arası (cross-platform) bir GUI geliştirme framework'üdür ve Windows, macOS, Linux gibi birçok işletim sisteminde aynı kod tabanıyla çalışabilen uygulamalar oluşturmanıza olanak tanır.
•PyQt: Riverbank Computing tarafından geliştirilen ticari bir lisansa sahip olsa da, GPL lisansı altında ücretsiz olarak da kullanılabilir. Genellikle daha kararlı ve iyi belgelenmiş kabul edilir.
•PySide: Qt Company tarafından geliştirilen ve LGPL lisansı altında tamamen açık kaynaklı olan bir alternatiftir. Lisans esnekliği nedeniyle bazı geliştiriciler tarafından tercih edilir.
Bu derslerde PyQt5 veya PySide2/PySide6 kullanabiliriz. Temel kullanım prensipleri oldukça benzerdir. Kurulum için terminal veya komut istemcisini açın ve aşağıdaki komutlardan birini çalıştırın:
PyQt5 için:
Bash
pip install PyQt5 PyQt5-tools
PySide6 için (daha güncel):
Bash
pip install PySide6
PyQt5-tools paketi, Qt Designer gibi görsel tasarım araçlarını içerir. PySide6 için bu araçlar genellikle PySide6 paketiyle birlikte gelir veya ayrı olarak kurulabilir.
Qt Designer ile Arayüz Tasarımı
Qt Designer, sürükle-bırak yöntemiyle grafiksel kullanıcı arayüzleri tasarlamanıza olanak tanıyan bir araçtır. Bu, kod yazmadan arayüzün görsel düzenini oluşturmanızı sağlar. Tasarladığınız arayüz .ui uzantılı bir XML dosyası olarak kaydedilir ve daha sonra Python kodunuzda yüklenebilir.
Qt Designer'ı Başlatma:
PyQt5 kurduysanız, komut satırına designer yazarak veya Python kurulum dizininizdeki Lib\site-packages\pyqt5_tools\Qt\bin klasöründe designer.exe dosyasını bularak çalıştırabilirsiniz. PySide6 kurduysanız, genellikle pyside6-designer komutuyla veya kurulum dizininizdeki ilgili klasörden başlatabilirsiniz.
Temel Adımlar:
1.Qt Designer'ı açtığınızda, yeni bir form oluşturma seçeneği sunulur. Genellikle "Main Window" (Ana Pencere) veya "Dialog" (Diyalog) seçeneğini tercih edersiniz.
2.Sol taraftaki "Widget Box" (Widget Kutusu) bölümünden sürükleyip bırakarak pencerenize düğmeler, metin kutuları, etiketler gibi widget'lar ekleyebilirsiniz.
3.Sağ taraftaki "Property Editor" (Özellik Düzenleyici) bölümünden seçili widget'ların özelliklerini (metin, boyut, renk vb.) değiştirebilirsiniz.
4."Object Inspector" (Nesne Denetleyicisi) bölümünden widget'ların hiyerarşik yapısını görebilir ve isimlerini değiştirebilirsiniz. Widget'lara anlamlı isimler vermek (örneğin, girdi_kutusu, analiz_dugmesi) kodunuzda onlara erişimi kolaylaştırır.
5.Arayüzü tasarladıktan sonra, dosyayı .ui uzantısıyla kaydedin (örneğin, arayuz.ui).
.ui Dosyasını Python Kodunda Kullanma:
Tasarladığınız .ui dosyasını Python kodunuzda iki şekilde kullanabilirsiniz:
1.Dönüştürme (Önerilen): .ui dosyasını Python koduna dönüştürebilirsiniz. Bu, uygulamanızı dağıtırken .ui dosyasına bağımlılığı ortadan kaldırır. PyQt5 için:
Bash
pyuic5 -x arayuz.ui -o ui_arayuz.py PySide6 için: bash pyside6-uic arayuz.ui -o ui_arayuz.py ``` Bu komutlar, arayuz.ui dosyasını ui_arayuz.py adında bir Python dosyasına dönüştürür. Daha sonra bu dosyayı kendi ana Python dosyanızda içe aktarabilirsiniz.
1.Doğrudan Yükleme: .ui dosyasını çalışma zamanında doğrudan yükleyebilirsiniz. Bu, küçük projeler veya hızlı prototipleme için kullanışlıdır.
Python
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('arayuz.ui', self)
# Widget'lara erişim ve olayları bağlama burada yapılır
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
Sinyaller ve Slotlar
Qt'nin (ve dolayısıyla PyQt/PySide'ın) en güçlü özelliklerinden biri, olay tabanlı programlamayı kolaylaştıran "Sinyaller ve Slotlar" mekanizmasıdır. Bu mekanizma, bir olay (sinyal) meydana geldiğinde belirli bir fonksiyonun (slot) çağrılmasını sağlar.
•Sinyal (Signal): Bir widget'ın belirli bir olay gerçekleştiğinde (örneğin, bir düğmeye tıklandığında, bir metin kutusunun içeriği değiştiğinde) yaydığı bir bildirimdir.
•Slot (Slot): Bir sinyal yayıldığında çağrılan bir fonksiyondur. Slotlar, sinyallere yanıt veren eylemleri gerçekleştirir.
Örnek Kullanım:
Python
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Sinyal ve Slot Örneği")
self.setGeometry(100, 100, 400, 200)
layout = QVBoxLayout()
self.label = QLabel("Henüz bir şey olmadı.")
layout.addWidget(self.label)
button = QPushButton("Bana Tıkla")
# Sinyali (clicked) slota (on_button_click) bağla
button.clicked.connect(self.on_button_click)
layout.addWidget(button)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def on_button_click(self):
# Slot fonksiyonu: düğmeye tıklandığında çalışır
self.label.setText("Düğmeye Tıklandı!")
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
Bu örnekte, QPushButton'ın clicked sinyali, MainWindow sınıfındaki on_button_click slotuna bağlanmıştır. Düğmeye her tıklandığında, on_button_click fonksiyonu çalışır ve etiketin metnini günceller.
Daha Karmaşık Widget'lar ve Layout Yönetimi
PyQt/PySide, Tkinter'dan çok daha zengin bir widget setine sahiptir. Ayrıca, arayüz elemanlarını düzenlemek için güçlü layout (düzen) yöneticileri sunar.
Bazı Önemli Widget'lar:
•QLineEdit: Tek satırlık metin girişi için.
•QTextEdit: Çok satırlık metin girişi ve görüntüleme için.
•QComboBox: Açılır liste (dropdown) için.
•QListWidget: Öğelerin listesini görüntülemek ve seçmek için.
•QTableWidget: Tablo şeklinde veri görüntülemek için.
•QProgressBar: Bir işlemin ilerlemesini göstermek için.
•QMenuBar, QToolBar, QStatusBar: Menüler, araç çubukları ve durum çubukları oluşturmak için.
Layout Yöneticileri:
Layout yöneticileri, widget'ların pencere içinde nasıl konumlandırılacağını ve yeniden boyutlandırıldığında nasıl davranacaklarını otomatik olarak yönetir. Bu, farklı ekran boyutlarına ve çözünürlüklere uyum sağlayan duyarlı arayüzler oluşturmanızı sağlar.
•QVBoxLayout (Vertical Box Layout): Widget'ları dikey olarak üst üste dizer.
•QHBoxLayout (Horizontal Box Layout): Widget'ları yatay olarak yan yana dizer.
•QGridLayout (Grid Layout): Widget'ları bir ızgara (satır ve sütunlar) içinde düzenler.
•QFormLayout: Etiket-girdi çiftleri gibi form elemanlarını düzenlemek için özel bir layout.
Örnek Layout Kullanımı (QGridLayout):
Python
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QGridLayout
class FormWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Form Örneği")
self.setGeometry(100, 100, 400, 250)
grid = QGridLayout()
self.setLayout(grid)
# Etiketler ve Giriş Kutuları
name_label = QLabel("Adı:")
self.name_input = QLineEdit()
email_label = QLabel("E-posta:")
self.email_input = QLineEdit()
# Düğme
submit_button = QPushButton("Gönder")
submit_button.clicked.connect(self.on_submit)
# Grid'e widget'ları ekleme (satır, sütun, satır_span, sütun_span)
grid.addWidget(name_label, 0, 0)
grid.addWidget(self.name_input, 0, 1)
grid.addWidget(email_label, 1, 0)
grid.addWidget(self.email_input, 1, 1)
grid.addWidget(submit_button, 2, 0, 1, 2) # Düğme 2 sütunu kaplar
grid.setRowStretch(3, 1) # Son satırı genişlet
grid.setColumnStretch(1, 1) # İkinci sütunu genişlet
def on_submit(self):
name = self.name_input.text()
email = self.email_input.text()
print(f"Ad: {name}, E-posta: {email}")
# Burada veritabanına kaydetme veya başka işlemler yapılabilir
if __name__ == '__main__':
app = QApplication([])
window = FormWindow()
window.show()
app.exec_()
Bu ders, PyQt/PySide ile daha gelişmiş ve profesyonel görünümlü masaüstü uygulamaları geliştirmenin temellerini atmaktadır. Qt Designer ile hızlı arayüz prototipleme, sinyal-slot mekanizması ile olay yönetimi ve güçlü layout yöneticileri ile duyarlı tasarımlar oluşturma yeteneği, bu kütüphaneleri masaüstü uygulama geliştirmede vazgeçilmez kılar.