Bir başka kod editörü: Visual Python

metin-düzenleyici
python
visual-python
program-tanıtımları
tkinter

#41

Tamam, sizin dediğiniz gibi yaptım, ctrl + f ve ctrl + g tuş kombinasyonlarını kaldırdım, yerine girinti durumuna göre çalışan bir girinti ekleme ve girinti silme işlemi tanımladım. Çalışma şekli PyCharm’daki girintilerin çalışma şekline benziyor.

Programı çalıştırıp Enter ve BackSpace tuşlarının nasıl çalıştığına bir bakın isterseniz.

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

import tkinter as tk

root = tk.Tk()

text = tk.Text(master=root)
text.pack()

right_click = None


def indent(event):
    row, col = text.index("insert").split(".")
    line = text.get(f"{int(row) - 1}.0", f"{row}.0")
    if event.keysym == "Return":
        count = line.count(" " * 4)
        if line[-2] == ":":
            text.insert("insert", " " * 4 * (count + 1))
        else:
            text.insert("insert", " " * 4 * count)
    elif event.keysym == "BackSpace":
        if text.get(f"{row}.{int(col) - 3}", f"{row}.{col}") == " " * 3:
            text.delete(f"{row}.{int(col) - 3}", f"{row}.{col}")


def ctrl_a(event):
    text.tag_add("sel", "1.0", "end")
    text.mark_set("insert", "1.0")
    text.see("insert")
    return "break"


def cancel_popup(event):
    global right_click
    if right_click is not None:
        right_click.destroy()


def popup(event):
    global right_click
    cancel_popup(event)
    right_click = tk.Menu(master=None, tearoff=False)
    right_click.add_command(label="Kopyala", command=lambda: root.focus_get().event_generate('<<Copy>>'))
    right_click.add_command(label="Yapıştır", command=lambda: root.focus_get().event_generate('<<Paste>>'))
    right_click.add_command(label="Sil", command=lambda: root.focus_get().event_generate('<<Clear>>'))
    right_click.add_command(label="Kes", command=lambda: root.focus_get().event_generate('<<Cut>>'))
    right_click.add_command(label="Tümünü Seç", command=lambda: root.focus_get().event_generate('<<SelectAll>>'))
    right_click.post(event.x_root, event.y_root)


text.bind("<Button-1>", cancel_popup)
text.bind("<Button-3>", popup)
text.bind("<KeyRelease>", indent)
text.bind("<Control-Key-A>", ctrl_a)
text.bind("<Control-Key-a>", ctrl_a)

root.mainloop()

2018-07-20%2020-12-24%20ekran%20g%C3%B6r%C3%BCnt%C3%BCs%C3%BC


#42

README dosyasında uygulamayı çalıştırma komutlarını ekledim. Şimdi daha sade oldu. Sıkıntı için kusura bakmayın, doğru paket yapısını bulmaya çalışırken sık sık dizin yapısını değiştirmek durumunda kaldım.

Yok, olmazdı. Uygulamalar büyüdükçe tek dosya içinde geliştirmesi giderek zorlaşıyor. Ki bu uygulamanın büyüme kapasitesi yüksek. Şimdiden önlem alınıp modüler bir şekilde geliştirmeye devam edilmezse, ileride bu baş ağrısına sebep olur. Hatta bu modülerliği kurmak için şimdi harcanan zamandan çok daha fazlası hata ayıklamaya gitmeye başlar.


#43

:+1:

Aynen öyle. Girintileme olan yerleri bulmak kolay: Eğer bir satırda boşluk karakterlerinden önce bir kod yoksa, o satırdaki boşluk karakterleri girintilemedir.


#44

Klonu yeniden indirdim.
Çalıştırmak için aşağıdakileri yazdım:

python3 -m __init__.py

Maalesef şimdi de şöyle bir hata verdi:

/usr/bin/python3: Error while finding module specification for '__init__.py' (AttributeError: module '__init__' has no attribute '__path__')

Sonra, visual_python dizinin içinde, eadme’de yazdığı çalıştırmayı denedim:

python3 -m visual_python

Ancak aşağıdaki gibi bir hata aldım.

_tkinter.TclError: bitmap "icon.ico" not defined

Neyse, şimdilik app.py içindeki 14. satırı yoruma aldım. Çalıştı.


#45
$ python3 -m visual_python

Bu komutu ana dizinde (README.md dosyasının olduğu dizin) vermelisiniz. Çünkü icon.ico dosyası bu dizin içinde.


#46

O dizinde komutu çalıştırdım.


#47

Windows kullanmıyorsunuz sanırım. GNU/Linux’te .ico dosyaları ile ilgili sorun çıktığını okumuştum. Belki bu konuda da bir şeyler yapabilirsiniz, GNU/Linux bir işletim sistemine erişimim olmadığı için ben pek bir şey yapamıyorum. :smile:


#48

