Pygame Set Mouse Cursor из растрового изображения

Я делаю графический редактор с использованием pygame, и мне было интересно, можно ли было изменить курсор мыши на что-то более подходящее (например, круг или прямоугольник) для кистей. У Pygame есть действительно странный способ сделать это, что я не уверен, что будет работать очень хорошо. Есть ли способ, которым я могу написать в растровое изображение, а затем использовать это?

Если есть способ сделать это с Python в целом, я думаю, это тоже сработает.

Ответ 1

Другой вариант - просто скрыть курсор, load любое произвольное растровое изображение, которое вам нравится, и нарисовать его каждый кадр где курсор.

Ответ 2

Вы можете загружать курсоры в PyGame с помощью pygame.cursors.load_xbm - только черно-белые курсоры, конечно же, хорошо документированное ограничение PyGame, per его документы (и цитирую):

Pygame поддерживает только черно-белые курсоры для системы.

Для документов формата XBM см., например, здесь. Вы можете подготовить такие файлы, например. с библиотекой PIL, за ее документы.

Ответ 3

Поскольку @SapphireSun спросил в комментарии о другом способе, я хотел бы представить другой ответ, и это - рисование курсора вручную. Я думаю, это то, что @Mizipzor предлагает в своем ответе, так что, возможно, это просто разработка.

Сначала скройте курсор мыши, затем каждый раз, когда обновляется рамка экрана, "вручную" рисуйте курсор:

pygame.mouse.set_visible(False)  # hide the cursor

# Image for "manual" cursor
MANUAL_CURSOR = pygame.image.load('finger_cursor_16.png').convert_alpha()

# In main loop ~
    ...

    # paint cursor at mouse the current location
    screen.blit( MANUAL_CURSOR, ( pygame.mouse.get_pos() ) ) 

Этот метод позволяет программе PyGame иметь любой вид растрового изображения для курсора. Может быть некоторая хитрость, связанная с получением горячей точки "щелчка" в правильном месте, но этого можно достичь, установив прозрачный курсор с горячей точкой в позиции, соответствующей пользовательскому растровому изображению. Смотрите руководство для деталей.

# transparent 8x8 cursor with the hot-spot at (4,4)
pygame.mouse.set_cursor((8,8),(4,4),(0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0))

Я не уверен, что чувствую к разноцветным курсорам, но, по крайней мере, это возможно.