程序简介:
该程序包含两个线程,一个线程就是不断的循环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()方法