PyQt ile İş Uygulaması Geliştirimi



Benzer belgeler
Python GELECEK. Barış Metin Linux Sistemleri. Python Programlama Dili

Python Web 2.0 Python ve Web 2.0 Son. Python ve Web 2.0. Gökmen GÖKSEL, 3 Mayıs 2007

İnternet Programcılığı

ile Python gibi kod yazma

Qt ile Programlama. İşbaran Akçayır

Üst Düzey Programlama

Kaya Oğuz.

Android e Giriş. Öğr.Gör. Utku SOBUTAY

Open Source Coding: Python

Glade. hitokiri. Eylül, 2012

YZM 3215 İleri Web Programlama

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 10. Yrd.Doç.Dr.Hacer Karacan

Kurumsal Masaüstü ve Sunucularda Pardus

YZM 3215 İleri Web Programlama

Pardus. A. Murat Eren, 25 Mart Pardus Geliştiricisi. Pardus Yenilikleri Sık Sorulan Sorular

Özgür Yazılımlar ile VoIP Denetimi. Fatih Özavcı Bilgi Güvenliği Danışmanı

YAZILIM ÜRÜN HATTI DEĞĐŞKENLĐĞĐNĐN DENETĐM ÇEVRĐMĐ ĐLE ELE ALINMASI

Özgür Yazılımlarla Web Programlama. Özlem Özgöbek

Linux Grafiksel Arayüz Kütüphaneleri

Sanal Santral A.Ş. Çözümleri

Nasıl Pardus Geliştiricisi Olunur?

Bölüm 10: PHP ile Veritabanı Uygulamaları

Üst Düzey Programlama

Qt Temelleri. Eren BAŞTÜRK.

Pardus. S.Çağlar Onur, 21 Aralık Pardus Projesi [TÜBİTAK / UEKAE] Linux Kullanıcıları Derneği

Açık Kaynak Kodlu Yazılım

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

Üst Düzey Programlama

Görsel Programlama DERS 12. Görsel Programlama - Ders12/

Nagios XI Günümüzün talep gören kurumsal gereksinimleri için en güçlü BT altyapısı gözetim ve uyarı çözümüdür.


Start : Bu method init methodundan hemen sonra çalışır ve applet dosyası yürütülmeye başladığında çalışmaya başlar.

Özgür Yazılımlar ile Kablosuz Ağ Denetimi

Selahattin Esim CEO

Linux un Temel Bileşenleri. Linux Nedir? Aydın ÜSTÜN (Selçuk Üniversitesi) e-posta:

Basit bir web uygulaması

Servis olarak Altyapı

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Java ve Linux. Bora Güngören Portakal Teknoloji Akademik Bilişim

MyFaces Özgür JSF Uyarlaması. Bora Güngören Portakal Teknoloji

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Video Management Software. ÜrünBilgileri

BEUN VPN Hizmeti. VPN Nedir?

Java. Hakkımızda. Java Eğitimi

TÜRKİYE ELEKTRONİK FON ALIM SATIM PLATFORMU WEB SERVİS İŞLEMLERİ

Saldırı Tespit ve Engelleme Sistemleri Eğitimi Ön Hazırlık Soruları

Özgür Yazılımlar ile VoIP Denetimi. Fatih Özavcı Bilgi Güveniği Danışmanı

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 7. LINUX OS (Sistem Yapısı) BİLGİ & İLETİŞİM TEKNOLOJİLERİ. LINUX Yapısı

Sade ve tam ekran masaüstü kullanımının temel çıkış noktası, aranılan özelliğe çabuk erişimi sağlayan yenilikçi kullanıcı deneyimidir.

Tarih Saat Modül Adı Öğretim Üyesi. 01/05/2018 Salı 3 Bilgisayar Bilimlerine Giriş Doç. Dr. Hacer Karacan

JAVA API v2.0 Belge sürümü: 2.0.2

İskambil Kağıtları. Bir İskambil kağıdı

Üst Düzey Programlama

Bölüm 4: İş Parçacıkları. Operating System Concepts with Java 8 th Edition

