2011-11-04 41 views
2

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

类似:

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

回答

1

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

+0

即使您没有直接建议我如何实施解决方案,您是对的,但您指出了正确的方向:避免调用datadeck方法负责创建wx.App。查看我的问题以获取更新。谢谢! – dgraziotin

+0

@Mike Driscoll,Mike,如果不能完成,那么我的代码在做什么?对不起,我错过了这里的一些东西。 – joaquin

+0

@joaquin - 我问罗宾邓恩评论你的答案,以解释为什么这不是一个好主意,因为我不知道如何自己回答你。我希望他的评论澄清这个问题。 –

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() 

如果按 '呼叫应用' 按钮,你会得到新框架打开。而且你可以随意打开。
创建的应用程序/框架是相互独立的。您可以关闭其中的任何一个而不会影响其他人。系统不会冻结。

+0

+1因为这个例子你几乎正确。但我会接受其他答案,因为a)wxPython社区似乎同意这一点b)我设法让它在没有在datadeck中创建一个新的wxApp的情况下工作,仅仅是从另一个wxApp – dgraziotin

+0

调用的情况几乎是正确的?您问过如何从另一个wxApp调用wxApp,并向您展示了如何执行该操作。另一个答案说不能做到......而你投另一个。真的很好奇...... – joaquin

+0

嗯,你的例子有用,我不得不承认它。但这对我来说不起作用。也许是因为datadeck不是一个简单的应用程序,我试图通过调用datadeck来增强应用程序。我不知道。没有什么是个人的,因为这种奇怪的情况,我给了你一个+1。避免有两个wx的想法。Mike Driscoll在同一个过程中给我的答案。无论如何,非常感谢您的示例! – dgraziotin