2017-11-25 183 views
0

我使用pycharm作为python开发的IDE,我注意到了集成的python控制台令人讨厌的问题。我使用PyQt作为一些GUI编程的支柱,当我制作一个窗口时,虽然我使用show()函数,但它并没有显示在屏幕上。下面是一个例子代码:Pycharm控制台: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环境中相同的代码窗口中显示()命令后立即显示出来。

我要补充一点,我有同样的问题在同一个控制台matplotlib的数字和下面的代码帮助:

plt.show(block=False) 

这是Pycharm控制台或方法的普遍问题它启动了Python控制台?并可以有人请推荐一个解决方案?

这里是我的操作系统和IDE的一些细节: OS:Debian的杰西 的Python:Python的3.4 PyQt的:PyQt4的 Pycharm 2017年1月4日

回答

0

我不是专家,但你的代码不能用于工作我只是快速地闪过窗户。我在Windows 10,python 3.6和pyqt5上。但是,如果我之后使用app.exec_()启动事件循环,它会保持不变。

编辑:我想我理解手头的问题。首先,交互式解释器(如Windows上的IDLE和本地控制台)和Pycharm文件编辑器(运行在控制台中创建的脚本)之间存在差异。

在IDLE中,您可以在没有事件循环的情况下显示和使用代码,它的工作原理的确切具体原因有点超出我的意思,但似乎还有一个事件循环(至少是某种类型),因为一切都按照人们的期望工作。与PyCharm相比,这是一个很大的区别!

在PyCharm中,您只编辑一个python文件,您可以在控制台中运行该文件。这意味着,唯一能够运行的是该文件中的内容,然后退出。当它退出时,所有东西都会被垃圾收集并关闭,而不是等待您的输入。 (因为除非你使用类似input()这样的代码,代码不会等待任何东西,并且它将会结束。)这就是为什么你通常使用事件循环,必须等待用户完成使用GUI应用程序的代码,然后在用户完成时停止。 (例如,关闭GUI。)最重要的是,当你运行一个python文件时,你不能编写更多的代码,并且当你到达最后时它会一直结束。所以,只要你的窗口,它将被关闭,因为代码完成并退出。因此,在启动事件循环之前必须完成所有事情,然后在做其他事情之前关闭它,除非在GUI中使用按钮触发某些事情,或者并行运行一个线程来修复某些内容。

为了与matplotlib进行比较,您遇到了同样的问题。在matplotlib中,代码等待用户在继续下一段代码之前关闭图形窗口。除非你做了像show(block=False)这样的东西,它会在另一个线程或其他类似的东西中产生图形,这就绕开了这一点。 (据我所知,PyQt不支持在一个线程中,尽管你可以在另一个线程中运行其他代码段,但GUI需要在主线程上,因为显然有些时髦事情会发生。我不完全确定这一点,因为PyQt自带了QThread,但是我不知道它在GUI上的局限性。)

这是一个很长的答案,它是有道理的,问我我会尽力澄清。

+0

你是否直接在python中尝试它?对我来说,它可以在本地python中正常工作,但不在PyCharm控制台中。 –

+0

测试了python文件和PyCharm。我不知道如何根据操作系统的差异来填写它,但是您是否尝试添加事件循环?否则,您不能与GUI进行交互,除非您将其作为自己运行的进程抛出。 – Thomasedv

+0

使用事件循环可能意味着以下命令: 'app.exec _()' –