2017-11-25 12 views
0

pythonをPython開発のIDEとして使用しています。統合されたpythonコンソールで迷惑な問題に気付きました。いくつかのGUIプログラミングのために私はPyQtをバックボーンとして使用しています。私は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のコンソールを起動する方法の一般的な問題です?誰かが解決策をお勧めしますか?ここで

は私のOSとIDEに関するいくつかの詳細は以下のとおりです。 OS:Debianのジェシー のPython:Pythonの3.4 PyQtは:PyQt4 Pycharm 2017年1月4日

答えて

0

私は専門家ではないんだけど、あなたのコードは動作しません私はただ窓をすばやく点滅させます。私は窓10、Python 3.6とpyqt5だけど。しかし、後でapp.exec_()でイベントループを開始すると、それは残ります。

編集:私は手元の問題を理解していると思います。まず、ウィンドウ上のIDLEとネイティブコンソールのようなインタラクティブなインタプリタと、コンソールで作成したスクリプトを実行するPycharmファイルエディタの違いがあります。

IDLEでは、イベントループなしでコードを表示して使用することができますが、それがなぜ機能するのかについての具体的な理由は少しわかりますが、イベントループがアクティブになっているようですすべてが期待通りに機能します。それはPyCharmに比べて大きな違いです!

PyCharmでは、コンソールで実行できるPythonファイルのみを編集しています。つまり、実行されるのはそのファイル内にあるものだけで、それが終了するということです。それが終了すると、すべてがガベージコレクトされ、閉じられ、あなたの入力を待っていません。 (input()のようなコードを使用しない限り、コードは何も待たずに終了します)。そのため、通常はイベントループを使用して、ユーザーがGUIアプリケーションの使用を終了するまで待つ必要がありますユーザーが終了したら停止します。 (例えばGUIを閉じます)。大切なことは、Pythonファイルを実行するときにコードを書くことができず、最後に終わるといつでも終了するということです。だからすぐにshow()あなたのウィンドウは、コードが完了して終了すると閉じられます。イベントループを開始する前に実行しなければならないことがあります。たとえば、GUIのボタンで何かを起動しない限り、何か他のことをする前に閉じておく必要があります。

これをmatplotlibと比較すると、同じ問題が発生します。 matplotlibでは、コードが次のコードに進む前にグラフウィンドウを閉じるようにユーザーが待機します。 show(block=False)のようなことをしない限り、別のスレッドやそれを迂回するような種類のグラフにグラフが生成されます。 (そして、私が知る限り、PyQtはスレッド内にあることをサポートしていませんが、別のスレッドで他のコードを実行することはできますが、GUIは主なものにする必要があります。私はPyQtには独自のQThreadが付属しているので、私は完全には分かりませんが、GUIに関しては限界がないことはわかりません)。

これは長い答えです。明確にしようとします。

+0

Pythonで直接試しましたか?ネイティブのPythonではうまく動作しますが、PyCharmのコンソールではうまく動作しません。 –

+0

PythonファイルとPyCharmの両方をテストしました。私はOSの違いまでそれをチョークするのに十分ではありませんが、イベントループを追加しようとしましたか?それ以外の方法でGUIと対話することはできません。あなた自身が実行するプロセスとしてそれを投げないかぎりです。 – Thomasedv

+0

イベントループでは、おそらく次のコマンドを意味します: 'app.exec _()' –

関連する問題