Python/Curses Modülüyle İlgili Basit Örnekler

Merhaba arkadaşlar.
Bu başlıkta Python’ın Curses modülüyle alakalı basit ve/veya karmaşık örnekler paylaşılabilir. Bu modülle sys.stdin’i renklendirmeye çalışırken biraz ilgilenmiştim ama daha sonra başka uğraşların peşinden gittiğim için bu modülde kendimi geliştirme fırsatını pek bulamadım. Neyse bu Curses modülüyle alakalı daha önceden öğrendiğim bazı temel bilgileri örnekler üzerinde anlatarak burada paylaşmak istiyorum, belki bu başlığı okuyan arkadaşlara yardımı dokunur diye düşünüyorum. Eğer sizler de Curses modülüyle alakalı örnekler paylaşırsanız, ben dahil başlığı okuyan arkadaşlara üzerinde düşünüp çalışabileceğimiz bir kaynak vermiş olursunuz. Gerçi bir konuyu ciddi ciddi öğrenmek isteyen bir insanın kaynak bulamaması bana pek mümkün gelmiyor ama yine de bu tip konularla alakalı Türkçe kaynak bulmak oldukça zor. Neyse lafı uzatmadan arşivimde tuttuğum örneklerle konuyu işlemeye geçeyim diyorum. :slight_smile:

Ama ondan önce bir hatırlatmada bulunmak isterim. Curses modülüyle terminal’in davranışlarını sanki yeni doğmuş bir bebek gibi siz tasarlamaya başlarsınız. Dolayısıyla bazı özel durumlarda, mesela ekranın maksimum değerlerine ulaşıldığı halde x veya y eksenlerinin arttırılacağını söyleyen bir komut verildiği zaman program doğal olarak hata verir. Veya biz programı açtığımzıda program belli bir ekran boyutunda açılır ve bu açılan ekranın maximum x, y değerleri ile, ekranı genişlettiğimizde ortaya çıkan maximum x, y değerleri birbirinden farklı olur yani maximum ekran boyutları programın açıldığı ilk andaki ekran değerleri olarak alınır. Özetle terminalin davranışını istediğimiz şekilde ayarlayabilmek biraz zahmet isteyen bir iş.

2 Beğeni

Örnek - 1: Ekranın ortasına bir “hello world!” yazısı yerleştirelim.

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

# Önce gerekli modülü programın içine aktaralım.
import curses

# Ekranımızı tanımlayalım.
ekran = curses.initscr()

# Yazıyı ekrana yerleştirmek için satır ve sütun
# numaralarını yazabileceğimiz gibi, Terminal ekran boyutunu
# x ve y'nin durumlarını kontrol etmek için referans alabiliriz.
boyutlar = ekran.getmaxyx()

# Diyelim yazıyı terminal ekranının tam ortasına yerleştirmek
# istiyoruz, o zaman sütun ve satır parametrelerine ekran
# ölçülerinin yarısını değer olarak verebiliriz. Ancak "hello world!"
# ifadesi 12 karakterden oluştuğu için, bu karakter uzunluğunun
# yarısını satır değerinden çıkarırız.
ekran.addstr(int(boyutlar[0]/2), int(boyutlar[1]/2 - 6), "hello world!", curses.A_BOLD)

# Ekranı tazeleyelim.
ekran.refresh()

# Karakterleri yakalayalım.
ekran.getch()

# Herhangi bir tuşa basılınca ekran sonlansın.
curses.endwin()
2 Beğeni

Örnek - 2: Sürekli y eksenin ortasında bulunan ama x ekseni boyunca hareket eden bir “hello world!” yazısı oluşturalım.

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

# Gerekli modülleri programın içine aktaralım.
import curses
import time

# Her zamanki gibi ekranı tanımlayalım.
ekran = curses.initscr()

# Ekranımızın max. boyutlarını tanımlayalım.
boyutlar = ekran.getmaxyx()

