【问题标题】:Start Windows Batch file using python wxpython Button click Event使用 python wxpython 启动 Windows 批处理文件按钮单击事件
【发布时间】:2014-11-03 21:32:57
【问题描述】:

我想使用 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 会崩溃。

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

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    程序可能正在调用批处理文件,但由于您没有重定向进程的 stdout/stderr,因此您看不到它在做什么。您可能希望使用subprocess 模块的communicate 方法从批处理文件中获取输出并使用该信息更新GUI。

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

    有关详细信息,请参阅以下文章:

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 2016-04-24
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多