2014-11-03 50 views
0

我想使用python wxpython按钮单击事件启动一个windows批处理文件。使用python wxpython启动Windows批处理文件按钮单击事件

import wx 
import subprocess 


class MyFrame(wx.Frame): 
    """ Dervice new class of Frame""" 
    def __init__ (self, parent, title) 
     wx.Frame.__init__(self,parent,title=title,size=(410,355)) 
     panel = wx.Panel(self)   
     startbutton = wx.Button(panel, label="Start", pos=(200,70), size=(80,25)) 
     self.Bind(wx.EVT_BUTTON,self.StartClicked, startbutton) 


    def StartClicked(self, event): 
     print "Session started" 
     self.filepath="C:\\cygwin64\\Sipp_3.2\\Auto.bat" 
     subprocess.call(self.filepath) 
     print "Session ended" 


if __name__ == '__main__': 
app = wx.App() 
frame = MyFrame(None, "CallGenerator") 
frame.Show() 
app.MainLoop() 

以下是每次输出,当我点击“开始”按钮。

>Session started 
>Session ended 
>Session started 
>Session ended 

代码无法打开批处理文件。但是当我执行通过命令提示符时,通过命令提示符执行批处理文件。

我正在使用pyscripter和如何打开批处理文件作为一个新窗口?

同样,如果批处理文件包含连续ping(ping ipaddress -t),则GUI将崩溃。

现在我的两个问题的解决方案是什么。

回答

0

程序可能正在调用批处理文件,但因为您没有重定向进程的stdout/stderr,所以您不会看到它在做什么。您可能需要使用subprocess模块的communicate方法来获取批处理文件的输出并使用该信息更新GUI。

您提到批处理文件运行一个长时间运行的进程。这将阻止GUI的主循环,这就是UI变得无法响应的原因。如果您使用的是popen,您可能可以解决该问题,但正确的解决方案是将子进程调用放入线程中,然后通过wx的线程安全方法之一将结果从线程返回给UI,例如wx.CallAfterwx.PostEvent

更多信息请参见下面的文章:

+0

大麦克,谢谢。它现在的工作:) – vallikkv 2014-11-04 17:49:49