Исправление для полностью черных WX курсоров на Windows - PullRequest
3 голосов
/ 15 октября 2010

Следующий код демонстрирует проблему с определенными курсорами wx в Windows (курсоры OSX имеют белый контур), а именно: они все черные и поэтому полностью невидимы на черном фоне.

import wx
app = wx.PySimpleApp()
f = wx.Frame(None)
f.SetBackgroundColour(wx.Color(0))
f.SetCursor(wx.StockCursor(wx.CURSOR_CROSS))
f.Show()
app.MainLoop()

Интересно, нашел ли кто-нибудь способ исправления значков Windows или есть исправление, о котором я не знаю.

Более конкретная проблема, с которой я сталкиваюсь, заключается в том, что wx-бэкэнд matplotlibs используетwx.CURSOR_CROSS для масштабирования графиков imshow, которые я использую для отображения изображений, которые в основном черные.Я еще не нашел способ настроить курсоры, которые выбирает mpl, но я решил, что задам вопрос, пока копаю.

Спасибо, Адам

Примечание: Использование wxPython версии 2.8.10.1 и matplotlib версий 0.99 и 1.0

PROGRESS: Мне кажется, что я могу хотя бы сделать свой собственный курсор, выполнив следующее, но я очень расстроен, обнаружив, что естья не могу нигде включать белый цвет.Документация на это ужасна.

import numpy as np
buf = np.ones((16,16,3), dtype='uint8') * 127   # pixels untouched by the following operations will outline the crosshair shape (wish they could be white)
buf[7,:,:] = 0        # horizontal black line
buf[:,7,:] = 0        # vertical black line
buf[:6,:6, :] = 255   # evidently values > 127 are interpreted as alpha
buf[9:,:6, :] = 255
buf[9:, 9:, :] = 255
buf[:6, 9:, :] = 255
im = wx.ImageFromBuffer(16, 16, buf.tostring()) # passing a separate alpha buffer just gets ignored
im.SetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 7)
im.SetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 7)
cursor = wx.CursorFromImage(im)

Ответы [ 3 ]

1 голос
/ 12 февраля 2015

У меня такая же проблема, если у меня черное изображение, после нажатия кнопки «зум» курсор становится черным, и я не вижу, где находится мышь.

Я только что посмотрел на файл: \matplotlib\backends\backend_wx.py около строки 1593 (я использую matplotlib 1.3.1) и измените некоторый код, как показано ниже:

cursord = {
    cursors.MOVE : wx.CURSOR_HAND,
    cursors.HAND : wx.CURSOR_HAND,
    cursors.POINTER : wx.CURSOR_ARROW,
    cursors.SELECT_REGION : wx.CURSOR_ARROW, #wx.CURSOR_CROSS, change here!!!
    }

Это должно решить проблему.

1 голос
/ 16 октября 2010

Welp, вот что я придумал. Обработка событий mouse_enter и mouse_leave недостаточно хороша, поскольку панель навигации matplotlib установит курсор после факта, поэтому нам нужно установить его при движении мыши.

Мне не удалось нарисовать белый контур вокруг значка перекрестия, но я уже достаточно близко подобрался. так что вот оно.

# Bind mouse motion events in the canvas
self.figure.canvas.mpl_connect('motion_notify_event', self.on_mouse_move)

# ...

def on_mouse_move(self, evt):
    #
    # LAAAME SAUCE -- Crosshair cursor is all black on Windows making it
    #    virtually invisible on dark images. Use custom cursor instead.
    #
    if (sys.platform.lower().startswith('win') and 
        evt.inaxes and
        self.navtoolbar.mode == 'Zoom to rect mode'):  # NOTE: There are no constants for the navbar modes
        #
        # Build the crosshair cursor image as a numpy array.
        # Sadly I can't figure out how to make a white outline since every
        # value above 127 is apparently transparent.
        # Soooo the outline is yellow.
        #
        # Best docs I could find: http://wxruby.rubyforge.org/doc/cursor.html
        #
        buf = np.ones((16,16,3), dtype='uint8') * 255
        buf[:,:,2] = 1
        buf[7,1:-1,:] = buf[1:-1,7,:] = 0
        buf[:6,:6,:] = buf[9:,:6,:] = buf[9:,9:,:] = buf[:6,9:,:] = 255
        #
        # NOTE: I tried making an alpha channel and doing 
        #  wx.ImageFromBuffer(16, 16, buf.tostring(), alpha_buffer.to_string())
        # ...no good. wx just ignores the channel.
        #
        im = wx.ImageFromBuffer(16, 16, buf.tostring())
        im.SetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 7)
        im.SetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 7)
        cursor = wx.CursorFromImage(im)
        self.figure.canvas.SetCursor(cursor)
0 голосов
/ 03 ноября 2011

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

class CustomNavigationToolbar(NavigationToolbar2WxAgg):
    """
    Extend the default wx toolbar with your own event handlers
    """
    ON_CUSTOM = wx.NewId()
    def __init__(self, canvas):
        NavigationToolbar2WxAgg.__init__(self, canvas)
        self.set_cursor = self.customSetCursor


    def customSetCursor(self, event):
        self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...