Python, čas a rohodování podle klinutí enteru – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Python, čas a rohodování podle klinutí enteru – Python – Fórum – Programujte.comPython, čas a rohodování podle klinutí enteru – Python – Fórum – Programujte.com

 

Arthas
~ Anonymní uživatel
6 příspěvků
7. 2. 2013   #1
-
0
-

Ahoj,

Snažím se udělat v pythonu 2.7.3 program na takovýto systém, ale nevím jak na to. Jde mi o to, že se mi generují čísla v cyklu (přepisují se) a já chci, abych když zmáčknu enter, tak se mi to aktuální číslo uložilo a ten cyklus se přerušil. (Problém je v tom, že když dám třeba if raw_input(), tak to zastaví ten cyklus, ptotože to čeká na data z klávesnice).

Díky za odpovědi :)

Nahlásit jako SPAM
IP: 78.80.240.–
Wrunx
~ Anonymní uživatel
35 příspěvků
7. 2. 2013   #2
-
0
-

# je to takove polovicate reseni, reaguje na stisk Ctrl+C, pote ukonci smycku a pokracuje v pgmu.
import time, sys
a=0; print "Cislo si stopni Ctrl+C"
try:
    while 1:
        a+=1; print a,; time.sleep(0.3); sys.stdout.flush()
except KeyboardInterrupt:
    pass

print"\n vybrano bylo cislo",a

Nahlásit jako SPAM
IP: 188.120.195.–
Wrunx
~ Anonymní uživatel
35 příspěvků
7. 2. 2013   #3
-
0
-

Takže ještě jedno imho elegantní řešení, které ve smyčce detekuje libovolnou klávesu (ukončit lze stiskem "x"), pomocí modulu curses:

import curses,time,sys

def main(stdscr):
 stdscr.nodelay(1)
 a=0; c=0
 while c != ord("x"):
   a+=1
   c = stdscr.getch() # cti stav keyb
   if c != -1:
    print "[stiskl jsi",chr(c),"a cislo je",a,"] ",
   else: # vracena -1 znamena ze kbd vstup neobsahoval zadny znak
    print a,
   sys.stdout.flush(); time.sleep(0.3)

if __name__ == '__main__':
 curses.wrapper(main)
 print "pokracovani programu..."

Nahlásit jako SPAM
IP: 188.120.195.–
Arthas
~ Anonymní uživatel
6 příspěvků
7. 2. 2013   #4
-
0
-

Hodně moc mě zaujalo to první řešení, bohužel ale vůbec nevím, k čemu je sys.stdout.flush(). Mohl bych k tomu dostat nějaké malé info prosím? :)

A KeyboardInterrupt, to je přímo nějaké pythonské přerušení programu pomocí ctrl+C?

Nahlásit jako SPAM
IP: 78.80.240.–
sairon0
Newbie
8. 2. 2013   #5
-
0
-

Výstup na stdout je bufferovaný a pravděpodobně bys v tom cyklu neviděl výstup hned, jakmile interpreter dojede na řádek s printem. Následným voláním flush() se ti vše, co je v bufferu, vyplivne na obrazovku, takže bude ten výstup "realtime", jednoduše řečeno.

A ano, KeyboardInterrupt je výjimka, která je vyvolána v případě, kdy při běhu programu zmáčkneš ctrl+C. Když tuhle výjimku chytáš, chce to zvážit, jestli to nechce ještě nějakou únikovou cestu z programu, protože ti potom ctrl+C nesestřelí program (ačkoliv se občas dá program "uklikat", když se dostane mimo try blok) a buď budeš muset počkat na doběhnutí nebo sestřelit jeho proces.

Nahlásit jako SPAM
IP: 62.245.90.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý