Проблема здесь в том, что raw_input ожидает ввода, чтобы очистить входной поток; проверить его документацию . PyScripter, вероятно, видит, что программа ожидает ввода и выдает вам поле ввода (не знаю точно, никогда не использовал его).
Программа работает точно так, как я ожидаю от командной строки; вторичный поток блокируется на raw_input, пока я не нажму "q [enter]", после чего программа завершится.
Это не так, AFAICS, легко проверить и посмотреть, доступен ли символ во входном потоке, прежде чем блокировать вызов чтения. Вы, вероятно, должны проверить эту ветку о том, как читать символ блокирующим способом без необходимости ввода [enter], а затем этот пост о проблеме чтения символа без блокирования при все.
Возможно, вы можете использовать комбинацию msvcrt.kbhit в Windows и этот рецепт из FAQ по Python, чтобы получить символ q без необходимости нажатия клавиш, но я оставлю это в качестве упражнения для читателя .
Приложение: Одна вещь, которую вы могли бы сделать, это использовать библиотеку select, чтобы установить тайм-аут при чтении с клавиатуры, что сделает вашу программу более ожидаемой:
import sys
import threading
import time
import select
def timeout_read(n_chars):
r, _, _ = select.select([sys.stdin], [], [], 1)
return r[0].read(n_chars) if r else ""
class MyThread (threading.Thread):
def run (self):
try:
self.wantQuit = 0
while not self.wantQuit:
print "want input"
button = timeout_read(1)
if button == "q":
self.wantQuit=1
except KeyboardInterrupt:
self.wantQuit = 1
print "abort with KeyboardInterrupt"
print "done mythread"
myThread = MyThread ()
myThread.start()
a=5
while not myThread.wantQuit:
print "hey"
if (a == 0):
break;
a = a-1;
time.sleep(1)
myThread.wantQuit=1
print "main thread done"
Обратите внимание, что вам все равно нужно будет нажать "q [enter]" с этим решением.