Расширение прямоугольника Curses Box до края терминала в Python - PullRequest
0 голосов
/ 14 октября 2018

У меня возникли проблемы с созданием прямоугольника в Curses с использованием Python.

Это мой код:

import curses
from curses.textpad import Textbox, rectangle

def draw_menu(stdscr):

    stdscr.clear()
    stdscr.refresh()

    while True:
        stdscr.refresh()


        writebox_uly = (int(stdscr.getbegyx()[0]))
        writebox_ulx = (int(stdscr.getbegyx()[1]))
        writebox_lry = (int(stdscr.getmaxyx()[0] * 0.7))
        writebox_lrx = (int(stdscr.getmaxyx()[1] - 1))

        rectangle(stdscr, writebox_uly, writebox_ulx, writebox_lry, writebox_lrx)

        editwin_uly = (int(stdscr.getmaxyx()[0] * 0.7 + 1))
        editwin_ulx = (int(stdscr.getbegyx()[1]))
        editwin_lry = (int(stdscr.getmaxyx()[0] - 1))
        editwin_lrx = (int(stdscr.getmaxyx()[1] - 2))

        rectangle(stdscr, editwin_uly, editwin_ulx, editwin_lry, editwin_lrx)

def main():
    curses.wrapper(draw_menu)

if __name__ == "__main__":
    main()

Это создает два хороших прямоугольника, как на картинке ниже: Two rectangles

Вы можете заметить, что нижний правый угол нижнего поля не встроен.Это связано с тем, что editwin_lrx = (int(stdscr.getmaxyx()[1] - 2))

Эта строка задает нижнюю правую координату X (нижний правый угол), равную максимальной ширине терминала, минус 2

Изменение этого значения на editwin_lrx = (int(stdscr.getmaxyx()[1] - 5))Ящик будет намного дальше влево.

Two more rectangles

, поэтому, теоретически, изменение его на editwin_lrx = (int(stdscr.getmaxyx()[1] - 1)) будет толкать его немного дальше вправо.

Но это не сбои.

Traceback (most recent call last):
  File "temp.py", line 32, in <module>
    main()
  File "temp.py", line 29, in main
    curses.wrapper(draw_menu)
  File "/usr/lib/python3.6/curses/__init__.py", line 94, in wrapper
    return func(stdscr, *args, **kwds)
  File "temp.py", line 26, in draw_menu
    rectangle(stdscr, editwin_uly, editwin_ulx, editwin_lry, editwin_lrx)
  File "/usr/lib/python3.6/curses/textpad.py", line 16, in rectangle
    win.addch(lry, lrx, curses.ACS_LRCORNER)
_curses.error: addch() returned ERR

Можно ли продлить правую сторону второго ящика до самого края, выровняв его с первым ящиком?

1 Ответ

0 голосов
/ 15 октября 2018

Вы должны поймать исключение и игнорировать его.Функция rectangle выглядит следующим образом:

def rectangle(win, uly, ulx, lry, lrx):                                         
    """Draw a rectangle with corners at the provided upper-left                 
    and lower-right coordinates.                                                
    """                                                                         
    win.vline(uly+1, ulx, curses.ACS_VLINE, lry - uly - 1)                      
    win.hline(uly, ulx+1, curses.ACS_HLINE, lrx - ulx - 1)                      
    win.hline(lry, ulx+1, curses.ACS_HLINE, lrx - ulx - 1)                      
    win.vline(uly+1, lrx, curses.ACS_VLINE, lry - uly - 1)                      
    win.addch(uly, ulx, curses.ACS_ULCORNER)                                    
    win.addch(uly, lrx, curses.ACS_URCORNER)                                    
    win.addch(lry, lrx, curses.ACS_LRCORNER)                                    
    win.addch(lry, ulx, curses.ACS_LLCORNER)

Как указано в справочной странице , curses возвращает ошибку (которая rectangle должен был игнорироваться) при записи в нижний правый угол экрана:

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

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

...