PYQT Denemeleri-8

Pardus-Linux.org | Wiki sitesinden

Git ve: kullan, ara

Giriş

Bu çalışmamızda 7. denemelerimizdeki resim gösteren programımızın bir benzerini yapacağız ancak bu sefer resim değil metin göstereceğiz. Yani şöyle bir şey yapacağız:

Resim:Resss-8.jpg

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 iki adet "push button" , "display widgets" bölümünden bir adet "label" ve bir adet "Text Browser", "Item widgets" bölümünden bir adet "list widget" 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:Resss-1.jpg

Daha sonra yerleştirdiniz parçacıklara çift tıklayarak isimlerini resimdeki gibi değiştirin.

Resim:Resss-2.jpg

Şimdi sıra düğmelere görev atamakta."Düzenle > Sinyal slot düzenle" yi tıklayın yada "f4" e basın."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.

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.

Aynı işlemi "Ekle" için de yapın.

Son olarak "list widget" parçacığına tıklayıp sürükleyin ve "label" parçacığı üzerinde bırakın.

Resim:Resss-3.jpg

Yeni bir pencere açılacak.Açılan pencerede birinci bölümden "currentTextChanged(QString)" seçip,, sağdaki bölümden "setText(QString)" seçip, tamam deyip kapatıyoruz.

Resim:Ress-4.jpg


Bu yaptığımız atama sayesinde "list widget" parçacığında yer alan elemanlardan hangisine tıklarsak o elemanın adı aynı anda "label" parçacığına yazacak.Bu sayede "text browser" da hangi dosyayı göstereceğimizi programımıza bildirdiğimizi daha önceki denememizden biliyorsunuz

Arayüzle işimiz bitti.Şimdi yaptığımız bu formu bir yere metin.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ı

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

Kod:
pyuic4 metin.ui -o metin.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.

metin.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.

Yedinci denememizden "list widget" parçacığına dizin içindeki dosyaları nasıl ekleyeceğimizi biliyorsunuz.Yapmamız gereken küçük bir değişiklik var: ".jpg" yazılarını ".txt" ile değiştirmek.Tabi ki dizin adımızı da değiştireceğiz.Yani kodumuzun son hali şöyle:

Kod:
def sor1(self):
	dizin = os.listdir("./metin")
	for metin in dizin:
		met = string.find(metin, ".txt")
		if met > 0:
			metin = string.strip(metin, ".txt")				
			ui.listWidget.insertItem(0,QtGui.QApplication.translate("MainWindow", metin, None, QtGui.QApplication.UnicodeUTF8))

Kodumuzun son bölümündeki şu satır

Kod:
(0,QtGui.QApplication.translate("MainWindow", metin, None, QtGui.QApplication.UnicodeUTF8)

dikkatinizi çekmiştir.

Bu kodun listemize ekleyeceğimiz isimlerin içinde geçen Türkçe karakterlerde sorun çıkmaması için kullanıldığını eğer daha önceki denemelerimizi dikkatle takip etmişseniz zaten biliyorsunuzdur.


Gelelim "text browser " içinde metnimizi nasıl göstereceğimize.Python ile bir metin dosyasını nasıl açacağımızı biliyoruz: metin = open("Fonksiyonlar.txt","r").Bu dosyada "for loop" sayesinde bütün satırlarda dolaşacağız ve bu satırları "textBrowser.insertPlainText()" komutu sayesinde "text Browser" a ekleyeceğiz.Ancak bu ekleme işi her defasında bir alt satıra ekleme şeklinde olacağı için "listemizde yeni bir isme tıkladığımızda o dosyanın içindekileri de en alta ekleyecektir.Bunu engellemek için her yeni isim tıklanmasında "textBrowser" içeriğini temizlemek için bie bir kod gerekli:" textBrowser.clear() "

Burada olduğu gibi ( metin = open("Fonksiyonlar.txt","r") ) sabit bir isim verirsek her defasında aynı dosya açılır.Bunu engellemek için "label" parçacığına atanan ismi kullanacağız.Yani:

Kod:
a = ui.label.text()
metin = open("./metin/"+a+".txt","r")

metin.py ve metin dizininin aynı dizin içinde olduğunu hatırlatayım:

Resim:Resss-5.jpg


Ve ikinci fonksiyonumuzun son hali:

Kod:
def sor2(self):
	ui.textBrowser.clear()
	a = ui.label.text()
	metin = open("./metin/"+b+".txt","r")
	for b in metin:
		ui.textBrowser.insertPlainText(QtGui.QApplication.translate("MainWindow", b, None, QtGui.QApplication.UnicodeUTF8))


Son kodun (QtGui.QApplication.translate("MainWindow", b, None, QtGui.QApplication.UnicodeUTF8)) uzun olmasının sebebini biliyorsunuz değil mi?

Fonksiyonlarımızı bir sınıf içine yazıyoruz:

Kod:
class metin:

	def __init__(self, ui):
		self.ui = ui
			
	def sor1(self):
		dizin = os.listdir("./metin")
		for metin in dizin:
			met = string.find(metin, ".txt")
			if met > 0:
				metin = string.strip(metin, ".txt")				
				ui.listWidget.insertItem(0,QtGui.QApplication.translate("MainWindow", metin, None, QtGui.QApplication.UnicodeUTF8))	
	def sor2(self):
		ui.textBrowser.clear()
		a = ui.label.text()
		metin = open("./metin/"+a+".txt","r")
		for b in metin:
			ui.textBrowser.insertPlainText(QtGui.QApplication.translate("MainWindow", b, None, QtGui.QApplication.UnicodeUTF8))

Şimdi sıra yazdığımız kodları "Ekle" tuşuna ve "list widget" parçacığına atamak da.Aslında daha önceki bölümleri okumuşsanız buradan sonra neler yapacağımızı artık çok iyi biliyorsunuzdur.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.pushButton_2,QtCore.SIGNAL("clicked()"),MainWindow.close)
        QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentTextChanged(QString)"),self.label.setText)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

Biz "def retranslateUi(self, MainWindow):" yardımıyla biliyoruz ki:

Kod:
ui.pushButton  = (Ekle tuşu)

Bu tuşun içinde geçtiği komutun en son bölümünü

Kod:
MainWindow.close

silip (ui.pushButton_2 = (kapat) a dokunmuyoruz o zaten kapatmak için kullanılacak)

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

kodunu yazıyoruz. Burayı :

Kod:
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentTextChanged(QString)"),self.label.setText)

kopyalayıp

bir altına yapıştırıyoruz ve son bölümünü

Kod:
self.label.setText

şununla

Kod:
self.metin.sor2

değiştiriyoruz.

Bu kopyalama ile yaptığımız şey "List widget" a tıkladığımızda "label " a isim yazmamızı sağlayan sinyalin aynı zamanda " text browser" da metin göstermek için yazdığımız fonksiyonun da çalışması için sinyal göndermesini sağlamak.

Son olarak da

Kod:
self.retranslateUi(MainWindow)

yazısını hemen altına

Kod:
self.metin = metin(self)

yazıyoruz.

Yani son hali şöyle:

Kod:
        self.retranslateUi(MainWindow)
	self.metin = metin(self)
        QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.metin.sor1)
        QtCore.QObject.connect(self.pushButton_2,QtCore.SIGNAL("clicked()"),MainWindow.close)
        QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentTextChanged(QString)"),self.label.setText)
	QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentTextChanged(QString)"),self.metin.sor2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

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

Kod:
import  sys, os, string

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

Kod:
python metin.py

Resim:Resss-6.jpg Resim:Resss-7.jpg Resim:Resss-8.jpg Resim:Resss-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