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都是假的,所以是单独的进程。很高兴我能帮助您。我认为,由于它对您有所帮助,如果您按下标记为“此答案有用(再次单击以撤消)”的“^”按钮,这将是公平的。您还应该将您的答案标记为已接受答案,以便在主页上以不同的颜色显示问题。如果你不愿意,人们会来这里阅读,认为你仍然需要帮助(那将是浪费时间,因为你已经有了答案)。