2010-10-15 10 views
3

Le code suivant illustre un problème avec certains curseurs wx sous Windows (les curseurs OSX ont un contour blanc) ... à savoir, ils sont tous noirs, et donc complètement invisibles sur fond noir .Correctif pour les curseurs wx tout en noir sur Windows

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() 

Je me demande si quelqu'un a trouvé un moyen de patcher les icônes des fenêtres, ou s'il y a une solution pour cela que je ne connais pas. Le problème plus spécifique que je rencontre est que le backend wx de matplotlibs utilise le wx.CURSOR_CROSS pour zoomer sur des tracés imshow, que j'utilise pour afficher des images qui sont principalement noires. Je n'ai pas encore trouvé un moyen de personnaliser les curseurs que mpl choisit, mais j'ai pensé que je poserais la question pendant que je creuse.

Merci, Adam

Remarque: En utilisant la version wxPython 2.8.10.1 et les versions 0.99 et 1.0 matplotlib

PROGRÈS: me semble pouvoir au moins faire mon propre curseur en faisant la suivant, mais je suis extrêmement frustré de constater qu'il n'y a aucun moyen pour moi d'inclure la couleur blanche n'importe où. La documentation à ce sujet est horrible.

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) 

Répondre

1

Welp, voici ce que j'ai trouvé. La gestion des événements mouse_enter et mouse_leave n'est pas suffisante car la barre d'outils de navigation matplotlib positionnera le curseur après le fait, nous devons donc le définir au cours du déplacement de la souris.

Je n'étais pas en mesure d'obtenir un contour blanc autour de l'icône du réticule, mais je me suis assez proche pour l'instant. donc c'est ici.

# 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

Je travaille sur la même chose, j'ai succès en créant une barre d'outils de navigation personnalisée et rediriger le rappel 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)) 
1

J'ai le même problème ici, si je une image noire, après avoir cliqué sur le bouton "zoom", le curseur devient noir, et je ne peux pas voir où la souris se situe.

Je viens de regarder le fichier: \matplotlib\backends\backend_wx.py autour de la ligne 1593 (j'utilise matplotlib 1.3.1) et changer un peu de code comme ci-dessous:

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!!! 
    } 

Cela devrait résoudre le problème.