Hızlı Sözlük Uygulaması - v0.1 :)

Başlatan Jey@Nfer, 25 Aralık 2012 - 10:14:52

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

Jey@Nfer

Aslında hızlı olmasından ziyade " efektif sözlük " diyebiliriz :)

Bir kaç gündür gtk çalışıyordum , bi yandan da bir kitap çevirisi yapmaya çalışıyordum. Hal böyle olunca aklıma ihtiyacım olan bir şeyi kendim yapmak geldi :)
Evet , sözlük yazacaktım :)

Bir kitap çevirisi yapıyorsanız , bilmediğiniz kelimeler çoksa sözlük karıştırmak işkenceye dönüyor. Hele ki istediğiniz kelimenin anlamını nette tam olarak bulamıyorsanız. Ben de tuttum tam olarak kendi ihtiyaçlarıma karşılık verebilecek , hızlı ve aynı zamanda nette tam karşılığınıı bulamadığım kelimeleri kendi lokal bilgisayarıma istediğim gibi kaydedebileceğim bir sözlük yazmaya karar verdim.

Öncelikle genel özelliklerinden bahsedeyim (zaten bir kaç özelliği var :) ):
** Aramak istediğiniz kelimeyi herhangi bir yere yazmak zorunda değilsiniz ; mouse ile seçin ve sözlük için atadığınız kısayol tuşuna basın ; aradığınız kelimenin anlamı karşınızda.
** Bunun yanında isterseniz arayıcı penceresinden, kelimeyi yazarak da arayabilirsiniz
** Aramalarınızı , istediğiniz gibi editleme ve yerel sözlük dosyasına kaydetme imkanı 
** Aradığınız kelime yerel sözlük dosyanızda kayıtlıysa , internetteki değil sizin dosyanızdaki karşılığını gösterecektir
** Kelimeleri "www.tureng.com" sitesinden arar ; eğer kelime yerel sözlük dosyanızda varsa yerel dosyadaki anlamı gösterir
** Ayrıca çıkan sonuçların olağanca temiz olmasına çalıştım , mesela aynı kelime veya aynı anlam iki defa kaydedilmiyor; sade yani

Bir de program kanımca diğer sözlük uygulamalarının yanında hayli küçük :) Sistemi pek kastığını düşünmüyorum . Hatta benim gözüme o kadar küçük geldi ki ; ekran görüntüsü koyacaktım "Zaten küçücük bi pencere , koysan neresini koycan " diyip koymadım :)

Kodları koyayım bari ;)
Aslında kodlar iki parçadan oluşuyor , sozluk.py dosyası ve arayici.py dosyası.

sozluk.py dosyası kodları :

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from os.path import expanduser
import sys
import pygtk
pygtk.require20()
import gtk

class Uygulama(object):
def __init__(self):
self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.pencere.connect("delete_event", self.kapat)
self.pencere.set_title(" HIZLI SÖZLÜK V(0.1) ")

self.dugEkle = gtk.Button("Ekle")
self.dugSil = gtk.Button("Sil")
self.dugEkle.connect("pressed", self.bEkle)
self.dugSil.connect("pressed", self.Silgi)

self.kSolAlt = gtk.HBox()
self.kSol = gtk.VBox()

self.pencere.resize(500,50)

self.kSolAlt.pack_start(self.dugEkle)
self.kSolAlt.pack_start(self.dugSil)

self.combobox = gtk.combo_box_new_text()

self.kSol.pack_start(self.combobox)

for i in sozluk.keys():
self.combobox.append_text(i)

self.combobox.set_active(0)
self.combobox.connect('changed', self.changed_cb)


self.kSol.pack_start(self.kSolAlt)

self.sw = gtk.ScrolledWindow()
self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.textview = gtk.TextView()
self.textview.set_wrap_mode(gtk.WRAP_WORD)
self.textbuffer = self.textview.get_buffer()
self.sw.add(self.textview)
self.sw.show()
self.textview.show()
self.textbuffer.set_text(mesaj)
self.textview.set_editable(False)

self.duzenle = gtk.CheckButton("Duzenle")
self.duzenle.set_active(False)
self.duzenle.connect("toggled", self.duzenleye_basinca)

self.hazne=gtk.Fixed()
self.hazne.put(self.kSol, 0,  0)

self.tablo = gtk.Table(2, 2, False)
self.tablo.attach(self.hazne, 0, 1, 0, 2, gtk.SHRINK , gtk.SHRINK)
self.tablo.attach(self.sw, 1, 2, 0, 1 )
self.tablo.attach(self.duzenle, 1,2,1,2, gtk.SHRINK , gtk.SHRINK)

self.pencere.add(self.tablo)

self.pencere.show_all()
return

def bEkle(self, penar):
self.deger = self.textbuffer.get_text(self.textbuffer.get_start_iter() , self.textbuffer.get_end_iter())
self.anahtar = self.combobox.get_active_text()
dosyaya_ekle(self.anahtar,self.deger)


def Silgi(self, penar):
self.anahtar = self.combobox.get_active_text()

index=self.combobox.get_active()
model = self.combobox.get_model()

self.combobox.remove_text(index)
self.combobox.set_active(0)

try:
self.textbuffer.set_text( sozluk[model[index][0]] )
except :
self.combobox.append_text("!!!")
self.combobox.set_active(0)
self.textbuffer.set_text("Bütün Öğeler Silindi!")

dosyayadan_sil(self.anahtar)

def changed_cb(self, combobox):
model = combobox.get_model()
index = combobox.get_active()
self.textbuffer.set_text( sozluk[model[index][0]] )
return
       
def duzenleye_basinca(self, arac):
self.textview.set_editable(arac.get_active())

def kapat(self, penar, event):
dosya=open(adres, "w")
for i in icindekiler:
dosya.write(i)
dosya.close()

gtk.main_quit()

def main(self):
gtk.main()

def dosyaya_ekle(anahtar,deger):
global icindekiler
global sozluk

sozluk[anahtar] = deger
varmi=0
yeni=[]
deger="".join(deger.split("\n"))

for i in icindekiler:
if anahtar == i.split(" : ")[0]:
i= anahtar + " : " + deger +"\n"
varmi +=1
yeni +=[i]

if varmi==0:
deger=anahtar + " : " + deger +"\n"
yeni += [deger]

icindekiler=[]
for i in yeni:
icindekiler+=[i]


def dosyayadan_sil(anahtar):
global icindekiler

yeni=[]
for i in icindekiler:
if anahtar != i.split(" : ")[0]:
yeni += [i]
icindekiler=[]
for i in yeni:
icindekiler+=[i]


def nette_ara():
import urllib
import urllib2

global mesaj
global sozluk

kok="http://www.tureng.com/search/"+kelime

try:
cevap = urllib2.urlopen(kok)
except:
mesaj="""Aradığınız sözcük yerel dosyada yok! Ve internetiniz olmadığı için online arama yapılamadı! Sözcüğü eklemek için "düzenle" butonunu aktifleştirip istediğiniz cümleyi yazdıktan sonra "Ekle" butonuna tıklayın!"""
sozluk[kelime]=mesaj
return

kaynak = cevap.read()

if "</table>" not in kaynak: #internette de bulunamadıysa
mesaj="""Aradığınız sözcük bulunamadı! Eklemek için "düzenle" butonunu aktifleştirip istediğiniz cümleyi yazdıktan sonra "Ekle" butonuna tıklayın!"""

else: #bulduklarını stringe atıyor
kaynak=kaynak.split("</table>")
kaynak=kaynak[0]
kaynak=kaynak.split('<table class="searchResultsTable"')
kaynak=kaynak[1]
kaynak=kaynak.split('<td class="tr ')
del kaynak[0]
for i in kaynak:
i=i.split('">')
i = str(i[2].split('</a>')[0])
if i not in mesaj :
mesaj += i + ", "


mesaj="ç".join(mesaj.split("ç"))
mesaj="ü".join(mesaj.split("ü"))
mesaj="ö".join(mesaj.split("ö"))
mesaj="'".join(mesaj.split("'"))

sozluk[kelime]=mesaj

yol=expanduser("~")

try:
kelime=sys.argv[1]
except:
kelime="!!SECIM!!"

adres=yol+"/sozluk.txt"

