wxPython:从另一个wxApp调用wxApp

时间:2011-11-04 19:29:40

标签: python wxpython

是否可以从另一个wxApp运行wxApp? 我试图简单地从另一个wxApp的方法调用我编写的程序(称为DataDeck),就像它是一个插件。

类似的东西:

def on_datadeck_btn_click(self, event):
        import datadeck.main
        datadeck.main.run()
        event.Skip()

其中datadeck.main.run()是wxApp的经典开头:

def run():
    app = DataDeck(0)
    app.SetAppName("DataDeck")
    app.MainLoop()

现在,它第一次正确打开DataDeck并且它可以正常工作,但是在我关闭它之后它不会再次重新打开DataDeck。这会冻结一切。

更新:根据@Mike Driscoll回答,我更多地记录了自己,并提出了以下解决方案:

我在datadeck中添加了一个“入口点”

def run_as_plugin():
    #[do some stuff related to XRC layouts and sysout redirection]
    MainGUI = datadeck.gui.maingui.MainGUI()

MainGUI()的构造函数自动显示wxFrame。现在我的应用程序就像是调用者wxApp的一个组件。 因此,我修改了应用程序方法如下:

def on_datadeck_btn_click(self, event):
    import datadeck.main
    datadeck.main.run_as_plugin()
    event.Skip()

确实非常简单!我只需修改处理stdout重定向的对象(不是这个问题的一部分,我省略了细节),一切正常。

2 个答案:

答案 0 :(得分:1)

完全可行。不知道为什么它对你不起作用。
这个例子非常有效:

- main.py -

import wx

class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title='Main', size=(353,270))
        button= wx.Button(self, -1, 'call app', pos=(10,10), size=(-1,30))
        self.Bind(wx.EVT_BUTTON, self.capp, button)

    def capp(self, event):
        import datadeck
        datadeck.run()

if __name__ == '__main__':
    app = wx.App(0)
    frame = MainFrame(None)
    frame.Show()
    app.MainLoop()

- datadeck.py -

import wx

class DDFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title='DDFrame', size=(353,270))
        button = wx.Button(self, -1, 'print something', pos=(100,100), size=(-1,30))
        self.Bind(wx.EVT_BUTTON, self.say_hello, button)

    def say_hello(self, event):
        print 'something'

class DataDeck(wx.App):
    def OnInit(self):
        frame = DDFrame(None)
        frame.Show()
        return True

def run():
    app = DataDeck(1)
    app.SetAppName("DataDeck")
    app.MainLoop()

如果您按下“通话应用”按钮,则会打开新框架。你可以随意打开。
创建的aplications / frames彼此独立。您可以关闭其中任何一个而不影响其他人。系统不会冻结。

答案 1 :(得分:1)

应该只在wx.App上。从我在网上看到的,你不能在一个脚本中运行两个wx.App对象。您可以使用子进程模块来打开一个新进程。看看Editra,看看如何做插件的一些例子。它包含在wxPython中,或者您可以单独下载。