# Yazının terminal ekranında, bir animasyon gibi
# hareket etmesini istiyorsak, bir for döngüsü içinde
# sütun ve satırları anlık olarak değiştirebiliriz.
for i in range(boyutlar[1] - len("hello world!")):
    
    # Ekranı temizleyelim.
    ekran.clear()

    # Sürekli y ekseninin ortasında olan ve x ekseninin i parametresine göre 
    # değişen "hello world!" yazısını kalın harflerle 
    # ekrana hareketli bir şekilde bastıralım.
    ekran.addstr(int(boyutlar[0]/2), i, "hello world!", curses.A_BOLD)
 
    # Ekranı tazeleyelim.
    ekran.refresh()

    # time.sleep() fonksiyonu tanımlamadığınızda ne olacağını görmek için yoruma alın.
    time.sleep(0.05)

# Ve programdan terminali eski haline getirecek şekilde çıkalım.
curses.endwin()
2 Beğeni

Örnek - 3: x ve y eksenleri boyunca hareket eden bir “hello world!” yazısı oluşturalım. Dilerseniz bu uygulamayı bir ekran koruyucu olarak da kullanabilirsiniz.

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

# Bu örnekte kullanacağımız gerekli modülleri
# programın içine aktaralım.
import curses
import time

# Önce ekranı tanıtalım.
ekran = curses.initscr()

# Ekranın max. boyutlarını alalım.
boyutlar = ekran.getmaxyx()

# nodelay()'in parametresi 1 (True) olursa yazımız
# ekranda harekete kavuşur, 0 (False) olursa da
# yazı sabit bir şekilde durur.
ekran.nodelay(1)

# Döngü değişkenini tanımlıyoruz.
q = -1

# Döngüyle birlikte değişecek olan ekran satır ve sütun
# değerlerini ilk etapta 0 olarak belirliyoruz.
x, y = 0, 0

# Satır ve sütunların değerleri, dusey ve yatay değişkenleri ile
# değiştirilecek.
dusey, yatay = 1, 1

while q < 0:
    # Döngü her başa sardığında ekran temizlensin.
    ekran.clear()

    # Ekrandaki yazı hep kalın harflerle "hello world!" yazısı olsun.
    ekran.addstr(y, x, "hello world!", curses.A_BOLD)

    # Ekranı tazeleyelim.
    ekran.refresh()

    # Döngüyle birlikte x ve y 1'er kademe arttırılır.
    y += dusey
    x += yatay

    # Şayet 'y' max değerine ulaşırsa 
    if y == boyutlar[0] - 1:
        # dusey -1'e eşitlenir. Böylece negatif yönde de hareket edebiliriz.
        dusey = -1

    # Şayet 'y' min değerine gelirse, 
    elif y == 0:
        # dusey'i 1'e eşitleriz. Böylece pozitif yönde hareket edebiliriz.
        dusey = 1

    # Şayet 'x' max değerine ulaşırsa
    if x == boyutlar[1] - len("hello world!") - 1:
        # yatay -1'e eşitlenir.
        yatay = -1

    # Şayet 'x' min değerine ulaşırsa yatay 1'e eşitlenir.
    elif x == 0:
        yatay = 1

    # Ekranda bir tuşa bastığımız zaman programdan çıkabiliriz.
    # Çünkü q'nun değeri değişince while döngüsünün koşulu sağlanmamış olacak.
    q = ekran.getch()

    # Ekrandaki yazının hareketliliği time.sleep() fonksiyonu ile biraz azaltalım. 
    time.sleep(0.05)

# Ve normal terminal ekranına geri dönelim.
curses.endwin()
2 Beğeni

Örnek - 4: “asdw” tuşlarıyla hareket eden bir “hello world!” yazısı oluşturalım.

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

# Bu örnekte kullanacağımız modülleri içe aktaralım.
import curses
import time

ekran = curses.initscr()
# Bastığımız tuş ekrana yansımasın diye
# curses.noecho() fonksiyonunu kullanacağız. 
# Farkı görmek için bu fonksiyonu yoruma alın.
curses.noecho()

