당신은 스레드, 여기에 기본 예제이라고 할 수 있습니다 : 평소처럼
import threading, os, time, itertools, Queue
# setting a cross platform getch like function
# thks to the Python Cookbook
# why isn't standard on this battery included language ?
try : # on windows
from msvcrt import getch
except ImportError : # on unix like systems
import sys, tty, termios
def getch() :
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try :
tty.setraw(fd)
ch = sys.stdin.read(1)
finally :
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
# this will allow us to communicate between the two threads
# Queue is a FIFO list, the param is the size limit, 0 for infinite
commands = Queue.Queue(0)
# the thread reading the command from the user input
def control(commands) :
while 1 :
command = getch()
commands.put(command) # put the command in the queue so the other thread can read it
# don't forget to quit here as well, or you will have memory leaks
if command == "q" :
break
# your function displaying the words in an infinite loop
def display(commands):
string = "the fox jumped over the lazy dog"
words = string.split(" ")
pause = False
command = ""
# we create an infinite generator from you list
# much better than using indices
word_list = itertools.cycle(words)
# BTW, in Python itertools is your best friend
while 1 :
# parsing the command queue
try:
# false means "do not block the thread if the queue is empty"
# a second parameter can set a millisecond time out
command = commands.get(False)
except Queue.Empty, e:
command = ""
# behave according to the command
if command == "q" :
break
if command == "p" :
pause = True
if command == "r" :
pause = False
# if pause is set to off, then print the word
# your initial code, rewritten with a generator
if not pause :
os.system("clear")
print word_list.next() # getting the next item from the infinite generator
# wait anyway for a second, you can tweak that
time.sleep(1)
# then start the two threads
displayer = threading.Thread(None, # always to None since the ThreadGroup class is not implemented yet
display, # the function the thread will run
None, # doo, don't remember and too lazy to look in the doc
(commands,), # *args to pass to the function
{}) # **kwargs to pass to the function
controler = threading.Thread(None, control, None, (commands,), {})
if __name__ == "__main__" :
displayer.start()
controler.start()
, 스레드를 사용하는 것이 까다 롭다, 그래서 당신은 당신이 코딩하기 전에 무엇을 이해해야합니다.
경고 :) (해당 사항 String.split주의 더 간단하게 ("") 사항 String.split를 대체 할 수 대기열이 질문에 파이썬 3
관련없는에서 큐의 이름을 변경합니다. – EOL
@EOL :'string.split()'과'string.split ("")'은 같은 것이 아닙니다. – SilentGhost
멋지다, 1 명의 담당자가오고, asling하고, 그 다음가는 것을 가지고있는 사람. 그거 사랑해. –