程序简介:
该程序包含两个线程,一个线程就是不断的循环print一个递增的数,另一个线程就是监控键盘,如果键盘按下F12,则两个线程都停止。
出现的情况:
1.这个程序在python的IDLE(Shell)中按F5可以直接执行,但是双击.py文件不能执行。(我已经设置环境变量,双击其他单线程的程序都能直接执行的)
2.我发现双击这个程序的py文件,会有一个cmd框瞬间弹出,一些文字一闪而过。于是我就在程序末尾添加raw_input()语句,本来我是想看看那段一闪而过的文字的,没想到添加这句后,程序居然可以双击py文件运行了
3.可是,当我把程序用py2exe打包成exe时,貌似由于exe文件没有cmd那个框框,所以会报错。
请问大神:
为什么程序末尾添加raw_input()则可以双击py文件执行,而不添加这一句就不能执行?求解决方案?
*********************************************************
程序代码:
#!/usr/bin/env python
# -*- coding: GBK -*-
import pythoncom
import pyHook
import win32api
import win32con
import win32gui
import time
import thread
theEndString='1'
i=0
def onKeyboardEvent(event):
"处理键盘事件"
"判断是否终止程序"
if str(event.Key)=='F12': #按下F12后终止
win32api.PostQuitMessage() #若执行这一步,则跳到pythoncom.PumpMessages()之后
return True
def PlayRecord(name):
global i
while True:
i +=1
print i
if theEndString == 'End':
break
thread.exit_thread() #结束线程
def WaitForKeyboard(name):
global theEndString
hm = pyHook.HookManager()
#监控键盘
hm.KeyDown = onKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages(10000) #消息循环
theEndString = 'End'
thread.exit_thread() #结束线程
def test():
thread.start_new_thread(PlayRecord, ('A',))
thread.start_new_thread(WaitForKeyboard, ('B',))
if __name__== '__main__':
test()
#raw_input() #添加这一句,则能双击py文件执行,如果没有则一句,双击py文件则不行
很明显,你新建的这两个线程不在主线程生命周期内。所以,主线程关闭了,你新建的线程也会被强制关闭。
解决方法:
使用高一级的线程封装threading.Thread
启动线程后,调用th.join()方法
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。