4

我是 wxPython 的新手。从一个简单的教程(http://wiki.wxpython.org/wxPython%20by%20Example)开始,似乎Spyder和wxPython之间存在冲突。我可以运行以下脚本一次(在 IPython 控制台中),使用:

runfile(r'C:\Python27\Scripts\test\test.py')

其中包含:

import wx

class Frame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, title=title, size=(350,200))

app = wx.App(redirect=True)
top = Frame("Hello World")
top.Show()
app.MainLoop()

但是我第二次运行它,我得到了以下错误:

Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 493, in runfile
execfile(filename, namespace)
  File "C:\Python27\Scripts\test\test.py", line 14, in <module>
top = Frame("Hello World")
  File "C:\Python27\Scripts\test\test.py", line 11, in __init__
wx.Frame.__init__(self, None, title=title, size=(350,200))
  File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 505, in __init__
_windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
PyNoAppError: The wx.App object must be created first!

它不太明白,但显然它与 spyder 是使用 wxPython 编写的并且与 app.MainLoop() 冲突有关

有人可以确认和/或解释更多吗?

非常感谢,

帕特里克

4

2 回答 2

4

我怀疑这是因为您试图在交互式解释器会话中运行该示例。该示例实际上是一个带有事件循环的 GUI 应用程序,当您在同一个交互式会话中重复执行它时,它不会表现良好,因为从上次运行中清除前一个应用程序不会完全发生。就像您所经历的那样,它会运行一次,但随后的尝试会失败。这样的示例绝对应该在其自己的专用解释器中运行,该解释器可以在 GUI 关闭时完全退出。

在 Spyder 中,您可以将脚本配置为在专用的独立解释器中运行,而无需在单独的外部控制台中手动运行。在 Spyder 编辑器中打开文件,按 F6 打开“运行设置”对话框,然后选择“在新的专用 Python 解释器中执行”单选按钮。现在点击运行。使用 F5 进行的后续运行将记住此配置设置,并且您将在每次重复执行时让您的示例在它自己的解释器中运行。

于 2013-05-03T15:24:33.097 回答
2

我猜这与使用 IDLE 运行 wxPython 应用程序时可能遇到的问题相同,IDLE 是 Python 附带的基于 tkinter 的 Python IDE。基本上你最终有两个主循环,虽然它有时会工作,但有时它们会发生冲突,你会得到像这样的奇怪错误。我认为当您运行两个 wx.Apps 时,您处于“未定义”领域,这是一件“坏事”。只需从 IPython 本身、命令行或其他不会有两个 wx 事件循环的方式运行您的应用程序。

于 2012-06-26T16:22:47.427 回答