boyutlar = ekran.getmaxyx()

# Hareketi sağlamak için nodelay() fonksiyonunun
# değerini 1 olarak ayarlayalım.
ekran.nodelay(1)

# Programdan çıkmamızı sağlayacak q tuşunu ayarlayalım.
q = -1

# Bu sefer ekrandaki yazının değişen konumlarını
# x ve y değerlerine göre belirleyelim. Başlangıç
# olarak 0'a 0 yazıyoruz.
x, y = 0, 0

while q != ord("q"):
    # Döngü her başa sardığında clear() ile ekranı temizleyelim.
    ekran.clear()

    # Ekranın y, x konumuna "hello world!" stringini kalın olacak
    # şekilde ekleyelim.
    ekran.addstr(y, x, "hello world!", curses.A_BOLD)

    # Ekranı tazeleyelim.
    ekran.refresh()

    # q tuşu artık bütün tuşları temsil etmektedir.
    q = ekran.getch()

    # Şayet kullanıcı "w" tuşuna basarsa ve y değeri 0'dan büyükse
    if q == ord("w") and y > 0:
        # y'nin değeri 1 birim azalsın.
        y -= 1

    # Şayet kullanıcı "s" tuşuna basarsa ve y max değerinden küçükse
    elif q == ord("s") and y < boyutlar[0] - 1:
        # y'nin değeri 1 birim arttırılsın.
        y += 1

    # Şayet kullanıcı "a" tuşuna basarsa ve x değeri 0'dan büyükse
    elif q == ord("a") and x > 0:
        # x'in değeri 1 birim azalsın.
        x -= 1

    # Şayet kulanıcı "d" tuşuna basarsa ve x değeri max değerinden küçükse
    elif q == ord("d") and x < boyutlar[1] - len("hello world!") - 1:
        # x'in değeri 1 birim arttırılsın.
        x += 1

    # time.sleep()'i niye kullandığımızı merak ediyorsanız, bu kodu
    # yoruma ekleyin ve farkı gözlemleyin.
    time.sleep(0.05)

# Ve bizi programdan terminali bozmadan çıkaracak olan komutu unutmuyoruz.
curses.endwin()
2 Beğeni

Örnek - 5: “asdw” tuşlarıyla hareket eden ve “1, 2, 3” tuşlarıyla renk değiştiren bir “hello world!” yazısı oluşturalım.

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

# Bu örnekte kullanacağımız modülleri
# programın içine aktaralım.
import curses
import time

# Yine önce ekranı tanımlıyoruz.
ekran = curses.initscr()

# Herhangi bir renklendirme işlemine geçmeden önce
# renklendirmeyi başlatmamız gerekiyor.
curses.start_color()

# Şimdi renk çiftlerini ve sıralarını oluşturmaya geçebiliriz.
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_RED, curses.COLOR_BLACK)

# Yine bastığımız tuşun ekranda gölge oluşturmasını iptal edelim.
curses.noecho()

# Max ekran boyutlarını bir değişkene kaydedelim.
boyutlar = ekran.getmaxyx()

# Yine ekrandaki harekette bir gecikme olmaması için
# nodelay()'in parametresini 1 olarak ayarlıyoruz.
ekran.nodelay(1)

# Yukarıda tanımladığımız renk çiftlerini kullanabilmek
# için bir değişken tanımlayalım.
g = 1

# Şimdi de her zamanki gibi her tuşu temsil edecek q
# değişkenimizi tanımlayalım.
q = -1

# Ekrana yazıyı yine x ve y değerlerine göre yerleştireceğiz.
x, y = 0, 0


