我使用pycharm作为python开发的IDE,我注意到集成的python控制台有一个烦人的问题。我使用PyQt作为一些GUI编程的主干,当我创建一个窗口时,尽管我使用了show()函数,但它并没有显示在屏幕上。这是一个示例代码:
import sys
from PyQt4 import QtGui
from threading import Thread
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
w.setGeometry(100, 100, 200, 50)
w.show()
当然,如果我在本机python环境中运行相同的代码,则窗口会在show()命令之后显示。
我应该补充一点,我在同一个控制台中的matplotlib数字存在同样的问题,以下代码有帮助:
plt.show(block=False)
这是Pycharm控制台的一般问题还是它启动python控制台的方式?有人可以推荐一个解决方案吗?
以下是我的操作系统和IDE的一些细节: 操作系统:Debian jessie Python:Python 3.4 PyQt:PyQt4 Pycharm 2017.1.4
答案 0 :(得分:0)
我不是专家,但你的代码对我不起作用,它只是快速闪烁。我在Windows 10,python 3.6和pyqt5上。但是,如果我之后使用app.exec_()
启动事件循环,它确实会保留。
编辑:我想我理解手头的问题。首先,交互式解释器(如Windows上的IDLE和本机控制台)和Pycharm文件编辑器之间存在差异,后者运行您在控制台中创建的脚本。
在IDLE中你可以在没有事件循环的情况下显示和使用代码,它的确切具体原因,有点超出我的意思,但似乎有一个事件循环也在那里活动(至少某种类型),因为一切按照人们的预期工作。与PyCharm相比,这是一个很大的不同!
在PyCharm中,您只编辑一个python文件,您可以在控制台中运行该文件。这意味着,唯一运行的是该文件中的什么,然后退出。当它退出时,一切都被垃圾收集和关闭,而不是等待你的输入。 (因为除非你使用类似input()
之类的东西,否则代码不会等待任何东西,它会一直到最后。)这就是为什么你通常使用事件循环,必须代码等待用户完成使用GUI应用程序,然后在用户完成时停止。 (例如,关闭GUI。)最重要的是,当你运行python文件时,你不能编写更多代码,并且当你到达目的地时它总是会结束。所以只要你show()
你的窗口,它就会在代码完成后关闭并退出。所以完成的任何事情都必须在开始事件循环之前完成,然后在做其他事情之前关闭它,除非你在GUI中用按钮触发某些东西,或者并行运行一个线程来修复你的东西。
要与matplotlib进行比较,您会遇到同样的问题。在matplotlib中,代码等待用户在继续下一段代码之前关闭图形窗口。除非您执行show(block=False)
之类的操作,否则会在另一个线程或类似的东西中生成图形,从而绕过这一点。 (据我所知,PyQt不支持在一个线程中,虽然你可以在另一个线程中运行其他代码片段,但GUI需要在主要代码上,因为有一些时髦的事情显然会发生。我不完全确定这个,因为PyQt带有它自己的QThread,但我不知道它在GUI方面的局限性。)
这是一个很长的答案,这是有道理的,请问,我会尽力澄清。