当我从IDLE运行GASP时,为什么GASP无法正常工作?

时间:2014-07-21 20:27:28

标签: python shell python-idle gasp

我制作了这个剧本:

from gasp import *
begin_graphics()

Circle((200, 200), 60)
Line((100, 400), (580, 200))
Box((400, 350), 120, 100)

update_when('key_pressed')
end_graphics()

当我从终端启动时,它完美运行。当我从IDLE运行它时,它没有工作,我没有回答(shell提示符(>>>)消失但没有任何反应)。

1 个答案:

答案 0 :(得分:2)

通常,您无法在IDLE中的嵌入式Python解释器中运行GUI应用程序,除非您使用的库旨在与IDLE集成。或者更糟糕的是,它可能在一台机器上运行而在另一台机器上运行。我将在下面解释原因,但首先要坚信。

据我所知,gasp的文档并没有解决这个问题,但类似的图书馆要么警告你,他们可能无法在IDLE(easygui,早期工作版本graphics等)或附带有关如何在IDLE中使用它们的特殊说明(例如,graphics的更高版本)。

现在,也许gasp应该设计为与IDLE集成,因为它是专为新手设计的,而且许多新手将使用Python内置的IDE。或者可能不是。但是,即使这应该是真的,这也是gasp要处理的事情。提交错误或功能请求,但您需要一些方法继续工作,直到有人开始编写代码。

这里最简单的解决方案是使用一个不同的IDE,一个在完全独立的过程中运行其交互式Python解释器的IDE,与在终端中自己运行它时完全相同。有很多很好的选择,至少是免费的(啤酒中)用于非商业用途(PyCharm,Komodo,Eclipse PyDev,emacs与您最喜欢的包装集合等)。尽管Stack Overflow不适合为您挑选最好的建议(如果谷歌搜索不够,请尝试在邮件列表或论坛上查询),几乎任何一个都可以使用。

另一种选择:您可能希望考虑在IDE旁边运行增强的解释器环境(如ipython-gtk或带有较小软件包的emacs),而不是使用IDE内置的解释器。当然,他们不再紧密集成("我"在" IDE"),但根据我的经验,即使在整个团队使用PyCharm的环境中工作, PyDev,我仍然最终在ipython中进行了大部分的交互式测试;你可能会发现你也喜欢这样。或者你可能没有,但试试看。


那么,为什么首先出现问题?

首先,如果您不了解"事件循环"或" runloop"或" mainloop"是的,请阅读Why your GUI app freezesthe Wikipedia page或其他一些想法的介绍。

通常,当您运行交互式Python解释器时(例如,通过在终端中的bash或C:提示符下键入python),它将在其自己的进程中运行。所以,它可以启动一个runloop并且永远不会返回(直到你退出),并且终端不会阻止你。

但是当你在IDLE中运行交互式Python解释器时,它实际上在与IDLE相同的进程中运行,IDLE有自己的runloop。如果你启动了一个runloop并且永远不会返回,那么IDLE的runloop就无法运行。这意味着它无法响应来自操作系统的事件,例如"刷新窗口"或者"准备一个新的窗口打开",所以从用户(你)的角度来看,IDLE和你的应用都被冻结了。

解决这个问题的一种方法是在你的代码中为你的runloop生成另一个线程,而不是接管主线程。 (这不适用于所有GUI库,但它适用于某些。这就是graphics解决问题的方法。)另一种方法是生成一个全新的子进程来运行GUI。 (这适用于所有GUI库,但它需要做更多工作 - 现在你必须处理进程间通信。其中一个新手友好的matplotlib包装器可以做到这一点。)最后,你可以集成你的runloop与IDLE的Tkinter runloop一起驱动另一个。 (并非所有GUI库都可以通过这种方式驱动,但是Tkinter可以,并且IDLE可以通过monkeypatched以这种方式工作; graphics曾经这样做。)但这些都不是很简单。而且他们可能是gasp本身应该做的事情,而不是你的代码。