PYQT Denemeleri-5

Pardus-Linux.org | Wiki sitesinden

Git ve: kullan, ara

Giriş

Bu çalışmamızda bir önceki çalışmamızı biraz farklı bir şekilde yapacağız.O çalışmamızda resim göstermek için düğmelere basıyorduk, bu çalışmamızda resmin adını "LineEdit" parçacığına yazacağız ve resim görünecek.


Arayüzün Oluşturulması

Öncelikle qt designer ile arayüzümüzü kolayca oluşturalım.Programı açınca açılan ilk pencerede "main window" u seçip "olustur" a tıklayalım.

Resim:resim-1.png

Soldaki parçacık kutusu bölümünden ""Buttons" kısmından bir adet "push button" , "display widgets" bölümünden bir adet "label", "Input widgets" bölümünden bir adet "lineEdit" , "spacers" bölümünden iki adet "horizantal spacer" parçalarını farenin sol tuşu ile tıklayıp ana pencere "main window" üzerine sürükleyerek bırakın ve resimde olduğu gibi yerleştirin.Üstteki "label" in boyutunu büyütmek için üstüne tıklayın.Tıkladığınızda üstünde mavi noktalar oluşur.Bu noktalara tıkladığınızda boyutlarını değiştirebilirsiniz.

Resim:Res-1.jpg

Yukarıdaki bölümlerden "Izgara içine yerleştir" düğmesine basarak

Resim:Res-2.jpg

parçacıkların kendiliğinden penceremize yerleşmesini sağlayalım.Bu sayede artık açacağımız resmin boyutuna göre penceremiz büyüyebilecek.Daha sonra yerleştirdiniz parçacıklara çift tıklayarak isimlerini resimdeki gibi değiştirin.Yani penceremizin son hali şöyle olmalı:

Resim:Res-3.jpg

Şimdi sıra düğmelere görev atamakta."Düzenle > Sinyal slot düzenle" yi tıklayın yada "f4" e basın.Resimde görüldüğü gibi kapat tuşuna tıklayıp tuşu bırakmadan biraz sürükleyip boşluk üzerinde bırakın.Sakın başka bir parçacık üzerine bırakmayın.

Resim:Res-6.jpg

Yeni bir pencere açılacak.Açılan pencerede birinci bölümden "clicked()" seçip, aşağıdaki "Tüm sinyal ve slotları göster" tıklayıp, sağdaki bölümden "close()" seçip, tamam deyip kapatıyoruz.

Resim:resim-5.png

Aynı işlemi "line Edit" parçacığı için de yapın.

Resim:Res-4.jpg

Açılan pencerede birinci bölümden "returnPressed()" ikinci bölümden "close()" seçip, tamam deyip kapatıyoruz.

Resim:Res-5.jpg


Arayüzle işimiz bitti.Şimdi yaptığımız bu formu bir yere resim.ui uzantısı ile kaydedin.İsim önemli değil ama son ek ".ui" olmalı.Eğer kaydettiğiniz yerde aynı isimde başka dosya varsa üzerine yazmaya çalışır.Buna dikkat edin.

Kodların Ayarlanması

resim.ui adıyla kaydedilmiş dosyanın olduğu dizine gidip konsolda şu komutu verin:

Kod:
pyuic4 resim.ui -o resim.py

Artık elimizde az önce yaptığımız formun kodları var.Ancak bu kodların henüz hazır olmadığını ve bir kaç düzenleme yapmamız gerektiğini önceki denemelerden biliyorsunuz.

resim.py dosyasını açıp en altına şu kodları yapıştırıyoruz:

Kod: Dosyanın sonuna bu kodları ekleyin
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(window)

window.show()
sys.exit(app.exec_())

Şimdi sıra düğmelere atayacağımız görevlerin kodlarını ayarlamakta.


