2013-06-05 1 views
3

Я пытаюсь изменить размер окна терминала при запуске скрипта python, чтобы убедиться, что отображение будет статическим. Он работает, но не совсем так, как я ожидал. Я пробовал несколько методов:Хотите изменить размеры окон терминала в python, работая, но не совсем правильно

import sys 
sys.stdout.write("\x1b[8;40;120t") 

и

import subprocess 
subprocess.call(["echo","-e","\x1b[8;40;120t"]) 

и даже просто

print "\x1b[8;40;80t" 

Они все работы и изменить размеры реального терминала. Однако, если мой терминал, скажем, 25x80, чтобы начать, сценарий начинается, он изменяет размер, а затем выходит. Он не выполнит оставшуюся часть скрипта. Я завернул его в try/Except и ничего не было выброшено. Ничто в syslogs и python -v script.py не показывает ничего странного. Если я снова выполнил сценарий или с размером члена 40x120 (мой размер цели), скрипт будет работать нормально. Почему exeecuting выход ANSI выходит из python? Кроме того, если я запускаю это интерактивно, он работает без проблем. Использование Python 2.6.6.

+0

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

+0

спасибо !, извините, первый раз размещение. – Ian

ответ

0

Я попытался запустить следующий сценарий, и он "работает" (Linux Debian/Python 2.6/гном-терминал):

print "\x1b[8;40;80t" 

print "ok" 

окно изменяет размер и выполнение скрипта продолжается.


Если вы подтвердите в вашем случае программа останавливается после того, как изменение размера, мой догадка бы Python получил сигнал SIGWINCH при изменении размеров окна.

Вам следует попробовать add a specific signal handler. Что-то в этом роде:

def resizeHandler(signum, frame): 
    print "resize-window signal caught" 

signal.signal(signal.SIGWINCH, resizeHandler) 
+0

Кажется, это работает, я не уверен, почему :), но я буду читать обработчики сигналов. Спасибо! – Ian

+0

Итак, теперь, когда я «перегружаю» SIGWINCH, чтобы сделать очень мало, когда я начинаю создавать экран проклятий, он не может получить новые cols/rows (которые, как я полагаю, пойманы при изменении размера с помощью SIGWINCH). Я выстрелил себе в ногу. Могу ли я восстановить обработчик SIGWINCH по умолчанию перед вызовом curses? – Ian

+0

@Ian: Чтобы получить обработчик сигнала _current_, вы можете использовать [signal.getsignal (signal.SIGWINCH)] (http://docs.python.org/2/library/signal.html#signal.getsignal). С другой стороны, когда вы _change_ обработчик сигнала с [signal.signal (signalnum, handler)] (http://docs.python.org/2/library/signal.html#signal.signal) обработчик сигнала _previous_ –

0

Для этого вам необходимо установить терминал в режиме cbreak. Использование термина package (easy_install term) может выглядеть примерно так:

from term import opentty, cbreakmode 

with opentty() as tty: 
    if tty is not None: 
     with cbreakmode(tty, min=0): 
      tty.write('\033[8;26;81t'); 

print 'terminal resized' 
+0

Будет ли вызов curses.cbreak() делать то же самое? – Ian

 Смежные вопросы

  • Нет связанных вопросов^_^