UniCurses на Python 3 под windows

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

UniCurses на Python 3 под windows

Сообщение vapekreng » 21 авг 2016, 14:24

Здравствуйте, возникла такая проблема: не могу запустить сабж. Что делал:
1. Скачал и установил UniCurses https://sourceforge.net/projects/pyunicurses/
2. Скачал PDCurses https://github.com/Chiel92/unicurses
3. Скопировал содержимое папки pdc34dllu по следующим путям:
C:\Python3
C:\Python3\Lib\site-packages
C:\Python3\Lib\site-packages\unicurses
C:\Python3\Lib\curses

При запуске скрипта из C:\Python3\Lib\site-packages выдает:

============== RESTART: C:\Python3\Lib\site-packages\Console.py ==============

=============================== RESTART: Shell ===============================
>>>


При запуске из других мест выдает:

============ RESTART: C:/Users/Vapekreng/Desktop/console_blank.py ============
Fatal error: can't find pdcurses.dll for linking, make sure PDCurses v3.4+ is in the same folder as UniCurses if you want to use UniCurses on a win32 platform.

Traceback (most recent call last):
File "C:\Python3\lib\site-packages\unicurses.py", line 43, in <module>
import curses # see if the platform supports curses natively
File "C:\Python3\lib\curses\__init__.py", line 13, in <module>
from _curses import *
ImportError: No module named '_curses'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:/Users/Vapekreng/Desktop/console_blank.py", line 1, in <module>
import unicurses
File "C:\Python3\lib\site-packages\unicurses.py", line 54, in <module>
raise ImportError("UniCurses initialization error - pdcurses.dll not found.")
ImportError: UniCurses initialization error - pdcurses.dll not found.

Ну и сам скрипт, который пытаюсь запустить:

import unicurses
stdscr = unicurses.initscr()
stdscr.clear()
unicurses.noecho()
unicurses.cbreak()
stdscr.keypad(True)

print('Hello world!')
print('Привет, мир!')
stdscr.refresh()
stdscr.getkey()
unicurses.getch()

stdscr.keypad(False)
unicurses.nocbreak
unicurses.echo()
unicurses.endwin()

Подскажите: куда скинуть библиотеку, чтобы питон видел её и не приходилось бы работать строго в папке с этой библиотекой. А так же, если можно, напишите скрипт, который выводил бы в консоль Hello world и ожидал нажатия любой клавиши. Заранее всем спасибо

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: UniCurses на Python 3 под windows

Сообщение Cfyz » 21 авг 2016, 21:39

Насколько я вижу, не надо смешивать п. 1 (sf.net/pyunicurses) и п. 2 (Chiel92/unicurses). Оба как минимум работают без установки. В первом случае надо скопировать в папку своего проекта unicurses.py (это он будет импортирован как модуль) а рядом положить .dll с официального сайта PDCurses. Во втором случае репозиторий товарища Chiel92 представляет собой предзаготовленный набор обертки и нескольких библиотек, надо скопировать папку unicurses из репозитория к себе в проект (это она будет импортирована как модуль), .dll оно найдет само в недрах самого себя же.

Наверняка оно работает и если устанавливать в site-packages, но готовых пакетов я не вижу и особого смысла тогда тоже. Вариант 2 (Chiel92, папка unicurses) работает, если вызывать и не из директории проекта.

Edit: только сейчас заметил, что вопрос был чтобы "не приходилось бы работать строго в папке с этой библиотекой". Что же, насколько вижу тогда выбора нет, надо использовать вариант с гитхаба: он тащит .dll с собой и ищет в относительных путях, т. е. у себя же внутри. Если положить эту папку unicurses в PYTHONPATH (точнее, в sys.path, site-packages как раз там), то все найдется. Вариант же с sf.net (он еще и старый, 2010 года) только подгружает .dll по имени, так что без правки кода обертки или телодвижений с PATH работать не из папки проекта оно не будет.

