2013-09-02 3 views
0

Я искал час и не могу найти окончательного ответа на этот вопрос.wxpython GUI работает в командной строке

Я пытаюсь написать приложение GUI wxPython, в котором есть кнопка, запускающая инструмент командной строки (все в Windows). Инструмент занимает около 5 минут для запуска и производит выход по мере его продвижения.

Я хотел бы, чтобы графический интерфейс имел какое-то текстовое окно, показывающее выход, как это происходит. Я также хотел бы убить графический интерфейс, чтобы завершить процесс командной строки.

Я просмотрел темы и Popen, и, похоже, не могу найти правильную связь между ними, чтобы сделать эту работу. Может ли кто-нибудь указать мне на разумный пример?

+1

here're [ 'Tkinter'] (https://gist.github.com/zed/42324397516310c86288#file-kill-process-py) и [' Gtk'] (HTTPS: // суть. github.com/zed/8a255e81eb87431c0e63#file-show-subprocess-output-thread-py). – jfs

ответ

1

Я написал статью, в которой я делал что-то в строках, о которых вы говорите. Мне нужно было запустить ping и traceroute и захватить их вывод в режиме реального времени. Вот статья: http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/

В основном вам нужно перенаправить стандартный вывод в текстовый элемент управления, а затем сделать что-то вроде этого:

proc = subprocess.Popen("ping %s" % ip, shell=True, 
          stdout=subprocess.PIPE) 
line = proc.stdout.readline() 
print line.strip() 

Как вы можете видеть, я использую подпроцесс, чтобы начать пинг и прочитать его стандартный вывод. Затем я использую команду strip(), чтобы удалить лишние пробелы с начала и конца строки до того, как я ее распечатаю. Когда вы выполняете печать, она перенаправляется на текстовый элемент управления.

1

Я делаю эту точную вещь в wxPython в своем приложении GooeyPi. Он запускает команду pyInstaller и фиксирует вывод строки за строкой в ​​textctrl.

В главном окне приложения, есть кнопка, которая вызывает OnSubmit:

def OnSubmit(self, e): 
    ... 
    # this is just a list of what to run on the command line, something like [python, pyinstaller.py, myscript.py, --someflag, --someother flag] 
    flags = util.getflags(self.fbb.GetValue()) 
    for line in self.CallInstaller(flags): # generator function that yields a line 
     self.txtresults.AppendText(line) # which is output to the txtresults widget here 

и CallInstaller делают фактическую ход команды, получая линию, а также проточной wx.Yield(), чтобы экран Безразлично Слишком сильно замерзнуть. Вы могли бы переместить это в свою нить, но я не беспокоился.

def CallInstaller(self, flags): 
     # simple subprocess.Popen call, outputs both stdout and stderr to pipe 
     p = subprocess.Popen(flags, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
     while(True): 
      retcode = p.poll() # waits for a return code, until we get one.. 
      line = p.stdout.readline() # we get any output 
      wx.Yield() # we give the GUI a chance to breathe 
      yield line # and we yield a line 
      if(retcode is not None): # if we get a retcode, the loop ends, hooray! 
       yield ("Pyinstaller returned return code: {}".format(retcode)) 
       break 
Смежные вопросы