Özgür Yazılımlar ile VoIP Denetimi. Fatih Özavcı Bilgi Güvenliği Danışmanı

Bilgi Sistemlerinde Merkezi Kayıt Yönetimi ve Olay İlişkilendirme

KDE Masaüstü Ortamı. S.Çağlar Onur & Barış Metin. caglar@uludag.org.tr baris@uludag.org.tr. Akademik Bilişim 2005 Gaziantep

PHP 1. Hafta 1. Sunum

Mobil Cihazlardan Web Servis Sunumu

AJAX nedir? AJAX nasıl çalışır? AJAX. Tahir Emre KALAYCI. Sunucu Yazılım Teknolojileri

Activity Context.startActivity Activity, AndroidManifest

PHP ile İnternet Programlama

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

Öğr. Gör. Serkan AKSU 1

1.PROGRAMLAMAYA GİRİŞ

PAKET TRANSFER SİSTEMİ

ProFTPD FTP Sunucusu. Devrim GÜNDÜZ. TR.NET Sistem Destek Uzmanı.

Basit Mimari, Katmanlı Mimari ve doğrudan çalıştırma olarak üçe ayrılır.

Akıllı telefonlar, avuçiçi bilgisayarlar ile taşınabilir (cep) telefonların özelliklerini birleştiren cihazlardır. Akıllı telefonlar kullanıcıların

Fatura Dinamik Kodlama İyileştirmeleri

PYTHON PROGRAMLAMA DİLİ

PYTHON PROGRAMLAMA DİLİ

2000 li yıllardan itibaren teknolojinin hızlı gelişiminden belki de en büyük payı alan akıllı telefon ve tabletler gibi kablosuz iletişim olanağı

BLGM 343 DENEY 8 * TCP İLE VERİ İLETİŞİMİ

EC-485. Ethernet RS485 Çevirici. İstanbul Yazılım ve Elektronik Teknolojileri

BLM401 Mobil Cihazlar için ANDROİD İşletim Sistemi KULLANICI ARAYÜZ. BLM401 Dr.Refik SAMET

HSE RADAR. İş Sağlığı ve Güvenliği Yönetimi Uygulama, Denetim, Eğitim ve Takip HSE GLOBAL YAZILIM A.Ş. 11 Mart 2016

EGE Üniversitesi Network (Ağ) Altyapısı

Java Programlamaya Giriş

C++ Grafik Kullanıcı Arabirimlerinde Taşınabilirlik

LKD Kendi İlacını Kullanıyor

Script. Statik Sayfa. Dinamik Sayfa. Dinamik Web Sitelerinin Avantajları. İçerik Yönetim Sistemi. PHP Nedir? Avantajları.

Ders Tanıtım Sunumu. Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı. 26 Şub Öğr. Gör.

Ipv6 Destekli Özgür Video Konferans Yazılımı: Fi6en

Üst Düzey Programlama

FINDIK Herkese Açık Filtre

Kepware Veritabanı Ürünleri. Teknolojiye Genel Bir Bakış

Ayni sistem(host) üzerinde IPC. Ağ(network) aracılığı ile IPC

QT Eğitimi - 2 :Yerleşim (Layout)

Android Ders Notları

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Öğr.Gör. Gökhan TURAN Gölhisar Meslek Yüksekokulu

AĞ HĠZMETLERĠ MODÜLÜ 1. TAŞIMA KATMANI PROTOKOLLERİ

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

Bölüm 28 ve 29 : İstemci Sunucu Etkileşimi ve Soket API sine Giriş. Internet Protokolleri ve Ağ Uygulamaları. Internet Protokolleri Üzerinden İletişim

Web Uygulama Anaçatıları. Tahir Emre KALAYCI. May 5, 2009

Üst Düzey Programlama

Transkript:

PyQt ile İş Uygulaması Geliştirimi Ümit Öztosun umit@ly.com.tr

Sunum Amacı PyQt kullanarak kapsamlı, büyük ölçekli, profesyönel uygulamaların geliştirilebileceğini göstermek ve örneklemek.