while q != ord("q"):
    # Her zamanki gibi ekranımızı tamamen temizleyelim.
    ekran.clear()

    # Ekranın y ve x konumuna "hello world!" yazısını yerleştirelim.
    # Yalnız burada curses.color_pair(g)'deki g ilgili tuşlara bastığımızda
    # renk değiştirmeye yarayacak.
    ekran.addstr(y, x, "hello world!", curses.color_pair(g))

    # İmleci ekranın en sonuna götürelim. Bu fonksiyonu kullanmadığımız
    # zaman oluşacak olan farkı görebilmek için yoruma alın.
    ekran.move(boyutlar[0] - 1, boyutlar[1] - 1)
    
    # Ekranı tazeleyelim.
    ekran.refresh()

    # q bütün tuşları temsil ediyor olsun.
    q = ekran.getch()

    # chr(49)'dan chr(52)'ye kadar olan karakterler 1, 2 ve 3'tür.
    # Şayet kullanıcı bu tuşlara basınca yazının renkleri değişecek.
    if q in range(49, 52):
        g = int(chr(q))

    # Şayet kullanıcı "w" tuşuna basarsa ve y'nin değeri 0'dan büyükse
    if q == ord("w") and y > 0:
        # y'nin değerini 1 birim azalt.
        y -= 1

    # Şayet kullanıcı "s" tuşuna basarsa ve y'nin değeri max değerin 1 birim eksiğinden küçükse
    elif q == ord("s") and y < boyutlar[0] - 1:
        # Şayet y, max değerinden 2 birim küçükse ve x 'de max değere ulaşmışsa
        if y == boyutlar[0] - 2 and x == boyutlar[1] - len("hello world!"):
            # Hiç bir şey yapma.
            pass
        # Aksi taktirde
        else:
        # y'nin değerini 1 birim arttır.
            y += 1

    # Şayet kullanıcı "a" tuşuna basarsa ve x'in değeri 0'dan büyükse
    elif q == ord("a") and x > 0:
        # x'in değerini 1 birim azalt.
        x -= 1
 
    # Şayet kullanıcı "d" tuşuna basarsa ve x'in değeri max değerden küçükse
    elif q == ord("d") and x < boyutlar[1] - len("hello world!"):
        # Şayet y'nin ve x'in değerleri max değerlerinden 1 birim küçüğüne eşitse
        if y == boyutlar[0] - 1 and x == boyutlar[1] - len("hello world!") - 1:
            # Hiç bir şey yapma.
            pass
        # Aksi taktirde
        else:
            # x'in değerini 1 birim arttır.
            x += 1
   
    # time.sleep()'in ne işe yaradığını öğrenmek için bu fonksiyonun başına yorum
    # satırı işareti getirin.
    time.sleep(0.05)

# Ve programdan çıkıldığında terminal tekrar eski haline getirilsin.
curses.endwin()
2 Beğeni

Örnek - 6: “asdw” tuşlarıyla hareket eden, “1, 2, 3” tuşlarıyla renkleri değişen, “b” tuşu ile kalınlaşıp inceleşen ve “r” tuşuyla arka plan rengi ön plan rengi haline gelen bir “hello world!” yazısı oluşturalım.

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

# Yine örnek uygulamamızda kullanacağımız
# modülleri içe aktaralım.
import curses
import time

# Gördüğünüz gibi ilk olarak ekranı tanımlıyoruz.
ekran = curses.initscr()

# Örnek uygulamada renk kullanacağız yine. Bu yüzden
# renkl çiftlerini tanımlamadan önce aşağıdaki fonksiyonu
# kesin kullanmamız gerekiyor.
curses.start_color()

# Şimdi 3 tane renk çifti oluşturalım.
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_RED, curses.COLOR_BLACK)

# Bastığımız tuşlar yine ekranda gölge oluşturmasın.
curses.noecho()

# Ekranın max x ve y değerlerini alalım.
boyutlar = ekran.getmaxyx()

# Animasyonumuzun ekranda görüntülenmesinin gecikmemesi için
# yine nodelay()'in parametresini 1 olarak ayarlıyoruz.
ekran.nodelay(1)

# Bu sefer kalınlaştırma işlemini bir işlemle yapacağız. Bunun için
# bold isimli bir değişken oluşturalım ve değerini 0 yapalım.
bold = 0