sozluk={}

dosya=open(adres, "a+")
icindekiler=dosya.readlines()
dosya.close()

ilk=None
mesaj=""

for i in icindekiler:
i=i.split(" : ")
if kelime in i[0]:
sozluk[i[0]]=i[1]
if not ilk:
ilk=i[0]

if ilk:
mesaj=sozluk[ilk]

elif kelime=="!!SECIM!!":
mesaj='Bir kelime seçmediniz! Eğer hızlı aramayı kullanıyorsanız arayacağınız kelimeyi seçmelisiniz. Hızlı arama özelliğini ev dizininizdeki sozluk.data içindeki değeri "False" yaparak devre dışı bırakabilirsiniz.'
sozluk[kelime]=mesaj
else:
nette_ara()

uyg = Uygulama()
uyg.main()


arayici.py kodları :

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
import pygtk
pygtk.require20()
import gtk

aranan=""

def Ayarla(yazi):
global aranan
aranan=yazi

class YerelSecim (object):
def __init__(self):
self.pencere=gtk.Window(gtk.WINDOW_TOPLEVEL)

self.eventbox = gtk.EventBox()
self.eventbox.connect("selection_received", self.selection_received)
self.eventbox.show()

self.pencere.add(self.eventbox)

def selection_received(self, widget, selection_data, data):
if str(selection_data.type) == "STRING":
Ayarla(selection_data.get_text())
else:
Ayarla("")

self.kapat()
return False       

def kapat(self):
gtk.main_quit()

def main(self):
gtk.main()

secim=YerelSecim()
secim.eventbox.selection_convert("PRIMARY", "STRING")
secim.main()

class Uygulama(object):
def __init__(self):
self.pencere = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.pencere.connect("delete_event", gtk.main_quit )
self.pencere.set_title("ARAYICI")
self.pencere.resize(175,50)
self.pencere.set_resizable(False)

self.dugAra = gtk.Button("Ara")
self.dugHk = gtk.Button("Hakkında")
self.entry = gtk.Entry()
self.entry.set_text(aranan)
self.entry.set_property("primary-icon-stock", gtk.STOCK_FIND)

self.dugAra.connect("pressed", self.Arayici)
self.dugHk.connect("pressed", self.Bilgilendirici)

self.kSolAlt = gtk.HBox()

self.kSolAlt.pack_start(self.dugAra)
self.kSolAlt.pack_start(self.dugHk)

self.tablo = gtk.Table(2, 1, False)
self.tablo.attach(self.entry, 0, 1, 0, 1 )
self.tablo.attach(self.kSolAlt, 0, 1, 1, 2 )

self.pencere.add(self.tablo)

self.pencere.show_all()
return

def Arayici(self, penar):

text=self.entry.get_text()

if text == "" or text.isspace() :
info = gtk.MessageDialog(buttons=gtk.BUTTONS_OK)
info.set_property('title', '')
info.set_property('text', 'Arama metni girmediniz!')
info.run()
info.destroy()

else:
os.system("python %s" %yol+" "+text )

def Bilgilendirici(self, penar):
about = gtk.AboutDialog()
about.set_program_name("HIZLI SÖZLÜK")
about.set_version("0.1")
about.set_comments("""
"sozluk.py" dosyasını ev dizininize kopyalayın.

"arayici.py" dosyasını kısayol atayarak ,
tıklayarak veya konsoldan çalıştırabilirsiniz.

İki şekilde kullanabilirsiniz:
1-) Mouse ile seçtiğiniz kelimeyi doğrudan arayabilirsiniz :
Bunu yapmak için ; "arayici.py" dosyasına bir kısayol
atayın. Ev dizininizdeki "sozluk.data" içinde yer alan
değeri de "True" yapın. Böylece ARAYICI penceresi
gelmeden doğrudan sözlük penceresi açılır.
BU YÖNTEMİ KULLANIYORSANIZ KISAYOL İLE ÇALIŞTIRMADAN ÖNCE MOUSE İLE
BİR ALANI SEÇMİŞ OLMANIZ GEREKİR. YOKSA ÇALIŞMAYACAKTIR.

2-) Veya da ARAYICI 'yı kullanabilirsiniz:
Bunun için ;
Ev dizininizde yer alan "sozluk.data" içindeki değer "False" olmalı.

HATIRLATMALAR:
** YAPTIĞINIZ DEĞİŞİKLİĞİN YEREL SÖZLÜK DOSYANIZDA AKTİF OLMASI İÇİN "EKLE" BUTONUNA TIKLAMANIZ GEREKLİ/YETERLİ
** ARAYICI.PY VE SOZLUK.PY DOSYALARININ "ÇALIŞTIRILABİLİR" (EXECUTABLE) OLMASINA DİKKAT EDİN
""")
about.set_website("http:www.python-c.com")
about.set_authors([" Mehmet Vahit KAPAR\n <m.vahit.kapar@gmail.com>"])
infos = {
"title": "Hızlı Sözlük Hakkında",
"wrap-license": True }
about.run()
about.destroy()

