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

wxPython在导入子包时启动我的应用程序两次,python,import,wxpython,Python,Import,Wxpython,我对口头上的描述感到抱歉 我在名为applicationwindow.py的文件中有一个wxPython应用程序,它位于名为garlicsimwx的包中。当我通过启动上述文件来启动应用程序时,一切都很好。但是,我在一个文件夹中创建了一个文件rundemo.py,其中包含运行应用程序的garlicsimwx包。当我使用rundemo.py时,当主wx.Frame导入garlicsimwx的子包时,应用程序启动,即simulations.life,出于某种原因,我的应用程序创建了一个新实例(即弹出一

我对口头上的描述感到抱歉

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

我已经尝试过一个接一个地遍历命令,虽然错误只在导入子包之后发生,但是
import
语句并没有直接导致它。只有当控件返回到
PyApp.MainLoop
时,第二个窗口才会打开


如何停止此操作?

我认为您的一个模块中的代码如下所示:

import wx

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

frame = MyFrame(...)
此框架将在首次导入此模块时创建。要防止出现这种情况,请使用常见的Python习惯用法:

import wx

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

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

我猜对了吗?

我认为您的一个模块中有如下代码:

import wx

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

frame = MyFrame(...)
此框架将在首次导入此模块时创建。要防止出现这种情况,请使用常见的Python习惯用法:

import wx

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

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

我猜对了吗?

您可以创建一个全局布尔变量,如
g\u window\u was\u draw
并在创建窗口的函数中检查它。该值在程序开始时为false,在首次创建窗口时变为True。创建窗口的函数将检查绘制的
g\u窗口是否已为真,如果为真,则会引发异常。然后你会有一个很好的stacktrace告诉你谁负责执行这个函数


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

您可以创建一个全局布尔变量,如
g\u window\u was\u draw
,并在创建窗口的函数中检查它。该值在程序开始时为false,在首次创建窗口时变为True。创建窗口的函数将检查绘制的
g\u窗口是否已为真,如果为真,则会引发异常。然后你会有一个很好的stacktrace告诉你谁负责执行这个函数

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

明白了:没有

if __name__=='__main__':
在我的
rundemo
文件中。这实际上是一个
多处理问题:新窗口是在一个单独的进程中打开的。

明白了:没有

if __name__=='__main__':

在我的
rundemo
文件中。这实际上是一个
多处理问题
问题:新窗口是在一个单独的进程中打开的;我有
if\uuuuuu name\uuuuu==''\uuuuu main\uuuuu'
位,它调用我的
main()
函数。事实上,即使我注释掉这两行,并从
rundemo.py
@cool RR调用
main()
,也会发生此错误:您可能有if name==“main”,但您也有一些在导入时发生的函数调用。你必须仔细检查你的脚本,确保它完全是def和class,而不是其他任何东西。@Frank:对不起,Python不是在第一次导入模块时才执行它吗?这是一个公平的猜测,Frank,但不是;我有
if\uuuuuu name\uuuuu==''\uuuuu main\uuuuu'
位,它调用我的
main()
函数。事实上,即使我注释掉这两行,并从
rundemo.py
@cool RR调用
main()
,也会发生此错误:您可能有if name==“main”,但您也有一些在导入时发生的函数调用。你必须仔细检查你的脚本,确保它完全是def和class,而不是别的。@Frank:对不起,Python不是在第一次导入模块时才执行它吗?没有帮助-原来这是一个单独的过程。但是缺少stacktrace给了你答案,不是吗?在这两次执行中,g_window_was_draw都是假的,所以是单独的进程。很高兴我能帮助您。我认为,由于它对您有所帮助,如果您按下标记为“此答案有用(再次单击以撤消)”的“^”按钮,这将是公平的。您还应该将您的答案标记为已接受答案,以便在主页上以不同的颜色显示问题。如果你不愿意,人们会来这里阅读它,认为你仍然需要帮助(这将是浪费时间,因为你已经有了答案)。没有帮助-原来这是一个单独的过程。但是缺少stacktrace给了你答案,不是吗?在这两次执行中,g_window_was_draw都是假的,所以是单独的进程。很高兴我能帮助您。我认为,由于它对您有所帮助,如果您按下标记为“此答案有用(再次单击以撤消)”的“^”按钮,这将是公平的。您还应该将您的答案标记为已接受答案,以便在主页上以不同的颜色显示问题。如果你不愿意,人们会来这里阅读,认为你仍然需要帮助(那将是浪费时间,因为你已经有了答案)。