Sunum Planı PyQt = Python + Qt Ağ Programlama Neden Python? Senkron - Asenkron Neden Qt? Twisted Kütüphanesi PyQt Qt Twisted Entegrasyonu Genel Özellikler Lisanslama Kurulum (Py)Qt Temelleri Olay Döngüsü (Eventloop) Qt Designer Sinyal ve Slot'lar GUI Model Verisinin Sunucudan Alınması Örnek Uygulamalar İş Yazılımı: Dia Uygulama Geliştirme Platformu: MOCOP Sorular Yerleşimler (Layouts) Modeller (Models)

PyQt = Python + Qt Python dili kullanarak Qt kütüphanesi kullanılabilmesi için hazırlanmış bir bağdır (binding) Qt'nin çalıştığı tüm platformlarda çalışır: Linux, Windows, MacOS/X, Maemo (Internet Cihazları, Nokia N810 [OS2008]) PyQt4: Qt 4.x PyQt3: Qt <= 3.x

Neden Python? Çok Kısaca Temiz, okunaklı dil sözdizimi, yazması ve okuması kolay Açık kaynak kodlu, her türlü kullanıma uygun lisans Kolay öğrenilebilir Küçük betik programlama ihtiyaçlarından çok geniş yazılım projelerine kadar ölçeklenebilme Nesneye yönelimli; çok yüksek seviyeli dinamik veri tipleri sunmakta Çok kolaylıkla başka dillerle genişletilebilir (C, C++, Java; Swig, Boost.Python, Sip) Çok geniş bir standart kütüphane ile gelir (batteries included); Zip dosyası yaratmaktan, XML oluşturmaya, işleri alt süreçlere bölmekten, SHA1 hashleri oluşturmaya kadar pek çok modül standarttır. Çok geniş üçüncü parti kütüphane desteği: Qt, Gtk+, Resim İşleme, VLC, SDL, nümerik analiz ve daha pek çok kütüphane Platform bağımsız

Kimler Python Kullanıyor? Pardus (Pisi, Mudur, Yalı) Redhat Google YouTube Industrial Light and Magic

Neden Qt? Platform bağımsız (UNIX türevleri, Windows, MacOS/X, Embedded Systems) Temiz, net, nesneye yönelimli, iyi dokümante edilmiş API Sadece görsel kullanıcı arabirimleri için değil, pek çok kavram için platform bağımsız bir arabirim sunuyor: XML, threads, IPC, Ağ Programlama, WebKit, Test Altyapısı... Hem açık kaynak hem de ticari uygulama geliştirmeye uygun lisanslama Grafiksel işlemlerde yüksek performans Kendini ispatlamış referanslara sahip

Kimler Qt Kullanıyor? KDE Google (Google Earth) Lucas Film Ltd. Skype Volvo Mobility Adobe (Photoshop Elements)

PyQt Genel Özellikler C++ kütüphanesi olan Qt'nin Python bağı SIP isimli, C++ kütüphanelerinin Python'dan kullanılabilmesini sağlayan bir araç ile hazırlanıyor. SIP, Qt için özel olarak geliştirilmiş ama kullanımı Qt ile sınırlı değil Lisanslaması genel olarak Qt'yi takip ediyor, açık kaynak kod geliştirimi için uygun Yaygın olarak kullanılan Linux dağıtımları ile beraber geliyor Qt API'sini hemen hemen aynen takip ediyor

PyQt (Qt) Temelleri Eventloop (Olay Çevrimi): Qt'nin olayları (event) beklediği, gerçekleşen olaylara göre gerekli işlemleri yaptığı, bir Qt uygulamasının sonuna kadar varlığını koruyan döngü Olay temelli programlama yaklaşımı benimseyen diğer kütüphanelerde de benzer yapılar mevcuttur Bize etkisi nedir? Çok uzun bir işlemi olay çevrimi ile aynı iş parçacığı (thread) içerisinde gerçekleştirirsek, bu esnada gelen olayların işlenmesi gecikecektir. Bu da ekranın donması, kullanıcıya cevap verememesi gibi sonuçlara yol açar Uzun süren işlemler işlemler için ayrı bir iş parçacığı (thread) kullanılabileceği gibi, asenkron (eşgüdümsüz) programlama ile de olay çevriminin aksaması engellenebilir.

