Часть I

Я изучаю различные варианты пользовательских интерфейсов на основе терминалов, и моей первой мыслью было пойти в «Youtube University» и посмотреть, что они предлагают для меня. Я хочу что-то, что может работать на любой платформе и быть максимально гибким. Я слышал о Npyscreen и Unicurses, если у вас есть другие предложения, пожалуйста, оставьте их в комментариях. Предметом этой статьи будут Unicurses.

Несмотря на то, что я использую Python в течение многих лет, я только недавно прыгнул в глубокий конец. Так обнажайся со мной. Я использую Mac с Sierra OS и Python 2.7.12, загруженный с Anaconda

Перво-наперво я ДОЛЖЕН был получить доступ к руду. Программа, для которой я делаю пользовательский интерфейс, представляет собой сетевой сниффер, и ввод sudo для всего становится раздражающим. Кроме того, с root-доступом я могу запускать код из своей IDE Pycharm.

В Sierra, чтобы получить root-доступ, вы должны войти в «Утилиту каталогов», щелкнуть замок в нижней части окна, затем щелкнуть меню «Редактировать» и выбрать «Включить пользователя root». Вы можете создать пароль, но, поскольку я единственный пользователь, я этого не делал.

Я скачал Unicurses с SourceForge: здесь. Затем я разархивировал файл и переместил его в свой домашний каталог. На этом этапе я открыл терминал и сменил каталог на папку Unicurses. После ввода cd я просто перетащил файл в терминал, потому что… ленив. Вот как выглядела команда:

cd /Users/DragonQueen/UniCurses-1.2

На этом этапе я установил Unicurses с помощью файла setup.py .:

установка python setup.py

Престо! Unicurses установлен! В терминале введите «cd» и только «cd», чтобы изменить каталог обратно на каталог по умолчанию.

На что следует обратить внимание: документы для Unicurses будут находиться в распакованной папке под тем именем… как вы уже догадались…. документы

Теперь мы можем писать код.

Unicurses, как и curses и ncurses, должны быть инициализированы определенным образом. вы должны установить стандартный экран, равный начальному экрану (который является функцией).

from unicurses import *
def Main():
    stdscr = initscr()

Чтобы окно, которое вы только что создали, стало закрытым, вы должны поместить в конец функцию endwin ().

from unicurses import *
def Main():
    stdscr = initscr()
    endwin()

Когда я запускаю этот код, ничего не происходит. Это значит, что все в порядке. Некоторые люди получают пустой экран, что также означает, что все в порядке. Пока вы не получаете ошибок, все в порядке!

Теперь давайте посмотрим, что мы можем сделать с только что созданным окном.

Первое, что я хочу изучить, - это получить символ или функцию getch (). Вы можете использовать это, чтобы получить персонажа от пользователя. По умолчанию, после того, как пользователь вводит символ, окно закрывается, но, если вы сохраните его в переменной и используете строку добавления или функцию addstr (), оно распечатает любой символ, введенный пользователем.

from unicurses import *
def Main():
    stdscr = initscr()
    a = getch()
    addstr(str(a))
    getch()
    endwin()
    return 0




if __name__ == '__main__':
    Main()

Примечание: он распечатает код ASCII для письма. Вы можете использовать функцию chr (), чтобы получить символ (который может не быть буквой).

В моих целях я бы использовал функцию addstr () для распечатки вывода. Это может быть сложно, потому что функция initscr () не поддерживает прокрутку. так что я должен это понять. А пока давайте посмотрим, как перемещаться по начальному экрану.

Unicurses действительно использует систему координат для определения местоположения, но это немного не так. Координаты - это y, x, а не x, y, как мы это обычно видим. Мы можем использовать функцию getmaxyx (), чтобы получить размеры любого экрана, который мы используем. Прямо сейчас у нас есть только один экран (хотя мы можем добавить больше слоев позже), и этот экран является sdscr или стандартным экраном, который является нашим initscr или начальным экраном. Чтобы получить размеры стандартного экрана, мы используем:

stdscr = initscr()
addstr(getmaxyx(stdscr))

который возвращает координаты (55, 171). Итак, у меня на экране 55 строк и 171 столбец. Вы можете управлять этими числами, используя move () и другие функции для организации используемых вами экранов.

