Skocz do zawartości
bantech

python3 potrzebne rozwiązanie - czekanie na wciśnięcie przycisku

Pomocna odpowiedź

czy da się zrobić coś w stylu że jeśli np w ciągu 30 sekund nie wcisnę przycisku na raspberry to odpali się dalsza część kodu z pominięciem tej która miała się teraz odbyć? 

Udostępnij ten post


Link to post
Share on other sites

Rozumiem, że jeśli naciśniesz przycisk to ma się odpalić fragment A, a po nim fragment B; jeśli w ciągu 30 sekund nie naciśniesz to od razu przejść do fragmentu B?

Oczywiście, da się to zrobić bez problemu. Użyj w pętli oczekiwania time.sleep() z jakąś niewielką wartością (np. 0.1 sekundy).

Coś w stylu:
 

t = time.time()
while time.time() - t < 30:
  if klawisz_wcisniety():
    #wykonaj kod po wcisnieciu klawisza
    A()
    break
  else:
    # dajmy systemowi czas na swoje systemowe sprawy
    time.sleep(0.1)
# a tu dalsza część kodu
B()

 

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@ethanak tam gdzie są # z dopiskiem tutaj to chodzi o to że jeśli serwer wyśle mi wiadomość powrotną że dostał wiadomość to napisze że połączono a jak nie dostanę wiadomości zwrotnej od serwera w ciągu 5 sekund to skrypt wróci do początku. czy ja w if mogę wkleić to data, server = sock.recvfrom(4096)?

def laczenie():
	print("Podaj ip robocika")
    ip=str(input(">>>"))
    print("Łączenie z robocikiem...")
 # Tworzenie socketu UDP
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_address = (ip, 10002)
    Laczeniee=b"999"
    while True:
        try:
            sent = sock.sendto(Laczeniee, server_address)
            print("wyslano zapytanie o polaczenie")
            while True:               ###################################Tutaj
                t.sleep(5)
                data, server = sock.recvfrom(4096)
                if data:
                    print("polaczono")
                    break
                else:
                    print("ponowne łączenie za 5 sekund")
                    continue
        except socket.gaierror:
            print("złe ip")     
            laczenie()                 #######################################

 

ale dziękuje za tamten kod bo w dalszej części się przyda

 

Edytowano przez bantech

Udostępnij ten post


Link to post
Share on other sites

Rozumiem, że nie możesz się zdecydować czy to klawisz czy co...

Nie, nie możesz tego wkleić do ifa. Do sprawdzania czy jakieś dane się na sockecie pojawiły służy select (o tyle miły że można  jednocześnie czekać na więcej niż jedno zdarzenie i przerwać czekanie po określonym czasie), jeśli nie chcesz selecta to możesz użyć settimeout().

Ogólnie poczytaj sobie tutaj: https://docs.python.org/3.7/library/socket.html, tam masz wszystko na ten temat. I jeszcze ogólnie: zaczynaj od zaglądania do dokumentacji a potem pytaj na forum czego nie rozumiesz, a nie od pytania na forum po to, aby się dowiedzieć gdzie jest dokumentacja.

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

@ethanak dziękuje settimeout() zadziałało 😄 

2 godziny temu, ethanak napisał:

zaczynaj od zaglądania do dokumentacji a potem pytaj na forum czego nie rozumiesz

a czasami u mnie z angielskim średnio i nie zawsze wszystko zrozumiem ale nie wiedziałem i nie myslałem o tym że socket ma taką opcję myślałem że jakoś innaczej musiałem to robić

 

Udostępnij ten post


Link to post
Share on other sites
10 godzin temu, bantech napisał:

a czasami u mnie z angielskim średnio i nie zawsze wszystko zrozumiem

Niestety - jakieś 90% dokumentacji w necie jest po angielsku, 9% po chińsku więc co najmniej jeden z tych dwóch języków musisz przynajmniej w stopniu podstawowym opanować. Angielski podobno łatwiejszy 😉

Wracając do problemu: spróbuj jednak - choćby dla nabrania wprawy, traktując to jako ćwiczenie - użyć select. Na 100% Ci się przyda jeśli nie dziś to za jakiś czas, a wtedy już będziesz wiedział gdzie szukać rozwiązania.

A, i oczywiście (również jako ćwiczenie) znalezienie samodzielnie gdzie jest ten select i z czym go się je, bez pytań na forum! Jeszcze bardziej się przyda 🙂

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Ja bym był z czymś takim ostrożny...

Po pierwsze: to nie dokumentacja, a taka informacja że takie coś w ogóle istnieje.

Po drugie: najnowsze artykuły na tej stronie są sprzed dwóch lat, te o których piszesz są jeszcze starsze: w kodzie strony można znaleźć informację:

<meta itemprop="datePublished" content="2008-07-14T11:22:47+02:00"/>

Przez te 11 lat świat Pythona mógł nieco pójść do przodu...

Weź się lepiej za angielski, a artykuły z tego okresu pozostaw archeologom 🙂

A, od razu uwaga: nie zrozum mnie źle, nie chcę twierdzić że jeśli coś ma więcej niż kilka lat to jest złe. Sam w najnowszej aplikacji zastosowałem fragment kodu z 2012 roku (filtr biquad), a w Lektorze użyłem oryginalnego kodu Klatta z 1983 roku. Tyle, że wzory filtrów raczej się nie zmieniają... a język ewoluuje!

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...