我是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!
它并不真正理解,但显然它与使用wxPython编写spyder并与app.MainLoop()冲突的事实相关
有人可以确认和/或解释一下吗?
非常感谢,
帕特里克
答案 0 :(得分:4)
我怀疑是因为您试图在交互式解释器会话中运行该示例。该示例实际上是一个带有事件循环的GUI应用程序,并且当您在同一个交互式会话中重复执行它时,它不会表现良好,因为从上次运行中清除以前的应用程序将不会完全发生。就像你经历过的那样,它会运行一次,但随后的尝试都会失败。这样的例子肯定应该在它自己的专用解释器中运行,该解释器可以在GUI关闭时完全退出。
在Spyder中,您可以将脚本配置为在专用的独立解释器中运行,而无需在单独的外部控制台中手动运行。在Spyder编辑器中打开文件,按F6打开“运行设置”对话框,然后选择“在新的专用Python解释器中执行”单选按钮。现在点击Run。通过使用F5进行的后续运行将记住此配置设置,并且您将在每次重复执行时让您的示例在其自己的解释器中运行。
答案 1 :(得分:2)
我猜你使用IDLE(Python附带的基于tkinter的Python IDE)运行wxPython应用程序时会遇到同样的问题。基本上你最终有两个主循环,虽然它有时会工作,但有时它们会发生冲突,你会得到像这样的奇怪错误。我想当你运行两个wx.Apps时,你处于“未定义”的状态,这是一个“坏”的事情。只需从IPython本身,命令行或其他不会有两个wx事件循环的方式运行您的应用程序。