2013-02-13 4 views
2

목록 상자 위젯의 항목을 마우스 오른쪽 버튼으로 클릭하면 컨텍스트 메뉴를 표시하려고합니다. 문제는 목록 상자에 바인딩하면 전체 Listbox가 이벤트를 보내기 위해 활성화되어 목록 항목에만 바인딩 할 수있는 것 같지 않다는 것입니다. 나는 왼쪽 클릭으로 trigged되기 때문에 <<ListboxSelect>>을 사용할 수 없다. 그래서 메소드 curselection()을 사용하려고 시도했지만 원하지 않는 결과에 빠졌습니다. 오른쪽 클릭 한 항목을 선택하지 않아도됩니다. 나는 generate_event()nearest()을 사용하여 <<ListboxSelect>>을 시뮬레이트해야한다고 생각한다. 누군가 그 방법을 말해 줄 수 있습니까? 아니면 tkinter 패키지 내에 기본 바인딩을 찾을 수 있습니까?tkinter 목록 상자 항목 바인딩

답변

2

nearest(event.y)을 사용해야합니다. 콜백이 호출 될 때 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에 바인딩합니다.

import Tkinter 

def context_menu(event, menu): 
    widget = event.widget 
    index = widget.nearest(event.y) 
    _, yoffset, _, height = widget.bbox(index) 
    if event.y > height + yoffset + 5: # XXX 5 is a niceness factor :) 
     # Outside of widget. 
     return 
    item = widget.get(index) 
    print "Do something with", index, item 
    menu.post(event.x_root, event.y_root) 

root = Tkinter.Tk() 
aqua = root.tk.call('tk', 'windowingsystem') == 'aqua' 

menu = Tkinter.Menu() 
menu.add_command(label=u'hi') 

listbox = Tkinter.Listbox() 
listbox.insert(0, *range(1, 10, 2)) 
listbox.bind('<2>' if aqua else '<3>', lambda e: context_menu(e, menu)) 
listbox.pack() 
root.mainloop() 
+0

빈 공간을 클릭하면 메뉴가 게시됩니다. 항목 클릭에만 표시하는 방법이 있어야합니다. '<< ListboxSelect >>'는 어떻게 작동합니까? 그것은 과부하가 가능합니까? – Rnhmjoj

+0

사용자가 참조하는 빈 공간이 목록 상자와 관련되어 있으므로 예상됩니다. 'Listbox'의 높이를'listbox = Tkinter.Listbox (height = 5)'항목의 수로 간단히 설정할 수 있습니다. 이후 이벤트를 "오버로드"할 수 없으며 사용자가 항목을 클릭하지 않고 팝업 메뉴를 표시하기 때문에 관련이 없습니다. – mmgp

+0

@Rnhmjoj에서 업데이트를 확인하십시오. – mmgp