def main(self):
gtk.main()

yol=os.path.expanduser("~")

dosya=open(yol+"/sozluk.data", "a+")
sonuc=dosya.read()
dosya.close()
yol += "/sozluk.py"

sonuc=sonuc[:4]

if sonuc == "True" :
os.system("python %s" %yol+" "+aranan )

else :
uyg = Uygulama()
uyg.main()


Kodları sozluk.py ve arayici.py dosyalarına kaydedin.
Veya da uğraşmadan şurdan indirin : http://code.google.com/p/hizlisozluk/downloads/list

Dosyaların her ikisinin de (chmod +x) ile çalıştırma yetkisi verildiğinden emin olun.
sozluk.py dosyasını ev dizininize kopyalayın ve arayici.py dosyası için de bir kısayol atayın (benim sistemim 12.04 ; galiba 12.04 lerde sistem ayarlarından-klavye-kısayollar yoluyla atadığınız kısayollar çalışmayabiliyor ; ben tweak ile " ctrl+alt+o " tuş kombinasyonuna "~/Desktop/arayici.py" komutunu atadım).
Artık yapmanız gereken şey çok basit ; aramak istediğiniz kelimeyi seçip kısayolu çalıştrırın. Arama ekranı karşınızda belirecek. İçinde de seçmiş olduğunuz kelime. "Ara" diyip arayabilirsiniz :) Veya da ev dizininizde oluşturulan "sozluk.data" içindeki değeri "True" yaparak hızlı aramayı aktifleştirebilir; arayıcı penceresi hiç gelmeden , doğrudan mouse ile seçtiğiniz kelimenin anlamını çekebilirsiniz!

Elimden geldiğince hata yakalamaya ve sadeliğe önem vermeye çalıştım arkadaşlar. İnternetin olmaması , arama kutusunun boş olması , hızlı aramada seçim yapılmamış olması , aranan kelimenin bulunamaması gibi durumlara karşı hata yakalama kullandım ancak gene de gözden kaçırdığım durumlar olabilir , zaten onun için versiyon 0.1 ;)

Ayrıca sadelik konusunda aklıma daha sade bir ekran gelmedi :) Çıkan kelimeleri göstermek için bir textbox, hatayla değişiklik yapmayı önlemek için bir "değiştir" kontrol butonu , yaptığınız değişiklikleri ve aramaları kaydedebilmek için bir ekleme, bulunan kelimeyi yerel dosyadan silmek için bir sil butonu ve birden çok değer bulunması durumunda bütün değerleri gösterebilmek için bir combobox. Bütün bunları daha sade biçimde gösterecek bir şekil bulamadım , sizin aklınıza gelirse tekrar editleriz :)

Bu kadarcık bilgiyle ancak bu kadar oluyor ;)
Hata gördüğünüz veya değişiklik istediğiniz durumlar varsa lütfen bildirmekten çekinmeyin ; versiyon 2'yi beraber çıkaralım ;)

A bir de "Hakkında" kutusu hakkında ; farkındayım, bozuk anlatım :) Ayrıca ordaki site de öyle bekleyip duruyor arkadaşlar , Django bilen veya öğrenmek isteyen bir arkadaş olursa mesaj atsın , bi şeyler yapak orda :)
Hırs , azim , tevekkül ...

www.mehmetvahit.net

