Pycharm控制台:show()不起作用



我正在使用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的一些细节:OS:Debian JessiePython:Python 3.4PYQT:PYQT4Pycharm 2017.1.4

我不是专家,但是您的代码对我不起作用,它只是快速闪烁窗口。我在Windows 10,Python 3.6和Pyqt5上。但是,如果我以后使用app.exec_()启动事件循环,它确实会留下来。

编辑:我想我了解了手头的问题。首先,交互式解释器(例如Windows上的空闲和本机控制台)与Pycharm文件编辑器之间存在区别,该编辑器运行您在控制台中制作的脚本。

在空闲中,您可以在没有事件循环的情况下显示和使用代码,这是其起作用的确切特定原因,但似乎也有一个事件循环(至少是某种形式),因为一切正如人们所期望的那样。与Pycharm相比,这是一个很大的区别!

在Pycharm中,您只编辑一个Python文件,您可以在控制台中运行。这意味着,唯一可以运行的是该文件中的内容,然后退出。当它退出时,一切都是垃圾收集和关闭的,并且不在等待您的输入。(因为除非您使用诸如input()之类的东西,否则代码不会等待任何东西,并且会终止。)这就是为什么您通常使用事件循环的原因,必须使用GUI应用程序来代码等待用户完成,然后在用户完成后停止。(例如,关闭GUI。)最大的要点是,运行Python文件时,您不能编写更多代码,并且当您到达结束时,它将始终结束。因此,一旦您的窗口show(),它就会在执行代码并退出时将其关闭。因此,所有完成的事情都必须在开始事件循环之前完成,然后在执行其他操作之前关闭,除非您使用GUI中的按钮触发某些内容,或者并行运行一个为您修复内容的线程。

要将其与matplotlib进行比较,您会遇到同样的问题。在Matplotlib中,代码等待用户关闭图形窗口,然后再继续进行下一个代码。除非您做类似show(block=False)的事情,否则将图形催生在另一个线程或类似的内容中,以绕过这一点。(据我所知,尽管您可以在另一个线程中运行其他代码,但是GUI需要在主台上运行其他代码,但由于显然会发生其他情况,因此GUI显然会发生。我不确定这一点,因为Pyqt带有其自己的QThread,但我不知道这是GUI的局限性。)

这是一个很长的答案,这是有道理的,请问,我会尝试澄清。

最新更新