Теперь к примерам. Приведенный код не работает по нескольким причинам. Во-первых, функции в обертке не принадлежат дескриптору окна (или что такое stdscr в curses?), а просто находятся в модуле. Соответственно вместо stdscr.clear() надо писать unicurses.clear(). Во-вторых, print это такая функция в самом Python, так что 'Привет, мир' просто не попадает в unicurses. Надо использовать [mv]addstr или какие там еще функции вывода в curses.

Т. е. минимальный hello, world выглядит примерно так:

Код: Выделить всё

from unicurses import *

stdscr = initscr()
noecho()
cbreak()
mvaddstr(2, 1, 'Hello, world')
refresh()
getch()
endwin()
Правда с выводом кириллицы беда. Вроде есть варианты .dll "The PDCurses with Unicode[/UTF-8] support", но они просто разные козюбрики у меня показывают. В зависимости от консоли/терминала иногда даже китайские.

---

А теперь на правах рекламы. Отставьте *curses в сторону и поддержите отечественного производителя: BearLibTerminal

Код: Выделить всё

pip install bearlibterminal

Код: Выделить всё

from bearlibterminal import terminal as T

T.open()
T.set('input.filter=[keyboard, close]')
T.printf(2, 1, 'Привет, мир')
T.refresh()
T.read()
T.close()
(input.filter нужен ради эффектного закрытия "нажатием любой клавиши", просто по умолчанию в read() валятся и события мыши; наверное более логичным значением по умолчанию было бы приведенное выше)
Пытается раскуклиться

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 22 авг 2016, 07:19

Благодарю за развернутый ответ, узнал несколько полезных вещей ;)
Первоначально писал на FPC, но возникли проблемы с кирилицей и очень напряжно было все динамические объекты ручками через указатели создавать, да и код разросся неимоверно, поэтому решил перейти на что-нибудь поновее. В итоге это оказался питон. Проблему вчера, а вернее уже сегодня, в 3 ночи решил кардинально - поставил Убунту))) Сейчас вот осваиваюсь по-маленьку.
BearLib заинтересовал - там с кирилицей все ок? Просто хочется на русском сделать. А от библиотеки, в принципе, мне нужен вывод определенного символа на заданную позицию на экране определенным цветом. Если она это может, то будем осваивать.
И еще один вопрос: какой IDE выбрать? Учитывая, что это будет мой первый проект на питоне, желательно что-нибудь попроще.

Аватара пользователя
Hatber
Сообщения: 14
Зарегистрирован: 20 июн 2011, 07:24

Re: UniCurses на Python 3 под windows

Сообщение Hatber » 22 авг 2016, 13:38

Говорят продукты JetBrains в качестве IDE отлично заходят. В твоем случае это будет PyCharm. Сам пользуюсь CLion и IntelliJ IDEA для C/C++ и Java от них же. В принципе доволен как слон, так что пробуй в любом случае.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: UniCurses на Python 3 под windows

Сообщение Cfyz » 22 авг 2016, 19:02

vapekreng писал(а):BearLib заинтересовал - там с кирилицей все ок? Просто хочется на русском сделать. А от библиотеки, в принципе, мне нужен вывод определенного символа на заданную позицию на экране определенным цветом.
С кириллицей все хорошо, при использовании python3 достаточно не напутать с кодировкой исходных текстов (а лучше просто все всегда в UTF-8 хранить). С выводом текста и символов предлагаю просто пробежаться по списку функций, там их всего ничего (описание как бы для С, но разница невелика).
vapekreng писал(а):И еще один вопрос: какой IDE выбрать?
Соглашусь с рекомендацией PyCharm, все в этой IDE просто и по делу.

(А вот с CLion пока не задалось, наши древние корпоративные многоэтажные макросы и шаблоны Eclipse перемалывает надежнее. Но это уже совсем другая история.)
Пытается раскуклиться

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 22 авг 2016, 20:09

Ох и тяжко дается переход на новый ЯП...
Подскажите, что я делаю не так?
Скрытый текст: ПОКАЗАТЬ
Изображение
Скрытый текст: ПОКАЗАТЬ
Изображение
Скрытый текст: ПОКАЗАТЬ
Изображение
Последний раз редактировалось vapekreng 22 авг 2016, 20:45, всего редактировалось 2 раза.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: UniCurses на Python 3 под windows

