PYQT Denemeleri-1

Pardus-Linux.org | Wiki sitesinden

(PYQT Denemeleri sayfasından yönlendirildi)
Git ve: kullan, ara

Konu başlıkları

Giriş

Pyqt, Qt programının python için uyarlanmış halidir diyebiliriz. Pyqt ile ilgili birçok ingilizce örnek var. Türkçe pyqt örneklerine linuxnet.com.tr, ceturk.com, turkpython.net gibi sitelerden ulaşabilirsiniz. Ben de yaptığım uygulamaları buraya yazmaya çalışacağım.Bu sayede hem Türkçe kaynaklara destek olmuş olurum, hem de anlatarak öğrendiklerimi daha pekiştirmiş olurum diye düşünüyorum.Daha yeni başladığım için söylediklerim kesin doğrudur diye bir iddiam yok.

Uygulamaları qt designer ve python kullanarak oluşturmaya çalışacağım.

Hazırlık

Eğer kurulu değilse paket yöneticisinden PyQt4 ve qt4-designer paketlerini kurun.Pardus > geliştirme > qt4 tasarımcı programını çalıştırın.

Arayüzün Oluşturulması

Hazırladığımız program python ile yazılmış bir oyun.Program kendiliğinden bir sayı seçiyor siz de tahmin etmeye çalışıyorsunuz.Sayılar yazıyorsunuz.Yazdınız sayıya göre "daha küçük, daha büyük" diyerek size yol gösteriyor ve sonuçta sayıyı buluyorsunuz.Bu programın python kodu şöyle:

Kod:
soru = random.randrange(0,100)
cevap = int(raw_input('Tahmininizi yazın : '))
if cevap < soru:
    print "Daha büyük!"
elif cevap > soru:
    print "Daha küçük!"
else:
    print "Doğru cevap!"

Ancak python kodları işimize yaramayacak.Yada biraz değiştirmemiz gerekecek diyelim.Bu kodlarda kullanılan raw_input ve print komutları yerine kullanıcıdan bilgi almak için "lineEdit", yazdırmak için ise "label" ifadelerini kullanacağız.

Ö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-1.png

Soldaki parçacık kutusu bölümünden ""Buttons" bölümünden üç adet "push button" , "input widgets" bölümünden bir adet "line edit", "display widgets" bölümünden iki adet "label" 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. Resim-2.png

Daha sonra Yerleştirdiniz parçacıklara çift tıklayarak isimlerini resimdeki gibi değiştirin. Resim-3.png

Ş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-4.png

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-5.png

Aynı işlemi "sor" tuşu için yapın.Ve aynı işlemi "kontrol et" tuşu için de yapın.Aslında sor ve kontrol et tuşlarına başka bir görev vereceğiz.Ama şimdilik böyle yapalım.Kodlarla uğraşırken burayı değiştireceğiz.

Cevabı kontrol etmek için sürekli kontrol et tuşuna basmak sıkıcı olur.Bu yüzden "enter " tuşuna bastığımızda da aynı işlemin yapılmasını istiyoruz bunu yapmak için ""Line edit" i seçip bırakmadan sürüklüyoruz ve kontol et tuşu üzerinde bırakıyoruz.Açılan pencerede soldan "returpressed()" , sağdan "animate click()" seçiyoruz: Resim-6.png

Arayüzle işimiz bitti.Yaptığımız bu formu bir yere oyun.ui uzantısı ile kaydedin.İsim önemli değil ama son ek ".ui" olmalı.

Kodların Ayarlanması

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

Kod:
pyuic4 oyun.ui -o oyun.py

Artık elimizde az önce yaptığımız formun kodları var.Ancak bu kodlar henüz hazır değil, bir kaç düzenleme yapmamız gerekiyor.

Oyun.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.Yukarıda verdiğimiz python kodlarını düzenleyeceğiz.Az öncede söylediğimiz gibi "raw_input" yerine "line edit", " print" komutu yerine "label" kullanacağız.

Kod:
cevap = int(ui.lineEdit.text())
if cevap < soru:
	ui.label_2.setText(u"Daha büyük!")
elif cevap > soru:
	ui.label_2.setText(u"Daha küçük!")
else:
	ui.label_2.setText(u"Doğru cevap!")

"lineEdit.text()" bu komutla kullanıcıdan veri alıyoruz."label_2.setText()" bu komutla istediğimiz şeyi yazdırıyoruz. Türkçe karakterlerde sorun çıkartmaması için metinlerde u"" kullanılır. Değişkenler için unicode().encode ya da "".decode kullanılır. Değişken için şöyle yazılır :

unicode(ui.label_2.setText(degisken)).encode('utf-8')

Burada yazdığımız komutlar sadece yazdığımız sayının kontrol edilmesi için.Birde yeni sayı sorulması için bir kod yazmamız gerekiyor:

Kod:
soru = random.randrange(0,100)

Bu komutları düğmelere atayabilmek için önce fonksiyon olarak tanımlamamız sonra da bu fonksiyonları sınıf içine almamız gerekiyor. Yani kodlarımızın son hali şöyle:

Kod:
class oyun:
	def __init__(self, ui):
		self.ui = ui
	
	def say(self):
		global soru
		soru = random.randrange(0,100)
		ui.label_2.setText(u"Bir sayı tuttum, bulun bakalım!") 	
	
	def sor(self):
		cevap = int(ui.lineEdit.text())
		ui.lineEdit.clear()
		if cevap < soru:
			ui.label.setText(u"Daha büyük!")
		elif cevap > soru:
			ui.label.setText(u"Daha küçük!")
		else:
			ui.label.setText(u"Doğru cevap!\nYeni sayı için \"Sor\" tuşuna basın!") 

Burada "ui.lineEdit.clear()"komutu sayıyı yazdıktan sonra sayının silinmesini sağlıyor.Yani yeni sayı yazmak için eskisini silmekle uğraştırmıyor bizi. Bu kodları sayfamızın en üstüne ekliyoruz.

Şimdi sıra yazdığımız kodları düğmelere atamak da.Dosyadan aşağıda verdiğim bölümü bulun:

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

Bu bölümü aşağıda verdiğim şekilde değiştirin:

Kod:
self.retranslateUi(MainWindow)
self.oyun = oyun(self)
QtCore.QObject.connect(self.pushButton_3,QtCore.SIGNAL("clicked()"),MainWindow.close)
QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.oyun.say)
QtCore.QObject.connect(self.lineEdit,QtCore.SIGNAL("returnPressed()"),self.pushButton_2.animateClick)
QtCore.QObject.connect(self.pushButton_2,QtCore.SIGNAL("clicked()"),self.oyun.sor)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

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

Kod:
import random, sys

Eğer "pushbutton " veya "label" ları karıştırıyorsanız en altta düğmelerin ve etiketlerin üzerine yazdığımız yazılar sayesinde hangi düğmenin hangisi olduğunu bulabilirsiniz:

Kod:
self.pushButton_3.setText(QtGui.QApplication.translate("MainWindow", "Kapat", None, QtGui.QApplication.UnicodeUTF8))

Buradan "pushButton_3" ün üzerinde "kapat" yazan tuş olduğunu anlıyoruz.

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

Kod:
python oyun.py

Resim-7.png Resim-8.png Resim-9.png 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