我制作了这个剧本:
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提示符(>>>)消失但没有任何反应)。
答案 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 freezes或the 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
本身应该做的事情,而不是你的代码。