Сообщение Cfyz » 22 авг 2016, 20:30

Прячьте огромные картинки в тег
Скрытый текст: ПОКАЗАТЬ
, у меня телефон чуть не сломался.

Снова все смешалось в кучу =/. На первых двух картинках в дереве файлов виден BearLibTerminal, а код почему-то от uniurses. На третьей картинке библиотека уже та, но ее модуль называется не так. Хотя конечно самая большая проблема в том, что в проект зачем-то разархивирован весь дистрибутив библиотеки BearLibTerminal. Не надо так.

Для использования BearLibTerminal достаточно выполнить в консоли

Код: Выделить всё

pip install bearlibterminal
Это установит библиотеку в site-packages и ее можно будет использовать довольно простым включением

Код: Выделить всё

from bearlibterminal import terminal
И далее вызывать уже функции terminal.open, terminal.put и пр. по списку. Никаких initscr, noecho и mvaddstr в BearLibTerminal нет, у нее свой, более простой набор функций.

Для начала лучше просто установить библиотеку через pip и работать с ней как будто это так и надо, что она есть в системе. Когда дело дойдет до упаковки и распространения приложения-игры, тогда уже можно задуматься о том, где лежат ее файлы. Можно сделать полноценный пакет приложения и прописать библиотеку в его зависимостях. А можно скопировать нужные файлы в проект и распространять в архиве.
Пытается раскуклиться

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 22 авг 2016, 21:20

За картинки извиняюсь-поправил.
Спасибо огромное за терпение! С проблемой разобрался - PIp установил библиотеку для второго питона, а я пользуюсь третьим, поэтому ошибку и выдавало. На втором питоне "Hello world!" заработал. Не подскажете, как эту библиотеку для третьего питона установить?

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 22 авг 2016, 21:25

Curses, кстати, тоже во втором заработали, а в третьем ни то ни другое не работает...

Код: Выделить всё

import curses 
myscreen = curses.initscr() 
myscreen.border(0) 
myscreen.addstr(12, 25, "Hello world!") 
myscreen.refresh() 
myscreen.getch() 
curses.endwin()

Код: Выделить всё

from bearlibterminal import terminal
terminal.open()
terminal.printf(5, 5, "Hello world")
terminal.refresh()

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 22 авг 2016, 21:33

Pip мне выдает:
Requirement already satisfied (use --upgrade to upgrade): bearlibterminal in ./.local/lib/python2.7/site-packages
Беру оттуда путь и пробую добавить:

Код: Выделить всё

import sys
sys.path.append("./.local/lib/python2.7/site-packages")
from bearlibterminal import terminal
terminal.open()
terminal.printf(5, 5, "Hello world!")
terminal.refresh()
Не получается...

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: UniCurses на Python 3 под windows

Сообщение Cfyz » 22 авг 2016, 21:51

vapekreng писал(а):Не подскажете, как эту библиотеку для третьего питона установить?
Хм, вечно забываю про этот момент. Утилита pip у python2 и python3 разная, для третьего питона она называется pip3. Оно может отсутствовать в системе, но убунта подскажет как и какой пакет надо установить.
vapekreng писал(а):Pip мне выдает:
Requirement already satisfied (use --upgrade to upgrade): bearlibterminal in ./.local/lib/python2.7/site-packages
Это оно выдает потому что pip тот же самый, для python2, а для него "зависимость" действительно уже выполнена, раз пакет библиотеки установлен. Слова про флаг --upgrage это напоминание как обновить пакет библиотеки до самой свежей версии, если выйдет новая. Ну а сообщение, где оно лежит это больше дебажная информация на всякий случай.

Вообще, я посоветую не пытаться сразу выполнять какие-либо неочевидные действия, если что-то не заработало с первого раза. Если внезапно становится слишком коряво и сложно -- это хороший повод остановиться и подумать, где-то что-то пошло не так =).

Кстати, трюк с sys.path.append вполне бы сработал, если был бы указан полный путь от самого корня, а не относительный. Но это так, на заметку, так делать не надо.
Пытается раскуклиться

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 22 авг 2016, 22:21

