PyautoGui Tuşa basınca döngüden çıkmak

from tkinter import *
import pyautogui
import msvcrt

a=input("tus griniz : ")

while True:
pyautogui.write(a, interval=0.5)

#Burada dongunun Klavyeden bastıgım bir tuş ile kapanmasını
#istiyorum.İnput kullanamıyorum. Çünkü sürekli a degerini bastırıyor.

1 Beğeni

Öncelikle forumda ki ilk gönderini tebrik ederim. Hoşgeldin.

from tkinter import *
import pyautogui
import msvcrt

while True:
    a = input("tus giriniz:")
    
    if ( a == "q" ):
    quit()

bu tarz bi yaklaşım işinizi görmüyor mu?

1 Beğeni

Çok teşekkür ederim, kaliteli bir forum olduğunu ilk gönderimden hissettirdiniz bana.

while True:
pyautogui.write(a, interval=0.5)
Program bu komuta geldiğinde 0.25 ms de bir tane a tusu basıyor. Bu yüzden herhangi bir input girme olanağı vermiyor. Benim aradığım sey klavye tuş vuruşunu algılayıp döngüyü durduracak bir komut.

Cevabınız için teşekkür ederim.

1 Beğeni

tkinter dahil etmişsiniz. Hazırlayacağınız uygulama pencere arayüzlü olacaksa şayet programı durdurmak için bir buton oluşturarak ona atayacağınız fonksiyon ile döngüye harici müdahale edebilirsiniz.

1 Beğeni

def durdur():
#bu fonskiyon dediğiniz gibi döngüyü durduracak. Peki bu fonksiyonun içini nasıl yazmalıyım?

buton=Button(text=“durdur”,command=durdur)

1 Beğeni
def durdur():
    quit()

en sade ve en kaba şekilde bu örnek olabilir.

en sade = tek satırda yazdık fakat;
en kaba = programın tamamını kapatacaktır. Yeniden başlatma gerekecek.

1 Beğeni

Teşşekür ederim hocam ama sanırım benim algoritmayı değiştirmem gerekecek. Çünkü programın açık kalması gerekiyor. Sadece o döngüyü bitirmesi gerekiyor. Ben biraz daha kafa yorayım.

1 Beğeni

Forumda böyle bir şey buldum ve şu şekilde bir kod bırakmış

from pynput import keyboard
COMBINATIONS = [{keyboard.Key}]
current = set()
def on_press(key):    
    print(key)
def on_release(key):
    print(key)
with keyboard.Listener(on_press=on_press,on_release=on_release) as listener:
    listener.join()

üzerinde biraz kafa yorarak istediğimiz fonksiyonları oluşturabiliriz diye düşünüyorum.

1 Beğeni

input() fonksiyonu arkaplanda bastığınız tuşları denetlemiyor, sadece konsola girdi girmenize olanak tanıyor. Yani istediğiniz şey için arkaplanda çalışan bir key listener kullanmalısnız.

pyautogui modülü sadece butonlara basmanızı sağlıyor, içerisinde bir key listener barındırmıyor. Butona basılıp basılmadığını kontrol etmek için pynput modülünü kullanmanızı tavsiye ederim. Buradan dökümantasyonuna ulaşabilirsiniz.

Sorunuza gelecek olursak, kodlar linear bir şekilde akarken bir kod tamamlanmadan bilgisayar diğer satıra geçmez. Yani bilgisayar oluşturduğunuz while True: döngüsüne gelince içerisinde bir break olmadığı için sonraki satırlara geçmeyecek. Sorununuzu çözmek için threading modülünden yararlanabilirsiniz.

Alttaki kodları incelemenizi ve bu konuda araştırma yapmanızı tavsiye ederim.

from pynput.keyboard import Listener
from pynput.keyboard import Key, Controller, KeyCode
from pyautogui import write
from threading import Thread

def sonlandir(key):
    if isinstance(key, Key):
        return
    elif key.char == "q":
        print("çıkılıyor..")
        quit()


def programi_sonlandir():
    with Listener(on_press=lambda tus: sonlandir(tus))  as denetleyici:
        denetleyici.join()


def surekli_yaz():
    while True:
        write("a", interval=0.1)


Thread(target=programi_sonlandir).start()
Thread(target=surekli_yaz, daemon=True).start()
3 Beğeni

Programın kapatılmamasını, sadece döngünün bitmesini isterseniz while döngüsü için bir bool değişkeni kullanabilirsiniz.

from pynput.keyboard import Listener
from pynput.keyboard import Key, Controller, KeyCode
from pyautogui import write
from threading import Thread

def sonlandir(key):
    global dongu_devam
    if isinstance(key, Key):
        return
    elif key.char == "q":
        dongu_devam = False
        return False # False değeri döndürülürse Listener sonlanır


def programi_sonlandir():
    with Listener(on_press=lambda tus: sonlandir(tus))  as denetleyici:
        denetleyici.join()


dongu_devam = True
def surekli_yaz():
    while dongu_devam:
        write("a", interval=0.1)


Thread(target=programi_sonlandir).start()
Thread(target=surekli_yaz).start()
2 Beğeni

Evet, cunku while True asla bitmez. Icine bir kontrol + break veya daha iyisi True yerine bir kontrol koymak lazim. Tabi bu kontrolun sonucunu degistirecek durdur fonksiyonu nasil cagrilacak bilemiyorum.

Programin acik kalmasinin mantigi yok cunku o dongu disinda bir sey yapmiyor ama illa isteniyorsa alta ikinci bir sonsuz loop konabilir.

2 Beğeni

Çok teşekkür ederim cevabınız için çok işime yaradı cevabınız

1 Beğeni

Çok teşşekür ederim cevabınız için. Kafamdaki bütün soru işaretleri gitmiş oldu. Yeni bir metod öğrenmiş oldum.

1 Beğeni