在wxpython GUI中加载并运行另一个.py文件

时间:2013-08-26 09:12:21

标签: wxpython

使用wx python编写GUI脚本。我需要的是加载另一个python文件并运行使用GUI为python文件的变量提供输入(值)的选项。并显示python文件的结果。 我能够加载文件需要运行....

1 个答案:

答案 0 :(得分:0)

以下是我GooeyPi application.的一些代码。它是PyInstaller的GUI前端。它使用一些标志运行pyinstaller.py代码,并将输出发送到textctrl小部件。它使用wx.Yield来避免锁定接口,尽管将代码移动到自己的线程是另一种选择。

class GooeyPi(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(GooeyPi, self).__init__(*args, **kwargs)
        ...
        # Results go in here. Read only style so people can't write in it.
        self.txtresults = wx.TextCtrl(self.panel, size=(420,200),
                                      style=wx.TE_MULTILINE|wx.TE_READONLY)


    def OnSubmit(self, e):
        ...
        # getflags returns something like ['python.exe', 'pyinstaller.py' '--someflag' '--someotherflag']
        flags = util.getflags(self.fbb.GetValue())
        logging.debug('calling subprocess {}'.format(flags))
        for line in self.CallInstaller(flags):
            self.txtresults.AppendText(line)               

    def CallInstaller(self, flags):
        ' Generator function, yields on every line in output of command 
        p = subprocess.Popen(flags, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        while(True):
            retcode = p.poll()
            line = p.stdout.readline()
            wx.Yield() # Prevent GUI from freezing
            yield line
            if(retcode is not None):
                yield ("Pyinstaller returned return code: {}".format(retcode))
                break

我的getflags函数供参考。它使用sys.executable来查找python二进制文件的路径,使用os.path.join来查找要运行的python脚本的路径。然后它会根据我的配置文件附加一些标志。然后返回结果列表。

def getflags(fname):
    flags=[]
    flags.append(sys.executable) # Python executable to run pyinstaller
    flags.append(os.path.join(config['pyidir'], 'pyinstaller.py'))
    if config['noconfirm']:
        flags.append('--noconfirm')
    if config['singlefile']:
        flags.append('--onefile')
    if config['ascii']:
        flags.append('--ascii')
    if config['windowed']:
        flags.append('--noconsole')
    if config['upxdir'] != '':
        flags.append('--upx-dir=' + config['upxdir'])
    if pyversion(config['pyidir']) == 2.1:
        flags.append('--distpath=' + os.path.dirname(fname))
    else:
        flags.append('--out=' + os.path.dirname(fname))
    flags.append(fname)
    return(flags)