python tkinter listbox事件绑定

2024-04-18 21:11:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难让事件绑定与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按钮中的第一个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()

Tags: thebuildselfmastereventmaintkinterdef
2条回答

在对答案的评论中,你要求最佳实践。最佳实践是绑定到<<ListboxSelect>>,在列表框中选择项后将立即触发。

This answer对于类似的问题有一个例子。

listbox最近的项由y找到,而不是x

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

更新:我没有首先注意到真正的问题:

    listbox = Listbox(frame)

它不是你子类化的同一个列表框,它是另一个不相关的列表框。您的列表框(它make_list)是空的,这就是为什么它总是返回-1表示最近的。

也许对一个框架进行子类化是一个好主意(无论如何,总比对listbox进行子类化并在其中添加另一个listbox的框架要好)。然后,您必须在real列表框上绑定事件,该列表框不是空的。

当固定时,查看它如何工作的快速方法是用event.widget调用一个真正的列表框的nearest

self.curIndex = event.widget.nearest(event.y)

相关问题 更多 >