2010-03-26 6 views
0

J'écris un peu de code pour un plugin Gedit. J'utilise Python et l'interface (évidemment) est GTK. Donc, le problème que j'ai est assez simple: j'ai une boîte de recherche (un gtk.Entry) et juste en dessous j'ai une boîte de résultats (un gtk.TreeView). Juste après que vous tapez quelque chose dans la boîte de recherche vous êtes présenté un tas de résultats, et je voudrais que l'utilisateur puisse appuyer sur les touches Haut/Bas pour en sélectionner un, Entrée pour le choisir et être fait. Chose est, je ne peux pas sembler trouver un moyen de transférer la touche Up/Down à la TreeView. À l'heure actuelle, j'ai ce morceau de code:Transférer des touches dans GTK

def __onSearchKeyPress(self, widget, event): 
    """ 
    Forward up and down keys to the tree. 
    """ 
    if event.keyval in [gtk.keysyms.Up, gtk.keysyms.Down]: 
     print "pressed up or down" 
     e = gtk.gdk.Event(gtk.gdk.KEY_PRESS) 
     e.keyval = event.keyval 
     e.window = self.browser.window 
     e.send_event = True 
     self.browser.emit("key-press-event", e) 
     return True 

Je peux voir clairement que je reçois le bon type d'événement, mais l'événement j'envoie est ignorée par le TreeView. Des idées?

Merci d'avance les gens.

+1

Apparemment appeler self.browser.grab_focus() avant d'envoyer l'événement aide les choses, mais je veux toujours garder l'accent sur la boîte d'entrée. Je travaille toujours là-dessus. – dguaraglia

+1

Dans ce cas, pouvez-vous juste 'grab_focus' sur l'entrée à nouveau après? –

+0

@Johannes hmmm ... peut-être. Je n'ai pas essayé parce que cela ne semblait pas correct. – dguaraglia

Répondre

1

Avez-vous inclus le key-press-event dans la liste des événements que le widget est autorisé à recevoir? Vous pouvez le faire en appelant

browser.add_events(gtk.gdk.KEY_PRESS_MASK) 
+0

Je vais vérifier cela, bien que je suppose que c'est le cas, parce que je peux parcourir le TreeView en utilisant les touches fléchées. – dguaraglia

1

Pas une réponse appropriée à la question (je ne sais pas comment transmettre touches), mais il y a une solution alternative à votre problème.

déplacer le curseur TreeView/sélection directement, par exemple:

path, column = browser.get_cursor() 
browser.set_cursor((path[0] + 1,)) # Down 
+0

Oui, c'est peut-être la meilleure façon de faire. Au lieu de transmettre la frappe, je vais changer moi-même la position sur la liste. Maintenant, j'ai juste besoin de trouver un moyen d'obtenir la mise au point pour rester sur l'entrée une fois que vous appuyez sur Bas. – dguaraglia

+1

Je pense que vous pouvez le faire en [renvoyant True] (http://library.gnome.org/devel/gtk/unstable/GtkWidget.html#GtkWidget-key-press-event) à partir du gestionnaire d'événements key-press-event. –