Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 13, 2009 06:10:23

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

PooH
Бросьте этих глупостей. Интерактивщина в терминале не нужна.
нужна,
например программа в цикле через сокеты принимает данные, как по нажатию клавиши остановить прием?

можно попробовать запустить raw_input() в отдельном потоке

Офлайн

#2 Окт. 13, 2009 08:54:47

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

Лучше тогда уже читайте о сигналах. Это более правильный подход к реализации данной задачи.



Офлайн

#3 Окт. 13, 2009 10:18:59

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2751
Репутация: +  184  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

>но оно останавливает выполнение программы и ждет нажатия клавиши.

Ну и что? Запустите проверку нажатия клавиши в отдельном потоке, при нажатии клавиши изменяйте значение глобальной переменной которая будит проверяться в теле цикла и при необходимости завершать его.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Окт. 13, 2009 11:21:53

GDK
От:
Зарегистрирован: 2009-08-21
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

Rodegast
Запустите проверку нажатия клавиши в отдельном потоке, при нажатии клавиши изменяйте значение глобальной переменной которая будит проверяться в теле цикла и при необходимости завершать его.
+1



Офлайн

#5 Апрель 5, 2010 14:50:28

Serji_01
От:
Зарегистрирован: 2010-04-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

Удалось решить проблему? Сейчас стоит именно такая же задача как и у автора. Кто знает как сделать?



Офлайн

#6 Апрель 5, 2010 15:01:47

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

Serji_01
Удалось решить проблему? Сейчас стоит именно такая же задача как и у автора. Кто знает как сделать?
Serji_01
Rodegast
Rodegast написал:

Запустите проверку нажатия клавиши в отдельном потоке, при нажатии клавиши изменяйте значение глобальной переменной которая будит проверяться в теле цикла и при необходимости завершать его.
Есть мнение, что стоит опробывать сей вариант…



Офлайн

#7 Апрель 5, 2010 15:36:21

Serji_01
От:
Зарегистрирован: 2010-04-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

UsCr
Есть мнение, что стоит опробывать сей вариант…
Попробовал, может неочень правильный? У меня по-прежнему происходит ожидание нажатия клавиши, и только потом цикл продолжается.

def getchar():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
i=0

while 1:
print i
i = i+1
if getchar()=='0':
break

может не так надо проверять?



Офлайн

#8 Апрель 5, 2010 16:14:06

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

вариант с потоком:

# coding: utf8

import thread, time

def myfunction(stop):
while 1:
print '.',
if stop[0]: break
time.sleep(0.3)

stop = [0]
thread.start_new_thread(myfunction,(stop,))
raw_input('')
stop[0]=1

Офлайн

#9 Авг. 20, 2017 21:44:31

Gosha777
Зарегистрирован: 2017-05-12
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

Мне кажется это оптимальное решение:

 try:
    while True:
        do_something()
except KeyboardInterrupt:
    pass

Отредактировано Gosha777 (Авг. 20, 2017 21:45:05)

Офлайн

#10 Июль 19, 2018 15:42:31

Cyr
Зарегистрирован: 2012-09-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Прерывание цикла по нажатию клавиши

Рабочий код:

 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys, select, termios
def kbhit():
  r = select.select([sys.stdin], [], [], 0)
  return bool(r[0])
if __name__ == '__main__':
  fd = sys.stdin.fileno()
  old_term = termios.tcgetattr(fd)
  new_term = termios.tcgetattr(fd)
  new_term[3] = (new_term[3] & ~termios.ICANON & ~termios.ECHO)
  try:
     termios.tcsetattr(fd, termios.TCSAFLUSH, new_term)
     while 1:
       if kbhit():
         ch = sys.stdin.read(1)
         if ch=='0':
           break
       sys.stdout.write('.')
     print ('done')
  finally:
     termios.tcsetattr(fd, termios.TCSAFLUSH, old_term)
Выход из цикла по нажатию нуля. Если убрать строчку:
if ch=='0':
выход будет по нажатию любой кнопки.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version