2015-10-08 1 views
0

Мне нужно открутить один поток, который будет непрерывно работать в фоновом режиме и возвращать набор из 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

+0

Вы могли бы быть в состоянии увидеть проблему, если вы удалите все не обязательно, чтобы воспроизвести проблему. –

+0

Собственно, вот что это. Мой полный код намного больше и не работал, поэтому я сломал его до этого минимального набора. – user72055

+0

Вы действительно считаете, что вы не можете удалить звонки termios и все такое? Как насчет выхода? Вы пытались удалить начало потока и заменить его простым вызовом функции? Кроме того, «кажется, что» с некоторой интерпретацией не является хорошим описанием, скорее сообщите о своих наблюдениях. –

ответ

0

Причина, по которой мои разделенные основные функции и функции не работали, заключается в том, что я не объявлял, что char был глобальным в основном перед вызовом функций. Исправленный код ниже и работает для меня:

главный

#!/usr/bin/env python 
# main 
from functions import * 
import thread 
import time 
global char # must be declared as global before any functions that access it 
char = None 
thread.start_new_thread(keypress,()) 
while True: 
    global char 
    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) 
    char = getch() 

функции

#!/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()