Daha önceki denemelerimizden tuşlara görev atayabilmemiz için bu kodları fonksiyon içinde yazacağımızı biliyoruz.Ancak "line edit" içine yazdığımız isimle resmi gösterebilmek için nasıl bir kod yazmalıyız? Bir önceki denememizde yazdığımız kodu hatırlayalım:

Kod:
def ac1(self):
	res1 = QtGui.QPixmap(  "resim-1.jpg" )
	ui.label.setPixmap(res1 )

Bu kodla "res1 = QtGui.QPixmap( "resim-1.jpg" )" resmimizin adını ve yerini tanımlıyorduk.Yapmamız gerek tek şey bu kodu "line edit" içinde yazılan yazıya eşitlemek.Bu eşitleme işlemini daha önceki denemelerimizde de yapmıştık.Yani yukarıda resmin adı yazan yere "ui.lineEdit.text()" yazmamız yeterli.Bu komut "line edit içine yazacağımız yazı adı ile resim.py dosyamızın olduğu yerde resim arayacak ve bulursa gösterecek.Ancak resim adını yazarken "resim1.jpg" yazmak kimsenin isteyeceği bir şey değil.O zaman bir şeyler daha yazıp kullanıcımızı bu dertten de kurtaralım.Eklememiz gerek şey dosyamızın uzantısı: " ui.lineEdit.text()+".jpg" ".Son olarak da yazdığımız yazının silinmesini de isteriz ki bir daha biz silmekle uğraşmayalım.O kodusa daha önceki denemelerimizden hatırlıyor olmalıyız: "ui.lineEdit.clear()"

Yani kodumuzun son hali şu:

Kod:
	def ac(self):
	        res1 = QtGui.QPixmap(ui.lineEdit.text()+".jpg")
	        ui.label.setPixmap(res1 )
		ui.lineEdit.clear()

Burada resim adı için sadece "line edit" kullanacağımız için başka bir koda ihtiyacımız yok.Hepsi bu kadar. Yapmamız gereken tek şey bu fonksiyonu bir sınıf içine yazmak:

Kod:
class resim:
	def __init__(self, ui):
		self.ui = ui
	
	def ac(self):
	        res1 = QtGui.QPixmap(ui.lineEdit.text()+".jpg")
	        ui.label.setPixmap(res1 )
		ui.lineEdit.clear()


Şimdi sıra yazdığımız kodları "line edit" e atamak da.Aslında daha önceki bölümleri okumuşsanız buradan sonra neler yapacağımızı artık çok iyi biliyorusnuzdur.Dosyadan aşağıda verdiğim bölümü bulun:

Kod:
        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"),MainWindow.close)
        QtCore.QObject.connect(self.lineEdit,QtCore.SIGNAL("returnPressed()"),MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

"Line edit" in içinde geçtiği komutun en son bölümünü

Kod:
MainWindow.close

silip

Kod:
self.resim.ac  (resim sınıfımız, ac bu sınıf içindeki fonksiyonumuz: Yukarıda yazdığımız kodlar) 

kodunu yazıyoruz.


Son olarak da

Kod:
self.retranslateUi(MainWindow)

yazısını hemen altına

Kod:
self.resim = resim(self)

yazıyoruz.

Yani son hali şöyle:

Kod:
        self.retranslateUi(MainWindow)
	self.resim = resim(self)
        QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"),MainWindow.close)
        QtCore.QObject.connect(self.lineEdit,QtCore.SIGNAL("returnPressed()"),self.resim.ac)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

Son olarak dosyanın en üstüne şu kodları ekliyoruz:

Kod:
import random, sys

Artık programımız çalışır durumda.Programı çalıştırmak için resim.py dosyasının olduğu dizinde konsolda şu komutu verin:

Kod:
python resim.py

Resim:Res-7.jpg Resim:Res-8.jpg Resim:Res-9.jpg


Karşılaştığınız sorunlar için forumda açtığım konuya yazabilirsiniz.

Adres: http://forum.pardus-linux.org/viewtopic.php?p=86032#86032