O sırada kullanmıyordum evet. :slight_smile:
Yok sorun değil, ilgili satırı yoruma aldım ve çalıştırdım.
Bu arada girinti ekleme işlemini programa ekledim ve PR gönderdim ama sanırım bir hata veriyor.


#49

text_widget.py dosyasını ayrı paket içine almıştım. Bu pencere aracı ile ilgili dosyalar çoğalacağı için böyle bir şey yapmayı seçtim. Sanırım yerelinizdeki veri havuzunu güncelleyip yaptığınız değişiklikleri kopyala-yapıştır ile güncel dosyaya eklerseniz sorun çözülür.


#50

Tamam sorun çözüldü.


#51

Visual Python adı başka bir modül tarafından kullanılıyor.
https://wiki.python.org/moin/UsefulModules
Scientific başlığında ilk modül.


#52

İsmi telif hakkı ile korunmuyorsa ben de kullanabilirim demektir. Tabii ki başka bir proje ile aynı isme sahip olmak pek iyi bir şey değil ama projem için en uygun isim olarak bu ismi bulduğumu söyleyebilirim. Ayrıca GitHub’daki ekip ismi bende: https://github.com/visual-python :sunglasses:


#53

Editöre otomatik girintileme ve girinti silebilme özellikleri eklendi. Ayrıca sekme tuşu ile de Python’cıların kullandığı 4 boşluk karakterli girinti eklenebiliyor. Artık Visual Python’da Python kodu yazmak daha kolay ve eğlenceli! @dilde_olupbiten’e katkıları için teşekkürler.

Editörün kodlarındaki bir yenilik de kodların dizin yapısının değişmesi oldu. Diğer yapılar faydalarının yanında daha çok geliştirmeyi zorlaştırdılar. Ayrıca şu an sadece tek bir kod dosyası var. Bunun da sebebi geliştirme için tekrar Visual Python’ı kullanmaya karar vermiş olmam. Bunun birçok faydası var ancak en büyük faydası, hataların daha kolay fark edilip düzeltilebilmesi ve geliştirmelerin önceliklendirilmesini kolaylaştırması. Bu bağlamda katkıda bulunacak arkadaşlara da bu yolu tavsiye ediyorum. Visual Python izin verdiğinde çok dosyalı bir yapıya geçilecek. Bu sebeple kodlar daha fazla karışmadan bir gezgin(explorer) ve düzenleyicinin üstünde sekme desteği için gerçeklemelere olan ihtiyaç şu an en üst seviyede.

Devamı için bu konuyu ve GitHub’daki veri havuzunu takipte kalın.


#54

self.token_type_color_map değişkenin değerini bir JSON dosyasından alması daha mantıklı olmaz mı? Bu şekilde farklı temalar da yazılabilir.(VS Code da öyle)

Bir de dosya açma kısayollarında iki o da küçük olmuş


#55

Tabii ki, ancak bu daha sonra yapılacak bir şey. Örneğin; ayarlarda tema değiştirme seçeneği olduğunda, böyle bir şey yapılabilir. Öncesinde çok daha önemli konular var.

Teşekkürler, hemen düzeltiyorum. :slight_smile:


#56

Çoklu seçim yapıp backspace tuşuna bastığımızda seçtiğimiz şeyi değil seçili yerden önceki karakteri siliyor. Bu sorunun acelesi yok ama bildirmek istedim.


#57

Merhabalar @ismailarilik bey,

Ben sizin kodları denemek istedim, ancak bana direkt syntax çaktı.

python3 app.py

Komutunu yazdım ve hata bu:

Kısaca nedense bende f stringleri tanımıyor,biraz araştırayım,ustunkörü yazmaktayım.

  • Linux mint cinnamon 32 bit kullanıyorum.
  • python sürümü: 3.5.2

Ne yapmalıyım, ne önerebilirsiniz?

Edit: anladım,f string Python 3.6 ile gelen bir özellik. kolay gelsin


#58

Bu ve birkaç sorun daha vardı. Hepsi de sekme karakteri olarak boşluğu desteklemekten kaynaklanıyordu. Bu özellik çoğu kod düzenleyicide var ve yumuşak sekme(soft tab) olarak da biliniyor. Python’ın geliştirme sürecinde önerdiği sekme türü de bu. Ancak bu sekme türü beraberinde birçok karışıklığı getiriyor ve geliştirdiğim kod düzenleyicinin ilk aşamalarında bununla uğraşmak istemedim. Sekme uzunluğunu 4 karaktere ayarladım; şu anda çalıştırmada bir sorun yok gibi. Ama eğer siz bununla ilgili bir sorunla karşılaşırsanız GitHub’daki veri havuzunda bir konu açabilirsiniz. Teşekkürler.


#59

editor değişkeninde şuradaki yöntemle seçim yapılamıyor:Text widgetında seçim yapmak. Bunun sebebi ne?


#60

Yapılabilmesi lazım; bahsettiğiniz editor bir Text pencere aracından ibaret. Kodlarınızı paylaşabilir misiniz?