2017-04-27 21 views
0

내가 다른 시스템 또한한 시스템에서 다른 시스템으로 로그 파일을 복사하기 위해 파이썬과 glade를 사용하여 progressbar를 만드는 방법은 무엇입니까?

#!/bin/bash s="/var/log" 
d="/root/Directory" BACKUPFILE=scripts.backup.`date +%F`.tar.gz 
scp -r [email protected]$1:$s $2 rsync -chavzP --stats [email protected] 


filename=ug-$(date +%-Y%-m%-d)-$(date +%-T).tgz 
tar -czvf $2/$BACKUPFILE $s 
tar --create --gzip --file=$d$filename $s 
rm -rf /root/aaa/log 

한 시스템에서 로그 파일을 복사하는이 bash는 스크립트를 사용하고 나는이

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, GObject 

class ProgressBarWindow(Gtk.Window): 

    def __init__(self): 
     Gtk.Window.__init__(self, title="ProgressBar Demo") 
     self.set_border_width(10) 

     vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) 
     self.add(vbox) 

     self.progressbar = Gtk.ProgressBar() 
     vbox.pack_start(self.progressbar, True, True, 0) 

     button = Gtk.CheckButton("Show text") 
     button.connect("toggled", self.on_show_text_toggled) 
     vbox.pack_start(button, True, True, 0) 

     button = Gtk.CheckButton("Activity mode") 
     button.connect("toggled", self.on_activity_mode_toggled) 
     vbox.pack_start(button, True, True, 0) 

     button = Gtk.CheckButton("Right to Left") 
     button.connect("toggled", self.on_right_to_left_toggled) 
     vbox.pack_start(button, True, True, 0) 

     self.timeout_id = GObject.timeout_add(50, self.on_timeout, None) 
     self.activity_mode = False 

    def on_show_text_toggled(self, button): 
     show_text = button.get_active() 
     if show_text: 
      text = "some text" 
     else: 
      text = None 
     self.progressbar.set_text(text) 
     self.progressbar.set_show_text(show_text) 

    def on_activity_mode_toggled(self, button): 
     self.activity_mode = button.get_active() 
     if self.activity_mode: 
      self.progressbar.pulse() 
     else: 
      self.progressbar.set_fraction(0.0) 

    def on_right_to_left_toggled(self, button): 
     value = button.get_active() 
     self.progressbar.set_inverted(value) 

    def on_timeout(self, user_data): 
     """ 
     Update value on the progress bar 
     """ 
     if self.activity_mode: 
      self.progressbar.pulse() 
     else: 
      new_value = self.progressbar.get_fraction() + 0.01 

      if new_value > 1: 
       new_value = 0 

      self.progressbar.set_fraction(new_value) 

     # As this is a timeout function, return True so that it 
     # continues to get called 
     return True 

win = ProgressBarWindow() win.connect("delete-event", Gtk.main_quit) 
win.show_all() Gtk.main() 

같이 진행 막대 코드를했을하지만 삽입하는 방법을 모르는 내 이 진도 바코드가있는 스크립트.

+0

나는 이걸 @ 호세 폰테 –

답변

1

이 문제에 대한 접근법이 있지만 GUI와 시간이 오래 걸리는 작업 (긴 작업)은 좋은 친구가 아니어야한다는 것이 가장 중요합니다. 대부분의 GUI 프레임 워크는 mainloop을 사용하여 사용자 입력 처리를 처리하고 UI를 그립니다. 이것은 말하자면 주 UI에서 긴 작업을 분리해야하며 스레드, 비동기 메서드 등이 될 수있는 몇 가지 방법이 있습니다.이 모든 문제는 선택한 언어로 이러한 문제를 처리하는 방식으로 재개됩니다.

그런 다음 추적하려는 OS 기능을 호출하는 방법에 대한 질문이 있습니다. 코드를 프로그래밍 방식으로 구현하는 것이 가장 좋은 방법 일 수 있지만 시간이 많이 소요됩니다. 따라서 셸 스크립트를 사용하는 것이 좋으며 이렇게하면 명령의 출력을 얻는 방법에 대한 질문이 생깁니다. 음, popen이 있고 이후에 파이썬을 사용할 것이므로 popen 호출로 쉘 스크립트를 생성해야합니다. 가장 좋은 방법은 하위 프로세스 인 것 같습니다. 추가 개선 사항은 명령 결과 (성공 또는 실패) 및 조건부/형식화 된 출력에 대한 이전 분석을 얻을 수있는 더 나은 bash 스크립트입니다.

내가 어디로 갈지 알 수 있습니다. 일반적으로 콘솔에있는 데이터를 구문 분석하고 그에 따라 해석하고 그에 따라 UI를 업데이트해야합니다. 우리가 스레드를 사용, 위의 예에서

import time 
import threading 
import subprocess 
import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import GLib, Gtk, GObject 


def app_main(): 
    win = Gtk.Window(default_height=50, default_width=300) 
    win.connect("delete-event", Gtk.main_quit) 
    win.connect("destroy", Gtk.main_quit) 

    progress = Gtk.ProgressBar(show_text=True) 
    win.add(progress) 

    def update_progress(i): 
     progress.pulse() 
     #progress.set_fraction (i/100.0) # use this for percentage 
     #progress.set_text(str(i)) 
     return False 

    def example_target(): 
     i = 0 # can be used to pass percentage 
     proc = subprocess.Popen(['tree', '/'],stdout=subprocess.PIPE) 
     while True: 
      line = proc.stdout.readline() 
      if line != '': 
       time.sleep(0.1) # output is too quick, slow down a little :) 
       GLib.idle_add(update_progress, i) 
      else: 
       break 

    win.show_all() 

    thread = threading.Thread(target=example_target) 
    thread.daemon = True 
    thread.start() 


if __name__ == "__main__": 
    app_main() 
    Gtk.main() 

:

난 당신에게 쉘 명령 출력 (tree /)의 모든 라인 펄스 도착 진행률 표시 줄과의 GTK 윈도우의 간단한 예제를 제공합니다. 콘솔에서 시도 할 수있는 쉘 명령은 디스크의 폴더 구조 트리를 덤프합니다. 무엇이든 될 수 있지만 목표는 긴 작업을하는 것이 었습니다. 진행 상황을 추적 할 수 없기 때문에 바는 활동 모드에 있으며 모든 행에 대해 바코드를 보내지 만 진행 상황을 추적 할 수 있으면 대신 set_fraction 메소드를 사용할 수 있습니다.

희망이 있으면 올바른 방향으로 인도 할 수 있습니다. GL

+0

일만 해냈습니다. 코드가 작동하지만 여전히 내 코드를 병합 할 수있는 방법은 없습니까? @JoseFonte –

+0

Popen 전화에 있습니다. 여기에서 José는 "tree /"명령을 예로 사용했습니다. 실제로 – liberforce

+0

입니다. 활동 모드로 시작하여 보류중인 작업을 표시하고 다음 단계로 이동하여 출력을 구문 분석하고 실제 진행 상황을 나타낼 수 있습니다. 스크립트는 인수를 사용하기 때문에 파이썬에 전달해야합니다 ([check this] (http://stackoverflow.com/questions/4033723/how-do-i-access-command-line-arguments-in-python)). 그런 다음 쉘 스크립트에서이 인수를 사용하십시오 ([check this] (https://docs.python.org/3.5/library/subprocess.html)). –