İnput'a Karakter ve Sayı Sınırı Koymak

İnput’a karakter ve sayı sınırı koymak istiyorum. Nasıl yapabilirim? Biraz daha açıklamak gerekirse input’a en fazla üç karakter ve en fazla 100 sayısının girilmesini istiyorum. Üç karakterden ve 100’den fazla olursa kabul etmesin.

Hangi dil onu belirtin bari biz kahin miyiz.

Girdiğiniz değeri bir döngü içerisinde;
string uzunluğunu, sayıya çevrilip çevrilmediğini,
sayı ise en yüksek değerden küçük olduğunu,
belki istenilen en küçük değerden büyük olduğunu
tespit edebilirsiniz.

Belki :grinning: Daha yolun başındayım. Olur böyle hatalar. Python için sordum.

Sınır koymaktan kastınız nedir adam 99 yazdıktan sonran 1 tuşuna basınca 1 tuşunu terminale işlememesi mi yoksa 991 yazdığında hata girdi şu şartları sağlamalıdır tekrar girin demesi mi?

İlgilendiğin için teşekkür ederim öncelikle. Birincisi en fazla üç basamaklı sayı girilmesini kabul etsin, dört basamaklı bir sayı girerse terminale işlemesin. İkincisi sayı 100 sayısından fazlaysa hata versin. En fazla 100 girilebilir uyarısı versin.

İşletim sisteminiz nedir?

while True:
    num = input("sayı giriniz: ")
    if len(num) == 4:
        print("Lütfen tekrar deneyin.")
    elif int(num) > 100:
        print("Sayı 100 den büyük olamaz")
    else:
        print("kabul edildi.")
        break

Onu istemiyor terminale girerken bloklasın istiyor.

İşletim sistemine göre değişeceği için sordum işletim sistemini.

öyle bir şey mümkün mü bilmiyorum ama bence yoktur diye düşünüyorum

Mümkün.(20 karakter)

ben bilmiyordum hocam nasıl yapacağımızı paylaşırsanız çok sevinirim

class MaxCharacterLengthError(Exception):
    def __init__(self, s: str, msg="Maximum character size exceeded (maximum = 3)") -> None:
        self.s = s
        self.msg = msg
        super().__init__(self.msg)


class MaxIntegerLimitError(Exception):
    def __init__(self, n: int, msg="Maximum integer limit exceeded (maximum = 100)") -> None:
        self.n = n
        self.msg = msg
        super().__init__(self.msg)


def is_valid_input(input: str):

    if input.isnumeric() and int(input) > 100:
        raise MaxIntegerLimitExceeded(input)

    if len(input) > 3:
        raise MaxCharacterLengthError(input)

    return True

muhtemelen çok daha iyi yolları vardır fakat elimden bu kadar geldi.

Edit: istenen şey bu değilmiş ama bu da iş görür

1 Beğeni
from msvcrt import getch
from sys import stdout
from time import sleep



def kontrol(k):
    return (ord(k) in ((list(range(48, 58)))) or (k == "." and girdi.find(".") == -1)) and float(girdi + k) < 101

def fonk():
    global girdi
    girdi = ""
    while True:
        try:
            k = getch().decode("utf-8")
        except:
            k = getch()
            if k == b"S":
                stdout.write("\033[K")
            if k == b"K":
                stdout.write("\033[D")
            if k == b"M":
                stdout.write("\033[C")
            stdout.flush()
            continue
        if k == "\r" or k == "\n":
            break
        if ord(k) == 8:
            stdout.write("\b \b")
            stdout.flush()
            girdi = girdi[:-1]
            continue
        elif not kontrol(k):
            continue
        else:
            stdout.write(k)
            stdout.flush()
            girdi += k
    return girdi

print(fonk())
sleep(3)

Bende böyle bir şey yaptım biraz aceleye geldi bi hata bulursanız bildirirseniz sevinirim.
Tabi bu windows için diğer işletim sistemlerinde çalışmaz.
Not: Kodun bir kısmı @semtex ten alıntıdır.

Bunun icin karakter bazli inputa gecip (“raw mode”) duz terminalin verdigi satir editleme olanaklarindan feragat etmek gerekiyor. Bu modda, ok tuslari ve backspace gibi ozel tuslar program tarafindan islenmeli. Sahsen ilk bakacagim kutuphaneler readline ve ncurses olurdu. readline, adi uzerinde, satir bazli input kutuphanesi fakat raw mode’da calisiyor ve son derece yaygin. Istenileni yapmak bir sekilde mumkunse readline guzel bir cozum olacaktir. (n)curses TUI odakli bir kutuphane ve bu nedenle karakter bazli girdi ve cikti yaptigi en temel islemler. Belki karakter sinirlamasi olan bir “input box” widget’i bile vardir hazir.

Parola girdisi alip ••••• gibi bir sekilde gosteren bir programa denk gelirseniz kaynak koduna bakabilirsiniz.

