2017-11-25 180 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 _()' –