# "hello world!" yazısının arka plan rengini ön plana, ön plan rengini ise
# arka plana çevirmek için reverse isminde bir değişken oluşturalım 
# ve değerini 0 yapalım.
reverse = 0

# b tuşuna basılınca iki ayrı işlem yapılsın: Metin kalınlaştırılmışsa inceltilsin, yok eğer inceltilmişse kalınlaştırılsın. Bu işlem için bir liste oluşturalım.
b = [curses.A_NORMAL, curses.A_BOLD]

# Aynı şekilde reverse işlemi için de birbirinin tersi olan değişkenleri barındıran
# bir liste oluşturalım.
r = [curses.A_NORMAL, curses.A_REVERSE]

# Tanımladığımız renk çiftlerini kullanabilmek için yine g isimli bir değişken
# kullanacağız ve değerini 1 olarak belirleyelim.
g = 1

# Yine ekrandaki her tuşu temsil eden bir q değişkeni oluşturalım.
q = -1

# x ve y'nin başlangıç değerlerini belirtelim.
x, y = 0, 0

while q != ord("q"):
    # Ekranı temizleyelim yine.
    ekran.clear()

    # hello world! yazısını tuşlara basılınca aktif hale getirilecek
    # biçimlendirme özellikleriyle birlikte ekrana ekleyelim.
    ekran.addstr(y, x, "hello world!", curses.color_pair(g) | b[bold] | r[reverse])

    # İmleci ekranın sağ alt köşesine yerleştirelim.
    ekran.move(boyutlar[0] - 1, boyutlar[1] - 1)

    # Ekranı tazeleyelim.
    ekran.refresh()

    # q bütün tuşları temsil etsin.
    q = ekran.getch()

    # chr(49)'dan chr(52)'ye kadar olan karakterler 1, 2 ve 3'tür.
    # Şayet kullanıcı bu tuşlara basınca yazının renkleri değişecek.
    if q in range(49, 52):
        g = int(chr(q))

    # Kullanıcı "b" tuşuna basarsa 
    elif q == 98:
        # bold'un değerini 1 - bold yap.
        # bold 0 iken bold 1 olur, bold 1 iken de bold 0 olur.
        # Böylece yukarıda tanımladığımız listenin iki elemanını da
        # aktif hale getiririz.
        bold = 1 - bold

    # Kullanıcı "r" tuşuna basarsa
    elif q == 114:
        # reverse'in değeini 1- reverse yap.
 	# Yİne reverse 0 iken reverse 1 olur, reverse 1 iken de reverse 0 olur.
        # Böylece yukarıda tanımladığımız listenin iki elemanını da
        # aktif hale getiririz.
        reverse = 1 - reverse

    # Eğer kullanıcı "w" tuşuna basarsa ve y'nin değeri 0'dan büyükse
    if q == ord("w") and y > 0:
        # y'yi 1 birim azalt.
        y -= 1

    # Şayet kullanıcı "s" tuşuna basarsa ve y'nin değeri max değerin 1 birim eksiğinden küçükse
    elif q == ord("s") and y < boyutlar[0] - 1:
        # Şayet y, max değerinden 2 birim küçükse ve x 'de max değere ulaşmışsa
        if y == boyutlar[0] - 2 and x == boyutlar[1] - len("hello world!"):
            # Hiç bir şey yapma.
            pass
        # Aksi taktirde
        else:
        # y'nin değerini 1 birim arttır.
            y += 1

    # Şayet kullanıcı "a" tuşuna basarsa ve x'in değeri 0'dan büyükse
    elif q == ord("a") and x > 0:
        # x'i 1 birim azalt.
        x -= 1

    # Şayet kullanıcı "d" tuşuna basarsa ve x'in değeri max değerden küçükse
    elif q == ord("d") and x < boyutlar[1] - len("hello world!"):
        # Şayet y'nin ve x'in değerleri max değerlerinden 1 birim küçüğüne eşitse
        if y == boyutlar[0] - 1 and x == boyutlar[1] - len("hello world!") - 1:
            # Hiç bir şey yapma.
            pass
        # Aksi taktirde
        else:
            # x'in değerini 1 birim arttır.
            x += 1

    # Yine bu time.sleep() fonksiyonunun ne işe yaradığını öğrenmek istiyorsanız,
    # fonksiyonu yoruma alın ve aradaki farka bakın.
    time.sleep(0.05)

