Найти - Пользователи
Полная версия: Прерывание цикла по нажатию клавиши
Начало » Python для новичков » Прерывание цикла по нажатию клавиши
1 2 3
o7412369815963
PooH
Бросьте этих глупостей. Интерактивщина в терминале не нужна.
нужна,
например программа в цикле через сокеты принимает данные, как по нажатию клавиши остановить прием?

можно попробовать запустить raw_input() в отдельном потоке
cutwater
Лучше тогда уже читайте о сигналах. Это более правильный подход к реализации данной задачи.
Rodegast
>но оно останавливает выполнение программы и ждет нажатия клавиши.

Ну и что? Запустите проверку нажатия клавиши в отдельном потоке, при нажатии клавиши изменяйте значение глобальной переменной которая будит проверяться в теле цикла и при необходимости завершать его.
GDK
Rodegast
Запустите проверку нажатия клавиши в отдельном потоке, при нажатии клавиши изменяйте значение глобальной переменной которая будит проверяться в теле цикла и при необходимости завершать его.
+1
Serji_01
Удалось решить проблему? Сейчас стоит именно такая же задача как и у автора. Кто знает как сделать?
UsCr
Serji_01
Удалось решить проблему? Сейчас стоит именно такая же задача как и у автора. Кто знает как сделать?
Serji_01
Rodegast
Rodegast написал:

Запустите проверку нажатия клавиши в отдельном потоке, при нажатии клавиши изменяйте значение глобальной переменной которая будит проверяться в теле цикла и при необходимости завершать его.
Есть мнение, что стоит опробывать сей вариант…
Serji_01
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

может не так надо проверять?
o7412369815963
вариант с потоком:
# 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
Gosha777
Мне кажется это оптимальное решение:

 try:
    while True:
        do_something()
except KeyboardInterrupt:
    pass
Cyr
Рабочий код:
 #!/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':
выход будет по нажатию любой кнопки.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB