Kullanıcı ile girdi bağlantısını koparmak

Yapılabilir mi bilmediğim bir konu var aklımda. Kısa bir süredir araştırıyorum fakat bulamadım.
Kullanıcıya şifre girebilmesi için 10 saniye tanıma adlı konuda şöyle bir sıkıntı gördüm bunu da ayrı bir konu olarak anlatmak istedim.
Sıkıntı şu : Kullanıcı için 10 saniye tanımlanıyor fakat kullanıcı 10 saniye boyunca şifreyi girmiyor. Ardından şifreyi girmeyi denediğinde uygulama girdi girmediniz diyerek kendini kapatıyor. Benim istediğim ise kullanıcı 10 saniye boyunca şifreyi girmezse kullanıcıdan girdi almayı kesip herhangi bir girdi girmediniz diyerek kendini kapatması.

NOT : Kullanıcı için 10 saniye tanımlamadaki kodlarda kullanıcı girdi girmeden uygulamadan çıkış yapmıyor. Ben ise kullanıcı girdisi olmadan çıkmasını istiyorum.

1 Beğeni

asenkron bir fonksiyon yazın. input fonksiyonundan hemen önce çalıştırın. İçeriği de şöyle olsun:

Önce 10 saniye bekle eğer kullanıcı giriş yapmadıysa programı kapat.

1 Beğeni
from threading import Timer
import signal

cevap = None
sure_doldu_mu = False

def kontrol(): 
    global cevap, sure_doldu_mu, control_thread
    sure_doldu_mu = True
    if cevap is None:
        print("cevap girilmedi")
        signal.pthread_kill(control_thread.ident, signal.SIGTERM)

def cevap_bulundu_mu(veri): 
    global sure_doldu_mu 
    if veri == "yazbel":
        print("doğru cevap")
    else:
        print("yanlış cevap")

control_thread = Timer(5, kontrol)
control_thread.start()


cevap = input("şifre gir: ")
control_thread.cancel()
cevap_bulundu_mu(cevap)

signal.pthread_kill işinizi görecektir.Kötü çözüm, ama çözüm mü çözüm :wink:

1 Beğeni

10 saniye bekledikten sonra Enter’a bastım ve sonuç bu:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\Python37-32\lib\threading.py", line 1158, in run
    self.function(*self.args, **self.kwargs)
  File "C:\Users\Wyren\Desktop\deneme.py", line 12, in kontrol
    signal.pthread_kill(control_thread.ident, signal.SIGTERM)
AttributeError: module 'signal' has no attribute 'pthread_kill'

Not : Yine istediğim gibi olmamış. Kullanıcı girdisi almadan kapatmaya çalışmıyor.

Edit : Cevap girmediğim zaman uygulamanın verdiği cevap şu : cevap girilmediyanlış cevap
böyle küçük bir hata daha oldu.

Dediğinizi anladım fakat nasıl asenkron fonksiyon yazacağımı bilmiyorum. Yardımcı olursanız sevinirim.

@Wyren , sonuç nasıl böyle oluyor ya, py kaç kullanıyorsun sen? Ben cevabı qpython üzerinden verdim. Çalışması gerekir.

Düzeltme: py versiyonuyla değil, işletim sistemiyle alakalı gibi görünüyor. Sen win kullanıyorsun, ama ben linux kullanıyorum, sorun bundan kaynaklanıyor olabilir.Başka bir cevap varsa ben de ilgiliyim.

1 Beğeni

Bunu yapabilmek için input fonksiyonunun üzerine yazmak gerek, ama gerek yok. İnput fonksiyonu enter tuşu ile son buluyorsa, biz de enter’e basarız :smile:

Pyautogui kütüphanesi ile bu mümkün.

import pyautogui as pg
pg.press('enter')

Not: Bu modül standart kütüphanede yüklü gelmiyor, yüklemeniz gerek.

1 Beğeni

Sorunu şu şekilde çözdüm:

import multiprocessing
import pyautogui as pg
import time


def entfunc():
    time.sleep(2)
    pg.press('enter')


def inpfunc():
    a = input("Girdi:")
    print(a)
    enter.terminate()


