Я пытаюсь создать простой IRC-клиент на Python (как своего рода проект, пока я изучаю язык).
У меня есть цикл, который я использую для получения и анализа того, что отправляет мне IRC-сервер, но если я использую raw_input для ввода данных, это останавливает цикл на месте, пока я что-то не введу (очевидно).
Как я могу ввести что-либо без остановки цикла?
(Я не думаю, что мне нужно публиковать код, я просто хочу ввести что-то без while 1: остановки цикла.)
Я в Windows.
Переведено автоматически
Ответ 1
Только для Windows, консоли, используйте msvcrt модуль:
import msvcrt
num = 0 done = False whilenot done: print(num) num += 1
if msvcrt.kbhit(): print"you pressed",msvcrt.getch(),"so now i will quit" done = True
Для Linux в этой статье описывается следующее решение, для него требуется termios модуль:
num = 0 done = False whilenot done: display( str(num) ) num += 1
pygame.event.pump() keys = pygame.key.get_pressed() if keys[K_ESCAPE]: done = True
Ответ 2
Это самое потрясающее решение1, которое я когда-либо видел. Вставлено сюда на случай, если ссылка отключится:
#!/usr/bin/env python ''' A Python class implementing KBHIT, the standard keyboard-interrupt poller. Works transparently on Windows and Posix (Linux, Mac OS X). Doesn't work with IDLE.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
'''
import os
# Windows if os.name == 'nt': import msvcrt
# Posix (Linux, OS X) else: import sys import termios import atexit from select import select
classKBHit:
def__init__(self): '''Creates a KBHit object that you can call to do various keyboard things. '''
if os.name == 'nt': pass
else:
# Save the terminal settings self.fd = sys.stdin.fileno() self.new_term = termios.tcgetattr(self.fd) self.old_term = termios.tcgetattr(self.fd)
defgetch(self): ''' Returns a keyboard character after kbhit() has been called. Should not be called in the same program as getarrow(). '''
s = ''
if os.name == 'nt': return msvcrt.getch().decode('utf-8')
else: return sys.stdin.read(1)
defgetarrow(self): ''' Returns an arrow-key code after kbhit() has been called. Codes are 0 : up 1 : right 2 : down 3 : left Should not be called in the same program as getch(). '''
if os.name == 'nt': msvcrt.getch() # skip 0xE0 c = msvcrt.getch() vals = [72, 77, 80, 75]
else: c = sys.stdin.read(3)[2] vals = [65, 67, 66, 68]
return vals.index(ord(c.decode('utf-8')))
defkbhit(self): ''' Returns True if keyboard character was hit, False otherwise. ''' if os.name == 'nt': return msvcrt.kbhit()