wxPython:从另一个wxApp调用一个wxApp

wxPython:从另一个wxApp调用一个wxApp,python,wxpython,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 =

是否可以从另一个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之后,它不会再次打开DataDeck。这会冻结一切

更新:根据答案,我对自己进行了更多记录,并得出以下解决方案:

我在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重定向的对象(不是这个问题的一部分,我省略了细节),一切正常。

这是完全可行的。不知道为什么它不适合你。
这个例子非常有效:

--main.py--

--datadeck.py--

如果按下“呼叫应用”按钮,则会打开新框架。您可以打开任意数量的文件。

创建的应用程序/框架相互独立。您可以在不影响其他人的情况下关闭其中任何一个。而且系统不会冻结。

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

+1因为您对这个示例几乎是正确的。但是我会接受另一个答案,因为a)wxPython社区似乎同意这一点b)我在datadeck中成功地让它工作了,而没有创建一个新的wxApp,只是为了从另一个wxAppalmost调用,对吗?您询问如何从另一个wxApp调用一个wxApp,我向您演示了如何调用。另一个答案说这是不可能的。。。你投另一个。真的很奇怪……嗯,你的例子很有效,我不得不承认。但这在我的情况下不起作用。也许因为datadeck不是一个普通的应用程序,我试图通过调用datadeck来增强的应用程序也不是。我真的不知道。没什么私事,因为这个奇怪的情况,我给了你+1。迈克·德里斯科尔(Mike Driscoll)提出的避免在同一过程中使用两个wx.App的想法让我找到了答案。无论如何,非常感谢你的例子!好的,这个插件是实例化从另一个类调用的wxpython类的常用方法。小问题是那不是你的问题。不管怎样,别介意。一次拥有多个wx.App的行为充其量是“未定义”的,并且依赖于平台。在实践中,它很可能是脆弱的,很可能在时空中崩溃或撕裂一个洞。这样做的主要原因是,本机UI库是在创建wx.App对象时初始化的,并且在运行时环境中为wx和wx对象执行了许多类似初始化的操作。其中一些操作只能执行一次。wx的东西我们可以处理,但平台库等不是那么容易。你是对的,即使你没有直接建议我如何实现解决方案,你给我指出了正确的方向:避免调用负责创建wx.App的datadeck方法。查看我的问题以获取更新。谢谢@Mike Driscoll,Mike,如果做不到,那么我的代码在做什么?很抱歉,我遗漏了一些东西。@joaquin-我请罗宾·邓恩对你的答案发表评论,解释为什么这不是一个好主意,因为我自己不知道如何回答你。我希望他的评论澄清了这个问题。@Mike Driscoll。我很荣幸能从罗宾·邓恩和迈克·德里斯科尔等wxpython大师那里获得私人课程。谢谢你的工作。@joaquin你的wxPython知识似乎也进展得很好。
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()
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()