# Ve programı yine terminali bozmayacak şekilde sonlandıralım.
curses.endwin()
2 Beğeni

Örnek - 7: Yön tuşlarıyla hareket eden, “1, 2, 3” tuşlarıyla renkleri değişen, “b” tuşu ile kalınlaşıp inceleşen ve “r” tuşuyla arka plan rengi ön plan rengi haline gelen bir “hello world!” yazısı oluşturalım.

Not: Örnek - 6 ile Örnek - 7 arasındaki farklardan birisi metnin hareket etmesi için Örnek - 6’da “asdw” tuşlarının, Örnek - 7’de ise yön tuşlarının kullanılmasıdır. Bu yön tuşlarının kullanılabilmesi için aşağıdaki kodlarda göreceğiniz gibi ekran.keypad(1) gibi bir kod kullanılmıştır. Geri kalan diğer işlemler Örnek-6’daki işlemlerin aynısıdır. Bu örnekte yorum satırları kullanılmamıştır.

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

import curses
import time

ekran = curses.initscr()
ekran.keypad(1)
curses.start_color()
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_RED, curses.COLOR_BLACK)
curses.noecho()

boyutlar = ekran.getmaxyx()

ekran.nodelay(1)

bold = 0
reverse = 0
b = [curses.A_NORMAL, curses.A_BOLD]
r = [curses.A_NORMAL, curses.A_REVERSE]
g = 0 
q = -1
x, y = 0, 0

while q != ord("q"):
    ekran.clear()
    ekran.addstr(y, x, "hello world!", curses.color_pair(g)| b[bold] | r[reverse])
    ekran.move(boyutlar[0] -1, boyutlar[1] - 1)
    ekran.refresh()
    q = ekran.getch()
    if q in range(48, 52):
        g = int(chr(q))
    elif q == 98:
        bold = 1 - bold
    elif q == 114:
        reverse = 1 - reverse
    if q == curses.KEY_UP and y > 0:
        y -= 1
    elif q == curses.KEY_DOWN and y < boyutlar[0] - 1:
        if y == boyutlar[0] - 2 and x == boyutlar[1] - len("hello world!"):
            pass
        else:
            y += 1
    elif q == curses.KEY_LEFT and x > 0:
        x -= 1
    elif q == curses.KEY_RIGHT and x < boyutlar[1] - len("hello world!"):
        if y == boyutlar[0] - 1 and x == boyutlar[1] - len("hello world!") - 1:
            pass
        else:
            x += 1

    time.sleep(0.05)

curses.endwin()
2 Beğeni

Örnek - 8: Bu da, Türkçe karakterleri ekrana eklemeye çalışırken ortaya çıkan bir örnek.

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

import curses

ekran = curses.initscr()
ekran.keypad(1)
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
curses.noecho()
boyutlar = ekran.getmaxyx()
q = -1
x, y = 0, 0
xy = []
karakterler = []


def karakter_ekle(karakter, num1, num2):
    global x, y
    ekran.addstr(y, x, karakter, curses.color_pair(1))
    x += 1
    karakterler.remove(num1)
    karakterler.remove(num2)


