2017-03-23 22 views
0

別のスクリプトの出力をTkinterウィンドウにルーティングしようとしています。os.pipe()からTkinterテキストボックスに直接読み込む

以下は私の問題の解決方法です。 Tkinterボックスは表示されますが、ここで抽象化されたコントローラがos.write(pipeout、msg)を使用してpipeoutに書き込むと更新されません。

from Tkinter import * 
from controller import controller 
import os 


def run(): 
"""Top level run method which initiates program.""" 

    def updateInput(): 
     """Update the textbox with controller output.""" 
     readFrom = os.fdopen(pipein) 
     line = readFrom.readline() 
     text.insert(END, line) 
     text.after(1000, updateInput) 


    pipein, pipeout = os.pipe() #pipe for comms between tkinter and controller 
    pid = os.fork() 
    if not pid: 
     #within child process, launch controller with passed pipe 
     os.close(pipein) 
     mainController = controller(pipeout) 
    os.close(pipeout) 
    root = Tk() 
    text = Text(root) 
    text.pack() 
    text.after(1000, updateInput) #update text box each second 
    root.mainloop() 

if __name__ == "__main__": 
    run() 

抽象化コントローラは、self.pipeoutは、コントローラクラスINITself.pipeout = pipeoutから割り当てられた

os.write(self.pipeout, msg) 

を介してパイプに書き込んでいます。

+0

'updateInput'を実行するとどうなりますか?それはクラッシュしますか?それは間違ったことを読んでいますか? OKを読みますが、テキストを挿入できませんか?問題はどこから始まるのですか?実際に何かを書いているようには見えません。 –

+0

パイプからの読み取りがないようです。私はos.write(self.pipeout、msg)ステートメントを使用して、もう一方の端でself.pipeoutが割り当てられたself.pipeout = pipeoutのパイプに書き込んでいます。私は質問を更新します。 @BryanOakley – wirrell

+0

「読み込みがありません」という意味は何ですか?期待通りに 'updateInput'が呼び出されていますか?あなたはそれが呼び出されていると言っていますが、何とか 'read'の呼び出しをスキップしていますか? –

答えて

0

あなたはフラッシュするのを忘れてしまったようです。

self.pipeout.write(msg) 
self.pipeout.flush() 

また、msgが改行で終わることを確認してください。

編集:パイプが必要ですか?おそらく、あなたが行っていることを、スレッド化のようにするためのきれいな方法があります。

+0

スレッドを調べます。 – wirrell

0

os.fdopen(pipein)の代わりにos.read(pipein, 100)の代わりにupdateInputを使用して解決が行われました。

line = os.read(pipein, 100) 
text.insert(END, line) 
text.after(1000, updateInput) 
関連する問題