Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Python raw_input без enter в цикле while  (Прочитано 2637 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн fshlik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Python raw_input без enter в цикле while
« : 12 Февраля 2013, 14:26:00 »
Доброго времени суток!
***
Пишу программку на Python, недавно сталкивался с подобной проблемой в bash скриптах
здесь помогли.
Спасибо ArcFi
Код: Bash
    CODE="0" ; while : ; do read -n1 -s -t1 LINE && CODE="$LINE" ; case "$CODE" in [0-2]) echo "$CODE" ;; 3) echo "$CODE" ; break ;; *) echo "unknown" ;; esac ; done

Решил тоже переписать на Python и снова эта проблема:

Алгоритм следующий: цикл работает прибавляя счетчик (я вместо него функцию
записи на COM порт подставю) и каждый раз проверяя не ввели ли чего нить с клавитатуры, если не ввели, то продолжает дальше помня что ввели ранее, без ввода и без enter. :-[

Или помогите разобраться с raw_input, чтобы в цикле на нем не останавливалось,
но можно было ввести что-нибудь с клавитатуры   :'(

Заранее спасибо :-[
#!/usr/bin/env python
# Python 2.6.5
import os
import time

cmd='0'
os.system('clear')
count=0
while True:
time.sleep(0.5)
count=count+1
print count

if cmd=='1':
os.system('clear')
print "sent xAA"
                #func send data1 to com port
if cmd=='2':
os.system('clear')
print "sent xBB"
                #func send data2 to com port
if cmd=='3':
os.system('clear')
break
print "Exit prg"
cmd=raw_input("Please input:\n1)start\n2)stop\n3)exit prg\n>>")



Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Python raw_input без enter в цикле while
« Ответ #1 : 12 Февраля 2013, 20:30:24 »
Обычно это делается двумя способами. Либо вы создаете два потока, один слушает клавиатурный ввод, а второй занимается "полезным" делом, либо используете неблокирующий ввод/вывод. Второй вариант проще и с меньшим оверхедом, про применение в питоне читать здесь http://docs.python.org/3/library/select.html и здесь http://stackoverflow.com/questions/292095/polling-the-keyboard-in-python.
P.S. Не поленился, залез в гугл, первая же ссылка - ответ на ваш вопрос.

Оффлайн fshlik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Python raw_input без enter в цикле while
« Ответ #2 : 12 Февраля 2013, 21:28:01 »
Обычно это делается двумя способами. Либо вы создаете два потока, один слушает клавиатурный ввод, а второй занимается "полезным" делом, либо используете неблокирующий ввод/вывод. Второй вариант проще и с меньшим оверхедом, про применение в питоне читать здесь http://docs.python.org/3/library/select.html и здесь http://stackoverflow.com/questions/292095/polling-the-keyboard-in-python.
P.S. Не поленился, залез в гугл, первая же ссылка - ответ на ваш вопрос.

Спасибо, сдвинули с места весь день ищу решение. В гугле искал по запросу without enter, сейчас изучаю Ваши ссылки.
Пока нашел довольно странное решение. но при добавлении while 1: работает:
import signal
TIMEOUT = 5 # number of seconds your want for timeout

def interrupted(signum, frame):
    "called when read times out"
    print 'interrupted!'
signal.signal(signal.SIGALRM, interrupted)

def input():
    try:
            print 'You have 5 seconds to type in your stuff...'
            foo = raw_input()
            return foo
    except:
            # timeout
            return

# set alarm
signal.alarm(TIMEOUT)
s = input()
# disable the alarm after success
signal.alarm(0)
print 'You typed', s
это отсюда http://stackoverflow.com/questions/1335507/keyboard-input-with-timeout-in-python

Я попробовал через потоки, но управлять ими оказалось довольно сложно мне начинающему,
в C# умею, а здесь не хватает этих abort(). Позже обязательно изучу.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Python raw_input без enter в цикле while
« Ответ #3 : 12 Февраля 2013, 21:43:49 »
Это не просто странное решение, это идеальный вариант для отправки на сайт govnokod.ru. И гуглить надо было async keybord, по первой же ссылке есть пример кода:
import sys
import select

def heardEnter():
    i,o,e = select.select([sys.stdin],[],[],0.0001)
    for s in i:
        if s == sys.stdin:
            input = sys.stdin.readline()
            return True
    return False
Объяснение кода есть в официальной документации питона, ссылка на которую есть в моем первом посте.

Оффлайн fshlik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Python raw_input без enter в цикле while
« Ответ #4 : 13 Февраля 2013, 16:03:00 »
Это не просто странное решение, это идеальный вариант для отправки на сайт govnokod.ru. И гуглить надо было async keybord, по первой же ссылке есть пример кода:
import sys
import select

def heardEnter():
    i,o,e = select.select([sys.stdin],[],[],0.0001)
    for s in i:
        if s == sys.stdin:
            input = sys.stdin.readline()
            return True
    return False
Объяснение кода есть в официальной документации питона, ссылка на которую есть в моем первом посте.

Спасибо за помощь, все заработало :)

 

Страница сгенерирована за 0.051 секунд. Запросов: 25.