İlk Örnek #!/usr/bin/env python # -*- coding: utf-8 -*- import sys from PyQt4 import Qt # Öncelikle QApplication nesnemizi oluşturalım app = Qt.QApplication(sys.argv) # Basit bir etiket ile mesajımızı dünyaya gösterelim hello = Qt.QLabel(u"<h2>Merhaba Dünya</h2>") # Widgetımızı göstermemiz gerekli hello.show() # Eventloop'u başlatıyoruz app.exec_()

Qt Designer

Qt Designer, devam Görsel tasarım aracı Sadece ekran (form) tasarlamakta kullanılmaz, herhangi bir özel görsel öğe (widget) geliştiriminde kullanılabilir Tasarımlarda kullanılan resim ve ikon dosyaları Qt Resource adı verilen dosyalarda tanımlanabilir Qt'nin temelini oluşturan sinyal ve slot bağlantıları yapılabilir

Sinyal ve Slot'lar Olay tabanlı Qt altyapısında nesnelerin birbirine mesaj gönderebilmesini sağlar A nesnenin oluşturabileceği sinyal bir B nesnesin slot una bağlanır A nesnesi üzerinde ilgili olay meydana gelince (örneğin 'clicked'), B nesnesinin slotunda tanımlı olan işlemler gerçekleştirilir Sinyal ve slot yapısı kolay ve esnek bir şekilde PyQt ile kullanılabilir

Sinyal/Slot Örneği #!/usr/bin/env python # -*- coding: utf-8 -*- import sys from PyQt4 import Qt def btnclicked(): Qt.QMessageBox.information(None, u'uyarı', u'"tıklayınız" tuşuna bastınız!') if name == ' main ': # Öncelikle QApplication nesnemizi oluşturalım app = Qt.QApplication(sys.argv) # Tuşumuz ve sinyal slot bağlantısı btn = Qt.QPushButton(u'Tıklayınız!') Qt.QObject.connect(btn, Qt.SIGNAL('clicked()'), btnclicked) # Widgetımızı göstermemiz gerekli btn.show() # Uygulamayı başlatalım app.exec_()

Sadece Qt Designer Kullanarak Sinyal/Slot Örneği

Sadece Qt Designer Kullanarak Sinyal/Slot Örneği

*.ui Dosyaları Qt Designer tarafından oluşturulan grafiksel arabirim tasarımlarını XML formatında saklarlar Ui dosyaları istenirse uic modülü ile dinamik olarak yüklenebilir, istenirse de pyuic(4) isimli araç kullanarak python kodu üretilebilir İster dinamik yükleme ile isterse de hazırlanan python dosyaları kullanarak kendi kodumuzu inşa edebiliriz Genellikle, pyuic tarafından üretilen kodda değişiklik yapılmaz, tüm kodlama ayrı bir sınıf üzerinde yapılır

Ui Dosyası Kullanan Örnek

Ui Dosyası Kullanan Örnek, devam #!/usr/bin/env python # -*- coding: utf-8 -*- # message1.py import sys from PyQt4.Qt import * from ui_messageform import Ui_MessageForm class Message(QWidget, Ui_MessageForm): def init (self): QWidget. init (self) # Ui_MessageForm içindeki GUI tanımlarını mevcut nesne # ile birleştirelim self.setupui(self) if name == ' main ': app = QApplication(sys.argv) form = Message() form.show() app.exec_()

Ui Dosyası Kullanan Örnek, devam

Ui Dosyası Kullanan Örnek, Gelişmiş Sürüm #!/usr/bin/env python # -*- coding: utf-8 -*- # message2.py import sys from PyQt4.Qt import * from ui_messageform import Ui_MessageForm class Message(QWidget, Ui_MessageForm): def init (self): QWidget. init (self) self.setupui(self) # Sinyal bağlantıları self.connect(self.btnkisamesaj, SIGNAL('clicked()'), self.btnkisamesaj_clicked) self.connect(self.btnuzunmesaj, SIGNAL('clicked()'), self.btnuzunmesaj_clicked) def btnkisamesaj_clicked(self): self.label.settext(u'kısa') def btnuzunmesaj_clicked(self): self.label.settext(u'bu oldukça uzun bir mesajdır, hatta daha uzatabiliriz') if name == ' main ': app = QApplication(sys.argv) form = Message() form.show() app.exec_()

Yerleşim (Layout) Kullanmanın Avantajları Kısa Mesaj Tuşuna basıldı Uzun Mesaj tuşuna basıldı ve form otomatik olarak büyüdü

Neden Yerleşim (Layout) Kullanılmalı? Kullanıcılarınızın platformundan, font tipi ve font boyu tercihlerinden etkilenmemek için Uygulamanızın metinsel içeriği değişse bile ekran tasarımlarınızın bozulmaması için Uygulamanız farklı dillere çevrildiği zaman tasarım bütünlüğünü korumak için Formlarınızın mantıklı öntanımlı boyları olması için Otomatik olarak pencere büyütme/küçültme sorununu çözmek için Dinamik olarak görsel parçacık (widget) ekleme çıkarma sonrası ekranın kendisini ayarlaması için

Modeller (Models, Qt Model/View Architecture) Popüler MVC (Model - View - Controller) yaklaşımını gerçekleştirmeye yarayan nesnelerdir. Model: Uygulamada kullanılan nesnedir View: Ekran ve rapor benzeri yerlerdeki nesne gösterimidir Controller: Kullanıcının veri ile etkileşimini kontrol eden bileşendir Qt Model/View yapısında bu kavramlar şu şekilde eşleşir Model: Model View: View Controller: Delegate

Salt Okunur Tablo Örneği #!/usr/bin/env python # -*- coding: utf-8 -*- # tablemodel.py import re, os, sys from PyQt4.Qt import * from ui_tablemodel import Ui_TableModel class TableModelWidget(QWidget, Ui_TableModel): def init (self, *args): QWidget. init (self, *args) self.setupui(self) self.connect(self.btndoldur, SIGNAL('clicked()'), self.filltable) def filltable(self): headerdata = [u'ad', u'soyad', u'adres'] tabledata = [ [u'ahmet', u'yılmaz', u'ankara'], [u'deniz', u'cengiz', u'bursa'], [u'doruk', u'keskin', u'antalya'], [u'ismail', u'derin', u'istanbul'], [u'arif', u'özlemez', u'istanbul'], ] model = TableModel(tableData, headerdata, self) self.tableview.setmodel(model)

