0

イベントバインディングをpython/tkinterで動作させるのに問題があります。クリックして場所を印刷しようとしていますが、これを行うたびに「-1」が表示されます。

これが私のコードです

from Tkinter import *
import Tkinter

class make_list(Tkinter.Listbox):

    def __init__(self,master, **kw):
        frame = Frame(master)
        frame.pack()
        self.build_main_window(frame)

        kw['selectmode'] = Tkinter.SINGLE
        Tkinter.Listbox.__init__(self, master, kw)
        master.bind('<Button-1>', self.click_button)
        master.curIndex = None

    #display the clicked location
    def click_button(self, event):
        self.curIndex = self.nearest(event.x)
        print self.curIndex

    #display the window, calls the listbox
    def build_main_window(self, frame):
        self.build_listbox(frame)

    #listbox
    def build_listbox(self, frame):
        listbox = Listbox(frame)
        for item in ["one", "two", "three", "four"]:
            listbox.insert(END, item)    
        listbox.insert(END, "a list entry")
        listbox.pack()
        return

if __name__ == '__main__':
    tk = Tkinter.Tk()
    make_list(tk)
    tk.mainloop()

更新されたコード-フレームを削除しましたが、関数click_buttonの最初のprintステートメントで-1が表示される理由がわかりません。

from Tkinter import *
import Tkinter

class make_list(Tkinter.Listbox):

    #display the clicked location
    def click_button(self, event):
        ##this block works
        w = event.widget
        index = int(w.curselection()[0])
        value = w.get(index)
        print value
        ##this doesn't
        self.curIndex = self.nearest(event.y)
        print self.curIndex
        self.curIndex = event.widget.nearest(event.y)
        print self.curIndex

    #display the window, calls the listbox
    def build_main_window(self):
        self.build_listbox()

    #listbox
    def build_listbox(self):
        listbox = Listbox()
        listbox.bind('<<ListboxSelect>>', self.click_button)
        for item in ["one", "two", "three", "four"]:
            listbox.insert(END, item)    
        listbox.insert(END, "a list entry")
        listbox.pack()
        return

if __name__ == '__main__':
    tk = Tkinter.Tk()
    start = make_list(tk)
    start.build_main_window()
    start.mainloop()
4

2 に答える 2

6

回答のコメントで、ベスト プラクティスを尋ねます。ベスト プラクティスは<<ListboxSelect>>、リスト ボックスで項目が選択された直後に which が起動するようにバインドすることです。

同様の質問に対するこの回答には例があります。

于 2013-01-23T14:09:44.057 に答える
3

listbox最寄りのアイテムは見つかりyませんでしxた。

 self.nearest(event.x)     # wrong
 self.nearest(event.y)     # right

更新:最初は本当の問題に気づきませんでした:

    listbox = Listbox(frame)

サブクラス化したのと同じリストボックスではなく、別の無関係なリストボックスです。リストボックス ( make_list )空です。そのため、最も近い場合は常に -1 が返されます。

おそらく、フレームをサブクラス化することは良い考えです (とにかく、リストボックスをサブクラス化し、フレームに別のリストボックスを追加するよりはましです)。次に、空ではない実際のリストボックスにイベントをバインドする必要があります。

修正されたときにどのように機能するかを確認する簡単な方法nearest、次のように実際のリストボックスを呼び出すことevent.widgetです。

self.curIndex = event.widget.nearest(event.y)
于 2013-01-22T20:46:56.740 に答える