PYQT Denemeleri-2
Pardus-Linux.org | Wiki sitesinden
Giriş
Bu çalışmamızda da ilk çalışmamızdaki python kodunu kullanacağız ama biraz daha gelişmiş halini.İlk denememizde oyun 0-99 arası sayıları soruyordu.Bu sayı aralığını biz belirlemesek de kullanıcı belirlese.Yani ona seçme şansı versek.Kısacası Python kodumuz şöyle olacak:
| Kod: |
import random
print "1-) 0-100 Arası sayılar"
print "2-) 100-500 Arası sayılar"
print "3-) 500-1000 Arası sayılar"
sec =raw_input("Hangi sayılarla oynamak istersiniz :")
if sec == "1":
soru = random.randrange(0,100)
if sec == "2":
soru = random.randrange(100,500)
if sec == "3":
soru = random.randrange(500,1000)
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!"
|
Arayüzün Oluşturulması
Python kodunda çok büyük değişiklikler yapmadık ama arayüz oluşturmaya çalışırken işimiz biraz karışacak.İlk denemede kaydettiğimiz "oyun.ui" dosyasını açalım. Öncelikle qt4 tasarımcıyı açalım, açınca açılan ilk pencerede aşağıdaki "Aç" tuşuna basıp daha önce kaydettiğimiz "oyun.ui"dosyasına tıklayın ve karsımıza son kaydettiğimiz hali ile gelsin.Eğer sildiyseniz birinci denemedeki "arayüzün oluşturulması bölümünü okuyarak tekrar oluşturabilirsiniz."Şu anda önünüzdeki görüntü şöyle olmalı:
Şİmdi soldaki parçacık kutusu bölümündeki ""Buttons" bölümünden üç adet "push button","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.
Daha sonra yerleştirdiniz parçacıklara çift tıklayarak isimlerini resimdeki gibi değiştirin.
Birinci bölümde yaptığımız gibi yeni düğmelerimize görev atayacağız.Yani "Düzenle > Sinyal slot düzenle" yi tıklayın yada "f4" e basın.Resimde görüldüğü gibi "seç-1" 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.
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.
Aynı işlemi "seç-2 ve seç-3" tuşu için de yapın.
Arayüzle işimiz bitti.Yaptığımız bu formu kaydedin daha önce formun üstüne de kaydedebilirsiniz isterseniz başka isimle de kaydedebilirsiniz.
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.Şimdi düzenleme yapma zamanı.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.
"if sec" bölümlerini değiştireceğiz ve bunları "seç-1", "seç-2", "seç-3" tuşlarına görev olarak atamamız gerektiği için bu kodları fonksiyon içinde yazacağız.Yani:
| Kod: |
def sec1():
soru = random.randrange(0,100)
def sec2():
soru = random.randrange(100,500)
def sec3():
soru = random.randrange(500,1000)
|
Kodların ikinci bölümü içinse ilk denemedeki kodları yazacağız ama o da biraz değişecek.Bu ilk denememizdeki kodlar:
| 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!") |
Bu kodlarda yer alan "say" fonksiyonuna ihtiyacımız yok artık.Çünkü onun yaptığı işi yeni yazdığımız "seç-1", "seç-2", "seç-3" fonksiyonları yapacak.Ancak say fonksiyonu içindeki
| Kod: |
ui.label_2.setText(u"Bir sayı tuttum, bulun bakalım!") |
ve
| Kod: |
global soru |
ifadeleri bize gerekli.Birincisi bize biraz sonra lazım olacak onu şimdilik kenarda bekletelim.İkincisini alıp "seç-1", "seç-2", "seç-3" fonksiyonları içine yazıyoruz.Sor fonksiyonunu ise değiştirmeden alıyoruz(Doğru cevap verildiğinde "sor tuşuna basın" yazılı yeri silin!).Temel olarak yazmamız gereken kodlar bitti ama eğer bu şekilde çalıştırırsak kodları şöyle bir pencere ile karşılaşırız:
ve oyun esnasında seç tuşları ve sayı aralıklarını gösteren etiketler orada öylece durur.Mide bulandırıcı bir durum.Bu durumdan çok basit bir kodla kurtulabiliriz.
| Kod: |
ui.label.hide() ui.pushButton.hide() |
bu kodla istediğimiz şeyi istediğimiz anda gizleyebiliriz.Bu kodlarla "seç-1", "seç-2", "seç-3" tuşlarını gizlemeyi düşünüyoruz.Aklımıza şöyle bir şey de gelebilir:Oyun ilk açıldığında sadece "seç-1", "seç-2", "seç-3" tuşları ve etiketleri görünse...Bunu yapmak yukarıdaki kodla mümkün ancak seçimden sonra gizlediğimiz şeyleri tekrar ortaya çıkarmak gerekecek.O da şu kodla mümkün:
| Kod: |
ui.label.show() ui.pushButton.show() |
Yani oyuna girişte "seç-1", "seç-2", "seç-3" tuşları ve karşılarındaki etiketleri bırakıp diğerlerini gizleyeceğiz.Ama hangi parçacığın hangisi olduğunu nasıl bileceğiz?İlk denemede de söylediğim gibi oluşturduğumuz oyun.py dosyasını en altında "def retranslateUi(self, MainWindow):" diye bir fonksiyon var.Burası bize üzerinde yazan yazılar sayesinde hangi parçacığın aradığımız parçacık olduğunu söyleyecek.Mesela
| Kod: |
self.pushButton_4.setText(u"Seç-1") |
Bu ifadeden "Seç-1" tuşunun "pushButton_4" olduğunu anlıyoruz.
Peki girişte gizlenmesini istediğimiz parçacık komutlarını nereye yazıyoruz? En baştaki "def __init__(self, ui):" fonksiyonunu içine.Bu fonksiyonda nereden çıktı diye merak ediyorsanız yazdığımız komutları düğmelere atayabilmek için önce fonksiyon olarak tanımlamamız sonra da bu fonksiyonları sınıf içine almamız gerekiyor.İşte oluşturduğumuz sınıfın ilk fonksiyonu "def __init__(self, ui):" Gizlemek istediğimiz parçacıkları yerleştiriyoruz:
| Kod: |
class oyun:
def __init__(self, ui):
self.ui = ui
ui.pushButton.hide()
ui.pushButton_2.hide()
ui.lineEdit.hide()
|
Bu komutlarla "sor" ve "kontrol et" tuşlarını ve yazı yazdığımız "lineEdit" parçacıklarını gizledik.İlk denemeden hatırlayacağınız gibi oyun açıldığında başlaya bilmek için "sor" tuşuna basmamız gerekiyordu.O yüzden "Seç" tuşlarından birine bastığımızda karşımıza sadece sor tuşu gelse ve seçtiğimizin dışındaki sayı etiketleri ve seç tuşları da gizlense nasıl olur?Yani seç tuşuna bastıktan sonra karşınıza şyle bir pencere gelse istemez misiniz?
Bunu yapabilmek için "seç-1", "seç-2", "seç-3" tuşlarına atayacağımız fonksiyonların içine seçmeli olarak şu komutları yerleştirmeliyiz(def sec1 e seç-1 tuşunu atayacağız, bu mantıkla seç-1 tuşu karşısındaki "label_3"("def retranslateUi(self, MainWindow):" yardımıyla buldum) ü bırakıp diğerlerini gizliyeceğiz ve sor tuşunu göstereceğiz.Son olarak da "Sor tuşuna basın" yazısını "label_2"("def retranslateUi(self, MainWindow):" yardımıyla buldum) ye atayacağız):
| Kod: |
def sec1(self):
global soru
soru = random.randrange(0,100)
ui.pushButton_4.hide() (seç-1)
ui.pushButton_5.hide() (seç-2)
ui.pushButton_6.hide() (seç-3)
ui.label_4.hide() (100-500 Arası sayılar)
ui.label.hide() (500-1000 Arası sayılar)
ui.pushButton.show() (sor )
|
Bu etiket de tuş isimleri sizde farklı olabilir, ("def retranslateUi(self, MainWindow):" bölümünden yardım alın. Diğer "sec" fonksiyonlarını da siz uygun şekilde ayarlayın.Mantık olarak üç "label"dan birine dokunmayıp diğerlerini gizleyeceksiniz.
Şimdi ise sıra "Sor" tuşuna bastığımızda etiketi ve "sor" tuşunu gizleyip bize gereken parçacıkları gösterecek fonksiyonda.Ve bu fonksiyona biraz yukarıda "biraz sonra bize lazım olacak" dediğimiz kodu da ekliyoruz.:
| Kod: |
def goster():
ui.pushButton_2.show()
ui.pushButton.hide()
ui.lineEdit.show()
ui.label.show()
ui.label.setText("...")
ui.label_2.setText(u"Bir sayı tuttum, bulun bakalım!")
|
"ui.label.setText("...") " bu kodla bu etiketteki yazıyı silip "..." haline getiriyoruz.Çünkü yazdığımız sayıların büyük küçük olduğunu bize bu etiket söyleyecek.
Ve yazdığımız kodun son hali:
| Kod: |
class oyun:
def __init__(self, ui):
self.ui = ui
ui.pushButton.hide()
ui.pushButton_2.hide()
ui.lineEdit.hide()
def sec1(self):
global soru
soru = random.randrange(0,100)
ui.pushButton_4.hide()
ui.pushButton_5.hide()
ui.pushButton_6.hide()
ui.label_4.hide()
ui.label.hide()
ui.pushButton.show()
soru = random.randrange(0,100)
ui.label_2.setText(u"Oyuna başlamak için \"Sor\" tuşuna basın!")
def sec2(self):
global soru
ui.pushButton_4.hide()
ui.pushButton_5.hide()
ui.pushButton_6.hide()
ui.label_3.hide()
ui.label.hide()
ui.pushButton.show()
soru = random.randrange(100,500)
ui.label_2.setText(u"Oyuna başlamak için \"Sor\" tuşuna basın!")
def sec3(self):
global soru
ui.pushButton_4.hide()
ui.pushButton_5.hide()
ui.pushButton_6.hide()
ui.label_4.hide()
ui.label_3.hide()
ui.pushButton.show()
soru = random.randrange(500,1000)
ui.label_2.setText(u"Oyuna başlamak için \"Sor\" tuşuna basın!")
def goster(self):
ui.pushButton_2.show()
ui.pushButton.hide()
ui.lineEdit.show()
ui.label.show()
ui.label.setText("...")
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!")
|
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.Bunu ilk denememizden hatırlıyoruz.
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.QObject.connect(self.pushButton_4,QtCore.SIGNAL("clicked()"),MainWindow.close)
QtCore.QObject.connect(self.pushButton_5,QtCore.SIGNAL("clicked()"),MainWindow.close)
QtCore.QObject.connect(self.pushButton_6,QtCore.SIGNAL("clicked()"),MainWindow.close)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
Biz "def retranslateUi(self, MainWindow):" yardımıyla biliyoruz ki:
| Kod: |
ui.pushButton = (sor) ui.pushButton_2 = (kontrol et) ui.pushButton_3 = (kapat) ui.pushButton_4 = (seç-1) ui.pushButton_5 = (seç-2) ui.pushButton_6 = (seç-3) |
Bu tuşların içinde geçtiği komutların en son bölümünü
| Kod: |
MainWindow.close |
silip (ui.pushButton_3 = (kapat) a dokunmuyoruz o zaten kapatmak için kullanılacak)
| Kod: |
self.oyun.sec1 gibi |
kodlarımızı yazıyoruz. Son olarak da
| Kod: |
self.retranslateUi(MainWindow) |
yazısını hemen altına
| Kod: |
self.oyun = oyun(self) |
yazıyoruz. Yani son hali şöyle:
| 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.goster)
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.QObject.connect(self.pushButton_4,QtCore.SIGNAL("clicked()"),self.oyun.sec1)
QtCore.QObject.connect(self.pushButton_5,QtCore.SIGNAL("clicked()"),self.oyun.sec2)
QtCore.QObject.connect(self.pushButton_6,QtCore.SIGNAL("clicked()"),self.oyun.sec3)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
Son olarak dosyanın en üstüne şu kodları ekleyin:
| Kod: |
import random, sys |
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 |
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
Bu yazı PYQT Denemeleri bölümünün bir parçasıdır.
| 1. PYQT Denemeleri-1 | 2. PYQT Denemeleri-2 |
| 3. PYQT Denemeleri-3 | 4. PYQT Denemeleri-4 |
| 5. PYQT Denemeleri-5 | 6. PYQT Denemeleri-6 |
| 7. PYQT Denemeleri-7 | 8. PYQT Denemeleri-8 |
| 9. PYQT Denemeleri-9 | 10. PYQT Denemeleri-10 |









