Ползунок для пользовательского интерфейса на основе проклятий - PullRequest
6 голосов
/ 24 ноября 2011

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

После просмотра документации по urwid я все равно не вижу возможности создать простой слайдер (он мне нужен для создания слайдера громкости), который можно настроить с помощью мыши.

Я что-то упустил в urwid или есть более удобный модуль curses для создания такого слайдера?

1 Ответ

1 голос
/ 25 ноября 2011

Curses имеет очень низкий уровень API - возвращаясь к программированию C 1980-х годов.

Оболочки Python имеют некоторую поддержку более высокого уровня для ввода с клавиатуры и некоторые другие тонкости, но их немного, и они не очень хорошо документированы.

Тонкости Python не включают поддержку мыши (хорошо, вы возвращаете свое состояние мыши в кортеж вместо того, чтобы создавать для этого структуру C, так что это несколько лучше).

Идея в том, что нужно включить окно проклятий включите "клавиатуру", чтобы Python выдавал вам полные коды клавиш включить «маску мыши», чтобы события мыши отправлялись в ваше приложение Определите специальный код клавиатуры «mouse_key» в функции getch так что вы можете вызвать getmouse, чтобы получить координаты и состояние кнопки.

Таким образом, нет готовых хороших обратных вызовов, вы должны настроить основной цикл вашего приложение для обнаружения событий мыши самостоятельно.

Этот пример кода выполняет описанные выше шаги для чтения событий мыши и вывода состояния мыши на экран - этого должно быть достаточно, чтобы начать строить полезную обработку мыши с помощью curses:

# -*- coding: utf-8 -*-
import curses

screen = curses.initscr()
curses.noecho()
curses.mousemask(curses.ALL_MOUSE_EVENTS)

screen.keypad(1)

char = ""

try:
    while True:
        char = screen.getch()

        screen.addstr( str(char) + " ")
        if char == curses.KEY_MOUSE:
            screen.addstr (" |" + str(curses.getmouse()) + "| ")

finally:
    screen.keypad(0)
    curses.endwin()

    curses.echo()
...