wxPython:从另一个wxApp调用wxApp

2024-10-16 17:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

比如:

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

在哪里数据包.main.run()是wxApp的经典开始:

^{pr2}$

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

更新:根据@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重定向的对象(不是这个问题的一部分,我省略了细节),一切都很好。在


Tags: 方法runimportselfeventmainondef
2条回答

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

这是完全可行的。为什么不管用 这个例子非常有效:

在主.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()

在数据包.py在

^{pr2}$

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

相关问题 更多 >