我无法使用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()
答案 0 :(得分:6)
在答案的评论中,您要求最佳做法。最佳做法是绑定到<<ListboxSelect>>
,它将在列表框中选中项目后立即触发。
This answer对类似问题有一个例子。
答案 1 :(得分:1)
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)