2

リストボックスウィジェットの項目が右クリックされたときにコンテキストメニューを表示しようとしています。問題は、リストボックスにバインドすると、リストボックス全体がアクティブになってイベントを送信し、リストアイテムのみにバインドできないように見えることです。<<ListboxSelect>>左クリックでトリガーされるので使用できません。そのため、メソッドを使用しようとしましたcurselection()が、望ましくない結果に陥りました(右クリックしたアイテムを選択する必要はありません)。<<ListboxSelect>>とを使用generate_event()してシミュレートする必要があると思いますnearest()。誰かがそれを行う方法を教えてもらえますか、あるいはtkinterパッケージ内のデフォルトのバインディングをどこで見つけることができますか?

4

1 に答える 1

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()
于 2013-02-13T21:45:38.120 に答える