2016-08-16 7 views
2

tkinterプログラムにインタラクティブなPythonインタプリタを埋め込む必要があります。それをどのように統合するかについて誰かが助けてくれますか?idlelib.PyShellを使用してインタプリタをtkinterプログラムに埋め込む方法は?

私はすでにmain()の機能を見てきましたが、私のニーズに合わせて複雑にする方法ですが、それを壊すことなく減らすことはできません。

+0

他にもtkinterプログラムにコンソールを追加することについての質問がありましたが、特にIDLEのシェルの使用を提案して尋ねる人はいません。 –

+0

@TerryJanReedy私はコンソールを好むだろうが、私は以前の質問から答えを受け取っていない。あなたが[ここ](http://stackoverflow.com/questions/38933855/cmd-in-tkinter-frame)の質問を見ることができるなら、私の状況をさらに説明します。しかし、答えをありがとう、それは良い一時的な解決策を作ります。 –

+0

あなたが役に立ったら嬉しいです。私はそれを書いた後でしか気付かなかったが、私は確信している。 –

答えて

1

あなたがしなければならないことのいくつかの詳細は、実行したIDLEのシェルで何をしたいのかによって異なる場合があります。私はそれについてもっと知りたいです。しかし、簡単に始めて、他のコードで動作させるために必要なpyshell.mainの最小限の変更を加えましょう。

私が下記で使用する3.6では、PyShell.pypyshell.pyと改名されています。ここにあるすべてのものはIDLEの私的な内部構造を使用することになり、「あなた自身の責任で使用する」ことに注意してください。

シェルをtkinterコードと同じプロセス(およびスレッド)で実行するとします。

if use_subprocess and not testing: 
     NoDefaultRoot() 

ガード:現在3.6では

if not tkroot: 
    root = Tk(className="Idle") 
    root.withdraw() 
else: 
    root = tkroot 

def main(tkroot=None): 

変更ルートの作成(# setup rootを見つける。)に署名を変更し、if not tkroot下にインデントするカップルより多くの行がありますメインループと破壊(最後に)

if not tkroot: 
    while flist.inversedict: # keep IDLE running while files are open. 
     root.mainloop() 
    root.destroy() 
# else leave mainloop and destroy to caller of main 

上記は、ルートウィンドウの 'dependency injection'を関数に追加したものです。私は3.6でそれを追加してテスト(他のコードの例)を簡単にするかもしれません。

次のtkinterプログラムが実行され、ルートウィンドウとIDLEシェルの両方が表示されるようになりました。

from tkinter import * 
from idlelib import pyshell 

root = Tk() 
Label(root, text='Root id is '+str(id(root))).pack() 
root.update() 
def later(): 
    pyshell.main(tkroot=root) 
    Label(root, text='Use_subprocess = '+str(pyshell.use_subprocess)).pack() 

root.after(0, later) 
root.mainloop() 

いつでもpyshell.mainを呼び出すことができます。

関連する問題