导入子包时,wxPython会启动我的应用程序两次

时间:2009-05-17 15:45:08

标签: python import wxpython

我很抱歉口头描述。

我在名为applicationwindow.py的文件中有一个wxPython应用程序,该文件位于名为garlicsimwx的程序包中。当我通过启动上述文件启动应用程序时,一切正常。但是,我在包含rundemo.py包的文件夹中创建了一个文件garlicsimwx,该包也运行该应用程序。当我使用rundemo.py时,应用会启动,当主wx.Frame导入garlicsimwx的子包,即simulations.life时,出于某种原因我的新实例应用程序已创建(即弹出一个新的相同窗口。)

我已经尝试逐个单步执行命令,尽管只在导入子包之后才会发生错误,但import语句并不直接导致它。只有当控件返回PyApp.MainLoop时,才会打开第二个窗口。

如何阻止此事?

3 个答案:

答案 0 :(得分:4)

我认为你的一个模块中的代码看起来像这样:

import wx

class MyFrame(wx.Frame):
    def __init__(...):
       ...

frame = MyFrame(...)

首次导入此模块时将创建框架。为了防止这种情况,请使用常见的Python习语:

import wx

class MyFrame(wx.Frame):
    def __init__(...):
       ...

if __name__ == '__main__':
    frame = MyFrame(...)

我猜对了吗?

答案 1 :(得分:0)

您可以创建一个像g_window_was_drawn这样的全局布尔变量,并在执行创建窗口工作的函数中进行检查。在程序开始时该值为false,并在首次创建窗口时更改为True。创建窗口的函数将检查g_window_was_drawn是否已经为真,如果是,则会抛出异常。那么你将有一个很好的堆栈跟踪告诉你谁负责执行这个功能。

我希望能帮到你找到它。我很抱歉口头解决方案;)

答案 2 :(得分:0)

知道了:没有

if __name__=='__main__':

在我的rundemo文件中。这实际上是一个multiprocessing问题:新窗口是在一个单独的过程中打开的。