tkinterプログラムにインタラクティブなPythonインタプリタを埋め込む必要があります。それをどのように統合するかについて誰かが助けてくれますか?idlelib.PyShellを使用してインタプリタをtkinterプログラムに埋め込む方法は?
私はすでにmain()
の機能を見てきましたが、私のニーズに合わせて複雑にする方法ですが、それを壊すことなく減らすことはできません。
tkinterプログラムにインタラクティブなPythonインタプリタを埋め込む必要があります。それをどのように統合するかについて誰かが助けてくれますか?idlelib.PyShellを使用してインタプリタをtkinterプログラムに埋め込む方法は?
私はすでにmain()
の機能を見てきましたが、私のニーズに合わせて複雑にする方法ですが、それを壊すことなく減らすことはできません。
あなたがしなければならないことのいくつかの詳細は、実行したIDLEのシェルで何をしたいのかによって異なる場合があります。私はそれについてもっと知りたいです。しかし、簡単に始めて、他のコードで動作させるために必要なpyshell.mainの最小限の変更を加えましょう。
私が下記で使用する3.6では、PyShell.py
はpyshell.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を呼び出すことができます。
他にもtkinterプログラムにコンソールを追加することについての質問がありましたが、特にIDLEのシェルの使用を提案して尋ねる人はいません。 –
@TerryJanReedy私はコンソールを好むだろうが、私は以前の質問から答えを受け取っていない。あなたが[ここ](http://stackoverflow.com/questions/38933855/cmd-in-tkinter-frame)の質問を見ることができるなら、私の状況をさらに説明します。しかし、答えをありがとう、それは良い一時的な解決策を作ります。 –
あなたが役に立ったら嬉しいです。私はそれを書いた後でしか気付かなかったが、私は確信している。 –