while q != 27:
    q = ekran.getch()
    ekran.refresh()
    karakterler.append(q)
    if boyutlar[1] - x == 1:
        xy.append((y, x - 1))
        y += 1
        x = 0
    if q == 263:
        if x == 0:
            if y != 0:
                y -= 1
                try:
                    x = xy[len(xy) - 1][1]
                    xy.pop(len(xy) - 1)
                except IndexError:
                    x = boyutlar[1] - 1
                ekran.delch(y, x)
            else:
                pass
        else:
            ekran.delch(y, x - 1)
            x -= 1
    elif q == 10:
        xy.append(curses.getsyx())
        ekran.addstr(y, x, chr(q), curses.color_pair(1))
        y += 1
        x = 0
    elif q == 261:
        if boyutlar[1] - x == 1:
            y += 1
            x = 0
        else:
            x += 1
            ekran.addstr(y, x, "", curses.color_pair(1))
    elif q == 260:
        if x == 0:
            if y != 0:
                y -= 1
                x = 78
            else:
                pass
        else:
            x -= 1
            ekran.addstr(y, x, "", curses.color_pair(1))
    elif q == 259:
        if y != 0:
            y -= 1
            ekran.addstr(y, x, "", curses.color_pair(1))
        else:
            pass
    elif q == 258:
        if y != boyutlar[0] - 1:
            y += 1
            ekran.addstr(y, x, "", curses.color_pair(1))
        else:
            pass
    elif q == 195:
        ekran.addstr(y, x, "", curses.color_pair(1))
    elif q == 196:
        ekran.addstr(y, x, "", curses.color_pair(1))
    elif q == 197:
        ekran.addstr(y, x, "", curses.color_pair(1))
    elif q == 167:
        karakter_ekle("\u00e7", 195, 167)
    elif q == 159:
        if 196 in karakterler:
            karakter_ekle("\u011f", 196, 159)
        elif 197 in karakterler:
            karakter_ekle("\u015f", 197, 159)
    elif q == 177:
        karakter_ekle("\u0131", 196, 177)
    elif q == 182:
        karakter_ekle("\u00f6", 195, 182)
    elif q == 188:
        karakter_ekle("\u00fc", 195, 188)
    elif q == 135:
        karakter_ekle("\u00c7", 195, 135)
    elif q == 158:
        if 196 in karakterler:
            karakter_ekle("\u011e", 196, 158)
        elif 197 in karakterler:
            karakter_ekle("\u015e", 197, 158)
    elif q == 176:
        karakter_ekle("\u0130", 196, 176)
    elif q == 150:
        karakter_ekle("\u00d6", 195, 150)
    elif q == 156:
        karakter_ekle("\u00dc", 195, 156)
    else:
        ekran.addstr(y, x, chr(q), curses.color_pair(1))
        x += 1
curses.endwin()
2 Beğeni

Örnek-9: Bu da def, if, else gibi bazı özel kelimelerin diğer kelimelerden farklı renge sahip olması için uğraşırken ortaya çıkan örneklerden bir tanesi. (Mesela def’i define’den veya “def” den ayırt etmek için.) Dikkat edilirse bu örnekte x ve y değerleri kullanılmamış, stringler ekrana otomatik olarak yerleştirilmiştir.

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

import re
import curses
import keyword

stdscr = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_BLUE, curses.COLOR_BLACK)
curses.noecho()

q = -1
KWLIST = keyword.kwlist
strings = ""

while q != ord("q"):
    q = stdscr.getch()
    stdscr.addstr(chr(q), curses.color_pair(1))
    strings += chr(q)
    for kw in KWLIST:
        regex1 = re.search("[^'\"]\s{}\s$".format(kw), strings)
        regex2 = re.search("^{}\s$".format(kw), strings)
        if regex1 or regex2:
            stdscr.addstr("{}{}".format("\b" * (len(kw) + 1), "{} ".format(kw), curses.color_pair(2)))
            strings = ""

curses.endwin()
2 Beğeni

Bunları kapsamlı bir yazı haline getirip belgeler kısmında yayınlasanız daha yararlı olmaz mı?

1 Beğeni

Bilmiyorum, belki de dediğiniz gibi olsa daha yararlı olur. Ama bu başlığın da okuyan için bir yararı olmaz mı sizce?

1 Beğeni

Ellerinize sağlık; çok faydalı örnekler.

@hasser’e katılıyorum. istihza belgelerinde uygun bir başlık açarak konuyu anlatabilirsiniz. Orada bulunması ve okunması çok daha kolay olur.

1 Beğeni