Заработало на третьем! Огромное вам человеческое спасибо! Будем осваивать ваш терминал)))

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 04 сен 2016, 19:47

Извиняюсь, если вопрос покажется глупым, но только начинаю осваиваться в пайтоне, раньше дальше TP не забирался. Возникло несколько вопросов для прояснения того, как все происходит и для более ясного понимания. Вот пример:

Код: Выделить всё

from bearlibterminal import terminal
from bearlibterminal.terminal import *

def main_loop():
    key = terminal.read()
    while key != TK_ESCAPE:
        key = terminal.read()
1. Первая строчка подключает из библиотеки bearlibterminal модуль terminal и берет оттуда функции. Модулей в библиотеке может быть несколько, поэтому явно указываем какой именно нам нужен.
2. Вторая строка нужна для импорта констант из модуля, без него не распознается TK_ESCAPE.
3. Если я использую в каком-то своем модуле модуль terminal, то мне нужно будет импортировать его заново.
4. Команда terminal.open() используется только 1 раз в самом начале для создания окна терминала

Если я в чем-то ошибаюсь, просьба поправить, заранее спасибо :)
PS Спасибо за наводку на PyCharm - удобная вещь!

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: UniCurses на Python 3 под windows

Сообщение Cfyz » 04 сен 2016, 20:23

1, 2. Достаточно первой строчки импорта. Вторая импортирует все функции и константы терминала прямо в глобальную область видимости, в чем нет явной необходимости: константы доступны так же, как и функции, через terminal.TK_xxx. Насколько я знаю Python, конструкция

Код: Выделить всё

from ... import *
не в почете. Она добавляет в общую область видимости все подряд, например в случае с терминалом это функции с такими банальными именами, как open, close, put, get и пр.

Если не хочется постоянно писать terminal.xyz, то в качестве компромисса возможно

Код: Выделить всё

from bearlibterminal import terminal as T
if T.read() == T.TK_CLOSE:
    return
3. Да, нужно импортировать в каждом модуле. Но дублироваться все равно ничего не будет, это будет один и тот же terminal, так что можно импортировать сколько угодно.

4. Верно, один раз. Окно там действительно создается, но до первого refresh() его не будет видно на экране -- это позволяет произвести всю необходимую настройку окна (шрифт, размеры и т. д.) и потом разом показать уже готовое.

Касаемо цикла: довольно странно, что read() встречается дважды. Если цель только обрабатывать ввод пока не будет нажато что-то, то могу предложить такую формулировку:

Код: Выделить всё

def main_loop():
    while True:
        key = terminal.read()
        if key == terminal.TK_ESCAPE:
            break
        elif ...
Чем это лучше? Один вызов read() и вся обработка на одном уровне, в том числе и разные условия выхода.
Пытается раскуклиться

vapekreng
Сообщения: 63
Зарегистрирован: 22 фев 2016, 22:33

Re: UniCurses на Python 3 под windows

Сообщение vapekreng » 04 сен 2016, 21:23

по второму пункту ошибку понял - я обращался к константе напрямую, не указав имя модуля, поправил на terminal.TK_ESCAPE и заработало, не подумал об этом. Импорт всего подряд самому не по душе - понимаю прекрасно, что имена могут совпадать, а это далеко не гуд.
По поводу двойного использования terminal.read() - в пайтоне отсутствует конструкция

Код: Выделить всё

repeat
...
until
поэтому первый вызов сделал перед циклом. К break душа не лежит - стараюсь не использовать. Кстати, это стандартная конструкция?

Код: Выделить всё

def main_loop():
    while True:
        key = terminal.read()
        if key == terminal.TK_ESCAPE:
            break
        elif ...
Я имею в виду использование break вместе с while для замены repeat? Если да - буду переучиваться.
За разъяснения большое спасибо, обидно бывает, когда знаешь, что нужно сейчас делать, но не знаешь, как именно реализовать это в данном ЯП... Иногда даже вопрос сформулировать трудно
Из успехов: собачка весело бегает по экрану ;)
На очереди зону видимости перенести из своего паскалевскго модуля.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 33 гостя