2017-08-25 35 views
0

私はMacOSs Sierraでpython2.7.10を使用していて、自分のraspberrypiとのssh接続を介してrsyncを作成しました。アイデアは、自分のローカルフォルダと、自分のリモートフォルダをraspberrypi上で同期させることです。Tkinterウィジェットでターミナルステータスを表示

私の関数syncroFolder()はうまくいきますが、私のtkinterウィンドウにリアルタイムステータスを表示するにはどうしたらいいですか?簡単な解決策はありますか?私は投稿の質問を理解することはできません。

def syncroFolder(): 
    os.system("rsync -avz -e \"ssh -p port\" /source/path /folder/to/rcync ") 

はあなたの助け


2017年9月5日をありがとう「のTkinterのGUIにコマンドラインの結果をリダイレクトする」: 私が書くために管理しました「| Tシャツは、」私のコマンドは、現在

os.system("rsync -avzr -P --info=progress2 -e \"ssh -p %s\" %s %s | tee %s & " %(port,dossier,destination,exampleOutputTxtAdd)) 

次のようになり、私はファイル

の最後の行を表示Tkinterではテキストボックスを作成していると、ファイル内の結果
status, lastLineInFile = commands.getstatusoutput("tail -n 1 "+ exampleOutputTxtAdd) 
T.insert(END,'Transfering: \n'+lastLineInFile) 

出力ファイルは次のようになります。

sending incremental file list 
folder/ 

      0 0% 0.00kB/s 0:00:00 (xfr#0, to-chk=397/410) 
folder/Bigfile.avi 

    32,768 0% 0.00kB/s 0:00:00 
    2,555,904 0% 2.39MB/s 0:07:18 
    3,112,960 0% 1.41MB/s 0:12:23 
    3,637,248 0% 1.11MB/s 0:15:44 

が、テキストボックスには、私はの-n = 1行を読んでいても、すべてのそれらのライン

Transfering 

     3,776 0% 0.00kB/s 0:00:00 

16,567,040 1% 13.69MB/s 0:01:15 

を示し、行を追加し続けます出力ファイル。

私は--out-format = \ "%t%o%f%b \"を使用しようとしていましたが、転送後(大ファイルの場合)私は多くのオプションを試してみましたが、私にとってはうまくいきませんでした...なぜ出力ファイルの最後の行だけが表示されないのかわかりません。 ご意見はありますか?

+0

タイムラインのテキストボックスに1行ずつデータを書き込むことができます。それは十分に簡単なはずです。 –

+0

しかし、プログラムがrsyncコマンドを実行すると、結果が端末に表示され、同期が完了するまでプログラム(Tkinterウィンドウ)がフリーズします。私はスレッドを読むのはTkinterの良い考えではありません。私の場合、timedループは以前の場合にのみ動作します(しかしrsyncを実行しません)。とにかく、とにかく、おかげで、 –

+0

/あなたはファイルにデータを同期させ、そのファイルを読み込み専用モードで読み込み、それを使ってtkinterテキストボックスを現在のデータで更新した状態に保ちます。これにより、発生している問題を防ぐことができます。 syncコマンドを分離する必要がある場合は、tkinterでマルチプロセッシングを調べる必要があります。 –

答えて

0

ここにpython3を使用した例があります(これは私のものです)。要点は、スレッドを使用してパイプを行単位でキューに読み込んだ後に、そのキューを読み取るためにafterイベントを使用するという参考例の場合と同じです。サブプロセスが停止した後は、毎回キューからすべてのアイテムを読み込み、後のイベントシーケンスを停止するように拡張されています。 python3 tkinter_rsync.py rsync://servername/sharenameなどを使用してテストしてください。

import sys 
import tkinter as tk 
import tkinter.ttk as ttk 
from subprocess import Popen, PIPE 
from threading import Thread 
from queue import Queue, Empty 

def read_pipe(widget, queue): 
    interval = 1 
    try: 
     line = queue.get_nowait() 
    except Empty: 
     interval = 5 
     pass 
    else: 
     widget.insert('end', line) 
    widget.after(interval, lambda: read_pipe(widget, queue)) 

def queue_line(pipe, queue): 
    for line in iter(pipe.readline, b''): 
     queue.put(line) 
    pipe.close() 

def main(argv): 
    root = tk.Tk() 
    text = tk.Text(root) 
    vs = ttk.Scrollbar(root, orient='vertical', command=text.yview) 
    text.configure(yscrollcommand=vs.set) 
    text.grid(row=0, column=0, sticky='news') 
    vs.grid(row=0, column=1, sticky='ns') 
    root.grid_rowconfigure(0, weight=1) 
    root.grid_columnconfigure(0, weight=1) 

    process = Popen(['rsync', '--list-only', argv[1]], stdout=PIPE) 
    queue = Queue() 
    tid = Thread(target=queue_line, args=(process.stdout, queue)) 
    tid.daemon = True 
    tid.start() 

    root.after(0, lambda: read_pipe(text, queue)) 
    root.mainloop() 

if __name__ == '__main__': 
    main(sys.argv) 
関連する問題