0

現在のディレクトリにPythonファイルのリストを作成し、それぞれのボタンを生成するTkpythonプログラムがあります。ボタンをクリックすると、対応するPythonプログラムが新しいgnome-terminalのサブプロセスを介して起動されます。新しい端末でのサブプロセスの実行が終了したら、ボタンの色を赤に切り替えたいのですが。残念ながら、ボタンの色はすぐに変わります。

from Tkinter import *
import os, subprocess

root = Tk()
buttonsD = {}

def launch(ourfile):
    p=subprocess.Popen(["gnome-terminal","-e","python " + ourfile], shell=False)
    buttonsD[ourfile].configure(bg='red')

dirlist=os.listdir(os.getcwd())
for fname in dirlist:
    if fname.endswith('py') and fname != 'gui2.py':
        buttonsD[fname] = Button(root,text=fname,command=lambda i=fname: launch(i))
        buttonsD[fname].pack(side=TOP,expand=YES,fill=BOTH)

root.mainloop()

ほとんどすぐに、p.poll == Noneの間待つことができ、gnome-terminalが作成されるまで少し時間がかかることがわかります。ただし、新しいターミナルでプロセスがまだ実行されている場合でも、ターミナルが作成されるとすぐにボタンが赤になります。新しいgnome-terminalを作成してから、実行したいプロセスを通信することもできません。gnome-terminalはbashの新しいインスタンスを作成し、doneを返すだけのようです。そのため、stdinと通信しようとすると、パイプエラーが発生します。

4

2 に答える 2

1

親のプロセスグループから切り離すために、gnome端末は二重のフォークを行っていると思います-実際にあなたのサブプロセスはほとんどすぐに終了し、あなたが直接持っていないさらなる子孫ですべてが起こっていますへのアクセス。

残念ながら、gnome 端末がこのダブル フォーク動作を無効にする方法を提供しているとは思えません。したがって、「さらなる子孫」がいつ終了するかを調べるには、そのプロセスを特定し、定期的に監視する必要があります。それと直接対話することも非常に難しい注文です - あなたが関連していない「ランダムな」プロセスと対話するよりも簡単ではありません:-(.

于 2009-12-12T17:20:51.917 に答える
1

ここで 2 つの質問があります。gnome-terminal で Python プログラムを起動するために使用するコマンド ラインとsubprocess、Tkinter アプリでの使用方法です。私が知っているのは後者だけです。

subprocess.Popenボタンがすぐに赤くなるのはそのためです。おそらく、実行中のプログラムのリストを作成する必要があると思います。次に、実行中のプロセスごとpoll_processesに呼び出す関数を作成し、結果が でない場合、リストから削除してボタンを赤にします。poll()None

次に、Tkinter がその関数を定期的に呼び出すように調整するだけで済みます。これを行うには、 を呼び出してframe.after(msec, poll_processes)最初の呼び出しをスケジュールし、同じことを行って次の呼び出しをスケジュールします。poll_processespoll_processes

于 2009-12-12T17:08:24.163 に答える