if __name__ == '__main__':
    enter = multiprocessing.Process(target = entfunc)
    enter.start()
    inpfunc()


Asenkron fonksiyonlar sadece 3.7 de var ve istediğim gibi kullanılmıyormuş.

1 Beğeni

Ben zaten 3.7.1 kullanıyorum. Py sürümüm güncel kalıyor hep.

Bu nasıl oluyor? Her güncellemeyi uğraşıp yüklüyor musunuz yoksa benim bilmediğim basit bir yol mu var?

python.org’dan indirip yüklüyorum. Yani kısa bir yolu falan yok.

Dediğinizi yapmanın milyon tane yolu var, ancak ben en basiti en iyisi anlayışında olduğum için stackoverflowdaki en beğendiğim kod bloğunu yazıyorum.Nerede kullanacaksanız ona göre ilgili değişiklikleri yapabilirsiniz.Kodlar çok yalın olduğundan açıklamaları yazma gereği duymadım ama anlaşılmayan yer olursa yardımcı olmaya çalışırım.
kaynak:https://stackoverflow.com/questions/1335507/keyboard-input-with-timeout-in-python

from time import sleep

print('Please provide input in 10 seconds! (Hit Ctrl-C to start)')
try:
    for i in range(0,10):
        sleep(1) # could use a backward counter to be preeety :)
    print('No input is given.')
except KeyboardInterrupt:
    raw_input('Input x:')
    print('You, you! You know something.')
1 Beğeni

KeyboardInterrupt sinyalini yalnızca ctrl+c yapınca oluyo yöntem yanlışmış :smiley:

1 Beğeni

Yine benim istediğim şekilde olmamış :smiley:

Aşağıdaki kod iş görüyor sanki :smile:

import signal, time

def TimedInput(prompt='', timeout=20, timeoutmsg = None):
	def timeout_error(*_):
		raise TimeoutError
	signal.signal(signal.SIGALRM, timeout_error)
	signal.alarm(timeout)
	try:
		answer = input(prompt)
		signal.alarm(0)
		return answer
	except TimeoutError:
		if timeoutmsg:
			print(timeoutmsg)
		signal.signal(signal.SIGALRM, signal.SIG_IGN)
		return None
while True:
	timeout = 10
	timeoutmsg = 'zaman aşımı'
	prompt = f"{timeout} sn zaman içinde veri gir:"
	answer = TimedInput(prompt, timeout, timeoutmsg)
	if answer == None:
		print(f"{timeout} sn veri girmedin")
		break
	if answer != "":
		print(answer)
		break

Maalesef tekrardan çalışmadı. İşletim siseminden mi yoksa py sürümünden mi bilmiyorum.

Hata Kodu:

Traceback (most recent call last):
  File "C:\Users\Wyren\Desktop\input kesici.py", line 42, in <module>
    answer = TimedInput(prompt, timeout, timeoutmsg)
  File "C:\Users\Wyren\Desktop\input kesici.py", line 27, in TimedInput
    signal.signal(signal.SIGALRM, timeout_error)
AttributeError: module 'signal' has no attribute 'SIGALRM'

Aslında ben bu konuyu çözdüm fakat şuan 3. parti modül kullanmadan yapılabilir mi ona bakıyorum.

Konuyu çözdüğünü görmüştüm ben de aslında ama yazışmalar devam edince herkes bir algoritma ile konuya devam ediyor ben de bir iki bir şeyler yazayım dedim :smiley:
signal modülü linux da çalışıyor ama sen windows kullanıyormuşsun :frowning: ama pythonun araştırdığım kadarıyla siz windowcular için de yerleşik bir modülü var sanırım, benim kodlar üzerinde l inux kullandığımdan deneme şansım yok ama şu sayfayı bir ziyaret edin belki işinizi görebilir :slight_smile:
https://gist.github.com/atupal/5865214

1 Beğeni

Bahsettiğiniz modülün adı nedir?

Bu arada attığınız linkteki kodları denedim ve çalışmadılar.
Birinci kodda thread modülünü bulamadı ikinci de ise hiçbir tepki göstermedi.

Not : İkinci kodda girdiğim süre kadar bekliyor ardından çıkıyor.