2010-03-26 3 views
0

Gedit 플러그인 용 코드를 작성 중입니다. 나는 파이썬을 사용하고 있으며, 인터페이스 (분명히)는 GTK이다.GTK에서 전달 키 누르기

그래서 문제는 매우 간단합니다. 검색 상자 (gtk.Entry)가 있으며 바로 아래에 결과 상자 (gtk.TreeView)가 있습니다. 검색 창에 무엇인가를 입력 한 직후에 많은 결과가 나타나며, 사용자가 위/아래 키를 눌러 선택하고, Enter를 눌러 선택하고 완료 할 수 있기를 바랍니다. 문제는, 위로/아래로 키 누르기를 TreeView로 전달하는 방법을 찾지 못하는 것입니다.

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 

내가 이벤트의 오른쪽 종류를 수신하고있어 명확하게 볼 수 있습니다,하지만 난 보내고있다 이벤트가 트 리뷰에 의해 무시됩니다 : 현재 나는이 코드 조각이있다. 어떤 아이디어?

미리 감사드립니다.

+1

분명히 호출 self.browser.grab_focus() 을하지만, 난 여전히에 초점을 유지하려면 :

예를 들어, 직접 트 리뷰 커서/선택을 조작 입력 상자 아직도 그 일을하고 있습니다. – dguaraglia

+1

그럴 경우, 나중에 다시 항목에'grab_focus' 만 할 수 있습니까? –

+0

@Johannes hmmm ... 아마도. 내가 옳은 것처럼 보이지 않았기 때문에 나는 시도하지 않았다. – dguaraglia

답변

1

위젯이 수신 할 수있는 이벤트 목록에 key-press-event을 포함 시켰습니까? 당신은 질문에

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

화살표 키를 사용하여 TreeView를 탐색 할 수 있기 때문에이 경우를 가정하겠습니다. – dguaraglia

1

하지 적절한 답을 호출하여 (내가 키 입력을 전달하는 방법을 모른다) 그렇게 할 수 있지만, 문제에 대한 대안 솔루션이있다. 이벤트가 문제를하는 데 도움이 보내기 전에

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

네, 아마도 이것이 최선의 방법 일 것입니다. 키 입력을 전달하는 대신 목록의 위치를 ​​직접 변경합니다. 이제는 키를 누른 후 항목을 유지하는 데 집중할 수있는 방법을 찾아야합니다. – dguaraglia

+1

key-press-event 핸들러에서 [True를 반환] (http://library.gnome.org/devel/gtk/unstable/GtkWidget.html#GtkWidget-key-press-event)하면됩니다. –