guopx

çok güzel olmuş elinize sağlık :)
Bence .deb haline getirmelisiniz
Sevdiklerine sevdiğini söyle çok geç olmadan.

krwlng

#2
Elinize sağlık gayet güzel ve pratik olmuş. Tek sıkıntısı var o da kolayca çözülüyor, bende sozluk.data dosyası oluştu uygulamayı çalıştırınca fakat sozluk.txt dosyası otomatik oluşmadı, el ile oluşturunca sorun çözüldü, bir kaç yol değişikliği ile "Genel" dizininde çalışacak şekle getirdim, aslında ilerleyen zamanlarda sözlük seçme işlemi eklenebilir, zargan ve sesli sözlük gibi alternatifler seçime bağlı kullanılabilir, şu anki tablo okuma mantığını sesli sözlük üzerinde denedim fakat çalışmadı.

- Arama kısmında kelime yazınca "Enter" tuşu ile arama yapabilsek daha güzel olur bence.
- Arama yapıp arama detayı çıkınca arama yapılan pencere cevap vermeyen pencereler gibi kararıyor sanki hata varmış gibi.
- Arama yapınca gelen bilgiler farklı değilde aynı pencerenin alt kısmında çıksa daha hoş olabilir.

Bunlar benim fikirlerim, bu haliyle bile çok iş görür tekrar ellerinize sağlık.
http://twitter.com/yusuFBrn

Ali İsmail Korkmaz, FENERBAHÇE Yıkılmaz!

Jey@Nfer

#3
@goupx .deb paketi yapmaya değer mi diye sorgulamadım değil :)

@krwlng aaa onu hiç farketmemişim iyi oldu söylediğiniz ; teşekkürler :
tek harf değişimlik işi var :
dosya=open(adres, "r")
yerine
dosya=open(adres, "a+")
yazıyoruz , problem solved ;)
şu anda editledim ; teşekkürler :)

ayrıca:
Alıntı yapılan: krwlng - 25 Aralık 2012 - 12:19:09
- Arama kısmında kelime yazınca "Enter" tuşu ile arama yapabilsek daha güzel olur bence.
- Arama yapıp arama detayı çıkınca arama yapılan pencere cevap vermeyen pencereler gibi kararıyor sanki hata varmış gibi.
- Arama yapınca gelen bilgiler farklı değilde aynı pencerenin alt kısmında çıksa daha hoş olabilir.


- Arama kısmında kelime yazınca "Enter" tuşu ile arama yapabilsek daha güzel olur bence.
  |
  |----> Evet bu olabilir , alın bunu ;) Versiyon 2de inşallah :)

- Arama yapıp arama detayı çıkınca arama yapılan pencere cevap vermeyen pencereler gibi kararıyor sanki hata varmış gibi.
  |
  |---> Hocam vala ona yapıcak bi şey yok ya , ancak öyle olması daha iyi gibi sanki çünkü sonuç penceresi , daha çok dikkat çekmesi açısından daha belirgin olması iyi bi şey yani :)

- Arama yapınca gelen bilgiler farklı değilde aynı pencerenin alt kısmında çıksa daha hoş olabilir.
   |
   |---> Aslında farklı pencerelerde olmasının bir kaç avantajı var :
             * Hızlı arama imkanı , direk sonucu gösteren ekran, yani sadelik açısından. Kişi nereye bakıcam diye aramıyor , zaten karşısında .İsteyen de hızlı aramayı pasifleştirebiliyor
             * Birden çok aramayı aynı anda yapabiliyor. Yani aynı anda beş altı pencerede farklı kelimeleri aratabiliyor. Bu şekilde tek pencerede tek kelime değil istediği kadar pencerede istediği kadar arama yapabiliyor.

Ayrıca sözlük seçimi konusunda ; hocam olsa güzel olur dediğiniz gibi ama baktım en iyisi gözüme tureng gibi geldi direk onu koydum geçtim. Ama neden olmasın tabi ki olabilir ,  özellikle teknik terimler sözlüğü falan olsa iyi olurdu aslında dediğiniz gibi :)
bakalım , inşallah :)
Hırs , azim , tevekkül ...

www.mehmetvahit.net