Мне нужно открутить один поток, который будет непрерывно работать в фоновом режиме и возвращать набор из 10 чисел/символов в основную программу каждый раз, когда они будут введены, не удерживая основную программу. FYI. Следующий код должен теперь работать как на MS Windows, так и на Linux. Следующий код теста питон 2.7x работы:Возвращает глобальную переменную из функции python с потоком
#!/usr/bin/env python
import thread
import time
try:
from msvcrt import getch # try to import Windows version
except ImportError:
def getch(): # define non-Windows version
import sys, tty, termios
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
char = None
def keypress():
global char
char = getch()
thread.start_new_thread(keypress,())
while True:
if char is not None:
print "Key pressed is %s" % char
char = None
else:
print "\nNo keys pressed, continue program is running\n"
time.sleep(2)
global char
char = getch()
Но когда я разбить его на две части, main.py и functions.py, кажется, что глобальная переменная не возвращается:
основной. ру
#!/usr/bin/env python
# main
from functions import *
import thread
import time
thread.start_new_thread(keypress,())
while True:
if char is not None:
print "Key pressed is %s" % char
break
# char = None
else:
print "\nNo keys pressed, continue program is running\n"
time.sleep(1)
functions.py
#!/usr/bin/env python
#functions.py
char = None
try:
from msvcrt import getch # try to import Windows version
except ImportError:
def getch(): # define non-Windows version
import sys, tty, termios
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
def keypress():
global char
char = getch()
Я считаю, что р roblem заключается в том, что глобальная переменная char не возвращается к основной программе через поток, который обращается к функции нажатия клавиши. Любая помощь будет принята с благодарностью. TIA
Вы могли бы быть в состоянии увидеть проблему, если вы удалите все не обязательно, чтобы воспроизвести проблему. –
Собственно, вот что это. Мой полный код намного больше и не работал, поэтому я сломал его до этого минимального набора. – user72055
Вы действительно считаете, что вы не можете удалить звонки termios и все такое? Как насчет выхода? Вы пытались удалить начало потока и заменить его простым вызовом функции? Кроме того, «кажется, что» с некоторой интерпретацией не является хорошим описанием, скорее сообщите о своих наблюдениях. –