python curses addstr error - но только на моем компьютере - PullRequest
2 голосов
/ 21 марта 2011

Я писал небольшую программу, которая берет список и генерирует из него меню в проклятиях (прямо, стандартная библиотека или что-то еще, батареи включали в себя проклятия Python), когда я заметил странную проблему (если хотите,комментируемая копия всей программы находится ниже).Проще говоря, при принятии результатов сгенерированного списка os.listdir curses вылетает с addstr ERR, НО, если я передаю ему жестко закодированный список, он работает нормально.Это, конечно, не имеет никакого смысла, верно?Список - это список, это список, а список под любым другим именем все равно должен быть списком, верно?

Чтобы сделать вещи еще более сложными, я отправил код своему другу, который работает в основном в python2.6 (мой изначально был написан для работы в python3.1).Он раскомментировал вызов broken_input() (который передает программе генерируемую os.listdir информацию) и сказал, что он работал нормально для него.У меня установлены и Python 2.6, и 3.1, поэтому я изменил свой shebang, чтобы программа работала в 2.6, и (с broken_input() без комментариев) для меня она все еще выдает addstr ERR (пока что)отлично работает с жестко закодированным вводом ... что, кстати, кстати, совершенно бесполезно, кроме доказательства концепции).

Таким образом, мой вопрос таков: что-то не работает в моей установке на python (я использую Ubuntu lucid с установленными python2.6.5 и 3.1), и, если да, то как мне это исправить, чтобы яможно получить проклятия, чтобы правильно выполнить этот код.И, если это не моя установка на python, как я могу получить ту же функциональность из проклятий (то есть: нарисовать меню из списка, содержащего произвольное количество элементов, пронумеровав их так, чтобы пользователь мог сделать выбор на основе номера элемента).

#!/usr/bin/env python3.1
"""curses_mp3eater.py: a curses-based implementation of my mp3eater program;
diplays the contents of cwd, allows user to make a selection. But I'm having
problems getting it to iterate over a list.
v0.1 03.14.11
by skookie sprite
address@gmail.com
"""

import curses, curses.wrapper, os, sys


def working_input():
    """the following is demo code to demonstrate my problem... main will accept the following,
    but won't accept the product of a directorylist for reasons that I can't figure out."""
    dircontents=['this','is','a','list','','and','it','will','iterate','fine','in','the','(main) function.']
    return dircontents

def broken_input():
    """this is the code that I NEED to have work... but for reasons beyond me will not iterate in
    the main function. It's a simple list of the contents of the CWD."""
    cwd=os.getcwd()
    dircontents=[]
    for item in os.listdir(cwd):
        dircontents += [item]
    return dircontents

def main(stdscr):
    """This is the program. Designed to take a list of stuff and display it. If I can solve
    that hurdle, I'll add selection mechanisms, and break it across screens - amongst other
    things. But, currently, it can only accept the demo code. Uncomment one or the other to
    see what I mean."""
    #broken_input returns an addstr() ERR, but I don't see the difference between working_input
    #and broken_input as they are both just lists. 
    #working_input() is demo code that illustrates my problem
    stuffin=working_input()
    #stuffin=broken_input()

    #the rest of this stuff works. The problem is with the input. Why?
    linenumber=int()
    linenumber=6
    itemnumber=int()
    itemnumber=1

    stdscr.clear()
    stdscr.border(0)

    for item in stuffin:
        stdscr.addstr(linenumber, 10, '%s   -   %s' % (itemnumber, item), curses.A_NORMAL)
        linenumber += 1
        itemnumber += 1

    curses.doupdate()
    stdscr.getch()



if __name__ == '__main__':
    curses.wrapper(main)

Ответы [ 3 ]

5 голосов
/ 21 марта 2011

Вы слишком много набиваете на экране и, таким образом, передаете номер строки за пределами диапазона addstr. Если вы создадите пустой каталог для запуска программы (или увеличите окно терминала), она будет работать.

Чтобы исправить это, проверьте количество строк в окне перед циклом вывода в main.

0 голосов
/ 06 октября 2017

Проблема объясняется на странице руководства addch:

addch, waddch, mvaddch и mvwaddch подпрограммы помещают символ ch в заданное окно в его текущей позиции окна, которая затем продвигается.Они аналогичны putchar (3) в stdio (3).Если аванс находится на правом поле:

  • Курсор автоматически переносится на начало следующей строки.

  • В нижней частитекущая область прокрутки, и если включена scrollok, область прокрутки прокручивается на одну строку вверх.

  • Если scrollok не включено, запись символа в правом нижнем поле выполняется успешно.Однако возвращается ошибка, поскольку невозможно перенести на новую строку

Данная программа также не улавливает ошибку из нижнего правого поля (вероятно, следует сказать «угол») и не вызывать scrollok, чтобы позволить данным прокручиваться вверх.В последнем случае вы потеряете информацию, которая прокручивается вверх, в то время как обработка исключения позволит вам запросить отображение данных на экране, а затем выйти или отобразить больше данных.

0 голосов
/ 06 октября 2017

используйте screen.scrollok(1) после addstr, чтобы текст прокручивался.

...