Salt Okunur Tablo Örneği, devam class TableModel(QAbstractTableModel): def init (self, tabledata, headerdata, parent=none, *args): QAbstractTableModel. init (self, parent, *args) self._tabledata = tabledata self._headerdata = headerdata def rowcount(self, parent): return len(self._tabledata) def columncount(self, parent): return len(self._tabledata[0]) def data(self, index, role): if not index.isvalid(): return QVariant() elif role!= Qt.DisplayRole: return QVariant() return QVariant(self._tableData[index.row()][index.column()]) def headerdata(self, col, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: return QVariant(self._headerData[col]) return QVariant() if name == " main ": app = QApplication(sys.argv) w = TableModelWidget() w.show() app.exec_() Yeniden gerçekleştirilmiş Qt Metodları

Salt Okunur Tablo Örneği, devam

Ağ Programlama İki temel yaklaşım mevcut: Senkron (eşgüdümlü synchronous) networkobj = connecttoserver() data = networkobj.getdata() # Sunucudan veri gelene kadar bekler processserverdata(data) Çoklu program parçacıklı (multi-threaded) yapıya uygundur Asenkron (eşgüdümsüz asynchronous) networkobj = connecttoserver() datahandle = networkobj.getdata() # Sunucuyu beklemez, calismaya devam eder datahandle.addcallback(processserverdata) dosomething() Multi-threaded yapıdan kaçınılabilir

Ağ Programlama, devam Asenkron programlama için çok geniş ve gelişmiş bir kütüphane olan Twisted kullanılabilir Çok geniş protokol desteği; TCP, UDP, SSL/TLS, multicast, Unix sockets, HTTP, NNTP, IMAP, SSH, IRC, FTP, DNS, Asenkron programlamayı kolaylaştırıcı nesneleri içeriyor, deferred isimli soyutlama nesnesi kullanılıyor Büyük projelerde kullanılıyor ve uzun yıllardır aktif olarak geliştiriliyor (Nasa, justin.tv, Apple, ) PyQt, PyGTK, PyGame gibi kütüphanelerin olay döngüleri ile entegrasyon imkânı mevcut

Sunucu Örneği #!/usr/bin/env python # -*- coding: utf-8 -*- # simpleserver.py from twisted.spread import pb from twisted.internet import reactor class Server(pb.Root): def remote_gettabledata(self): print '+++ istemci veri istedi' return [ [u'ahmet', u'yılmaz', u'ankara'], [u'deniz', u'cengiz', u'bursa'], [u'doruk', u'keskin', u'antalya'], [u'ismail', u'derin', u'istanbul'], [u'arif', u'özlemez', u'istanbul'], ] if name == ' main ': serverfactory = pb.pbserverfactory(server()) reactor.listentcp(3333, serverfactory) print '+++ Sunucu baslatildi' reactor.run() Twisted olay döngüsü burada başlatılıyor

İstemci Örneği #!/usr/bin/env python # -*- coding: utf-8 -*- # simpleclient.py from twisted.spread import pb from twisted.internet import reactor class Client(object): def connect(self): clientfactory = pb.pbclientfactory() reactor.connecttcp("localhost", 3333, clientfactory) d = clientfactory.getrootobject() d.addcallback(self.gettabledatafromserver) def gettabledatafromserver(self, rootobject): d = rootobject.callremote('gettabledata') d.addcallback(self.gottabledata) def gottabledata(self, result): print "Sunucudan gelen cevap: ", result if name == ' main ': Client().connect() reactor.run()

Tablo Verisinin Sunucudan Alınması import re, os, sys, qt4reactor from PyQt4.Qt import * from ui_tablemodel import Ui_TableModel # twisted.internet.reactor importundan önce qt4reactor kurulmalı app = QApplication(sys.argv) qt4reactor.install(app) # Bu satır Twisted <-> Qt entegrasyonunu sağlar from twisted.spread import pb from twisted.internet import reactor class TableModelWidget(QWidget, Ui_TableModel): def init (self, *args): QWidget. init (self, *args) self.setupui(self) self.connect(self.btndoldur, SIGNAL('clicked()'), self.connecttoserver) def connecttoserver(self): clientfactory = pb.pbclientfactory() reactor.connecttcp("localhost", 3333, clientfactory) d = clientfactory.getrootobject() d.addcallback(self.gettabledatafromserver) def gettabledatafromserver(self, rootobject): d = rootobject.callremote('gettabledata') d.addcallback(self.filltable) def filltable(self, tabledata): headerdata = [u'ad', u'soyad', u'adres'] model = TableModel(tableData, headerdata, self) self.tableview.setmodel(model)

Örnek Uygulamalar DİA Farklı amaçlara yönelik uygulamalar için geliştirmiş olduğumuz platform Temel olarak Dia İş Uygulamasını çalıştırıyor Küçük bir istemci ve uygulama sunucudan oluşuyor; ekranlar da dahil olmak üzere her şey sunucudan alınıyor Tek bir istemci ile farklı uygulamalara bağlanmak mümkün

Örnek Uygulamalar, devam MOCOP Tübitak tarafından desteklenen projemiz Geliştirimi devam ediyor Uygulama geliştirmeye yönelik, platform bağımsız bir geliştirme platformu Önceki bilgi birikimimizi kullanarak daha önceki altyapılarımızda eksik gördüğümüz noktalara eğildik GPL lisansı ile uyumlu olarak da dağıtılacak

Sorular

Teşekkürler Referans olarak başvurulabilecek kaynaklar: www.python.org www.riverbankcomputing.co.uk (PyQt) www.twistedmatrix.com www.qtsoftware.com mocop.ly.com.tr www.dia.gen.tr