Bununla beraber, duz input kullanip girdiyi sonradan validate eden (ve sorun cikarsa tekrar girilmesini isteyen) yukaridaki orneklere benzeyen bir alternatif kullanmanizi tavsiye ediyorum. Bunun uzerine duz satir girisi icin readline kullanmak bile onerdiginiz girdi kisitlamasindan daha kullanilabilir bir programla sonuclanabilir.

2 Beğeni
import curses


def password(prompt: str, sum_limit: int):
    pw = ""  # Şifrenin tutulacağı değişken
    r = 0  # Satır sayısının tutulacağı değişken
    stdscr = curses.initscr()  # Curses ekranını başlatıyoruz.
    curses.noecho()  # Bastığımız tuşlar ekrana yansımasın.
    while True:  # Sonsuz bir döngü başlatıyoruz.
        stdscr.addstr(prompt)  # Şifre isterken görünmesini istediğimiz yardımcı metin.
        while (q := stdscr.getch()) != 10:  # Enter tuşuna basıldığında duran bir döngü tanımlıyoruz.
            if pw and q == 8:  # Eğer bir şifre girildiyse ve backspace tuşuna basılıyorsa:
                stdscr.delch(r, len(prompt) + len(pw) - 1)  # Şifrenin son elemanı silinsin.
                pw = pw[:-1]  # Şifrenin son elemanını şifreden atalım.
            # Eğer şifrenin uzunluğu karakter sınırına eşit değilse
            # Ve basılan tuş bir sayı ise
            # Ve şifre, sum_limit'e eşit veya ondan küçükse:
            if len(pw) != len(str(sum_limit)) and chr(q).isnumeric() and int(pw + chr(q)) <= sum_limit:
                stdscr.addstr("*")  # Basılan tuşun yerine ekrana * sembolünü ekle.
                pw += chr(q)  # pw değişkenine basılan tuşun karakter değerini ekle.
        if not pw:  # Eğer bir tuşa basmadan enter tuşuna bastıysak:
            stdscr.addstr("\nŞifre girmediniz.\n")  # Ekrana şifre girmediniz yazısı yazdırılsın.
            r += 2  # Şifre girmediniz yazısını ekrana eklediğimiz için satır sayısını 2 artıralım.
        else:
            break  # Döngüyü sonlandır.
    curses.endwin()  # Curses ekranını sonlandır.
    return pw  # Şifreyi geri döndür.


print(password(sum_limit=100, prompt="Şifre: "))

Yukardaki kod ile kullanıcıdan 100’e eşit veya 100’den küçük sayılar girmesini sağlayan bir input tanımlandı.

Kullanıcı sayı olmayan herhangi bir tuşa bastığı zaman, basılan tuş işleme alınmaz. Ayrıca kullanıcı 101 gibi belirtilen sayıyı geçen ifadeler yazamaz. Kullanıcı 10 ifadesini yazdıktan sonra yanına ancak 0'ı getirebilir. 1 yazmaya kalktığı zaman şifreye herhangi bir ekleme yapılmaz. 100'den küçük sayılar sadece bir basamaklı, iki basamaklı veya üç basamaklı olarak gösterilebilir.

1 Beğeni

Takdir ediyorum @dildeolupbiten, tam olarak verdigim ornegi koda cevirmissin.

Neden isletim sisteminin bize sundugu [text editing gibi] olanaklardan feragat etmememiz icin de guzel bir ornek var: Benim terminalimde bakspace tusu ASCII DEL (^?, 127) yolladigi icin calismiyor.

$ stty -a
speed 38400 baud; rows 40; columns 173; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
$ echo $TERM
xterm-256color

curses modulunun kendisi soyle bir yola gitmis:

1 Beğeni

Backspace tuşu için aşağıdaki sorgu daha kapsayıcı evet. Koşulları sayı ile de ifade edebiliriz ama aşağıdaki ifade kodun anlaşılırlığını da artırıyor.

if pw and q in (curses.ascii.BS, curses.KEY_BACKSPACE, curses.ascii.DEL):

Terminal ekranının manipülasyonu deyince senin de dediğin gibi ilk olarak ncurses’e başvurmak lazım.

@yyuksekyayla, Yukarda da gördüğünüz gibi, curses ile terminal ekranının nasıl davranması gerektiğini kodluyorsunuz. Karmaşık animasyonlar da kodlayabilirsiniz, yukardaki gibi basit bir şifre isteme fonksiyonu da yazabilirsiniz.

Daha fazla kaynak için:

Kaynak: ncurses - Wikipedia

ncurses (new curses) is a programming library providing an application programming interface (API) that allows the programmer to write text-based user interfaces (TUI) in a terminal-independent manner. It is a toolkit for developing “GUI-like” application software that runs under a terminal emulator. It also optimizes screen changes, in order to reduce the latency experienced when using remote shells.

İlgilenen herkese teşekkürler…