Теперь я хочу посмотреть на атрибуты. Начнем с attron () или, attribute on и attroff () или, attribute off. Эти функции принимают определенные атрибуты, такие как A_BOLD или A_COLOR. Вы помещаете функции addstr () или addch (), с которыми должен работать атрибут, между функциями включения и выключения, например:

attron(A_BOLD)
addstr(pysharkSniffer.out_string)
attroff(A_BOLD)

Вы также можете указать атрибут в качестве второго аргумента функций addstr () и addch () следующим образом:

addstr(pysharkSniffer.out_string, A_BOLD)

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

Я пробовал использовать атрибуты цвета на странице 9, и они не работали * рыдал *. Я был так взволнован тем, что сделал это для радуги, я собирался окунуть свои данные и…. это не работает. Я подумал, может быть, это Mac, а может что-то не так с моим терминалом. Проведя небольшое исследование, я обнаружил, что вы должны инициализировать цвет после инициализации экрана.

def Main():
    stdscr = initscr()
    start_color()

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

from unicurses import *
from Eavesdrop import pysharkSniffer
def Main():
    stdscr = initscr()
    start_color()
    running = True
    while (running):
       addstr(pysharkSniffer.out_string)

       key = getch();
       if (key == ord(' ')):
           running = False

    endwin()
    return 0




if __name__ == '__main__':
    Main()

До того, как я инициализировал цвет, мой результат был:

После того, как я инициализировал цвет, мой результат был:

Больше я ничего не изменил. Видимо мне нужно установить цветовую комбинацию для переднего плана и фона. Я делаю это с помощью init_pair (), который принимает 3 аргумента, номер идентификатора, цвет переднего плана и цвет фона; в этой последовательности. Вы используете номер идентификатора в качестве аргумента функции color_pair (), как и любой из встроенных атрибутов, таких как A_BOLD.

from unicurses import *
from Eavesdrop import pysharkSniffer
def Main():
    stdscr = initscr()
    start_color()
    init_pair(1,COLOR_BLUE,COLOR_BLACK)
    running = True
    while (running):
       addstr(pysharkSniffer.out_string,color_pair(1))
       key = getch();
       if (key == ord(' ')):
           running = False

    endwin()
    return 0




if __name__ == '__main__':
    Main()

Этот код производит:

Вы можете объединить другие атрибуты со знаком +, чтобы еще больше настроить вывод. Например, это:

addstr(pysharkSniffer.out_string, color_pair(1) + A_BOLD)

выводит это:

Список цветов находится после списка атрибутов. Примечание: если вы измените аргумент фона в функции init_pair () на -1 и добавите функцию use_default_colors () перед инициализацией вашей init_pair (), она просто будет использовать ваш собственный цвет фона из вашего терминала.

from unicurses import *
from Eavesdrop import pysharkSniffer
def Main ():
stdscr = initscr ()
start_color ()
use_default_colors ()
init_pair (1, COLOR_BLUE, -1)

running = True
во время (выполняется):
addstr (pysharkSniffer.out_string, color_pair (1) + A_BOLD)
key = getch ();
if (key == ord ('')):
running = False

endwin ()
return 0




if __name__ == '__ main__':
Main ()

Теперь мы можем работать с окнами. Существует функция newwin (), которая позволяет вам создать новое окно на стандартном экране. Он принимает четыре аргумента: длину измерения y, длину измерения x, координату y верхней левой точки, координату x левой верхней точки.

Чтобы проиллюстрировать это, мы можем использовать две другие функции, чтобы точно определить, где находится верхний левый угол. Это функции waddstr () и wgetch ():

from unicurses import *

def Main():
    stdscr = initscr()
    start_color()
    use_default_colors()
    window = newwin(15, 15, 10, 15)
    waddstr(window, "Hello World")
    init_pair(1,COLOR_CYAN,-1)
    running = True
    while (running):
   
       key = wgetch(window);
       keypad(stdscr,True)
       if (key == ord(' ')):
           running = False
           break

    endwin()
    return 0




if __name__ == '__main__':
    Main()

который выводит:

Примечание: если вы не поместите достаточно места для размеров, он либо обернет ваши данные, либо обрежет их.

Это немного разочаровывает, но я обманул сниффер, и мне нужно изменить технологии и начать с самого начала. После того, как я это выясню, я создам Часть II. Я полагаю, что должен пойти дальше и опубликовать это, чтобы помочь другим, кому это может понадобиться. Если у вас есть предложения по этому типу приложений, напишите мне или оставьте комментарий ниже.