问题描述
我在获取事件绑定以使用python/tkinter时遇到麻烦.我只是想单击并打印位置,但是每次这样做,结果都是"-1".
I'm having trouble getting an event binding to work with python/tkinter. I'm simply trying to click and have the location printed, but every time I do this, "-1" is the result.
这是我的代码
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函数中的第一个打印语句中得到-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()
推荐答案
listbox
由y
而不是x
查找到最近的项目.
listbox
nearest item is found by y
, not x
.
self.nearest(event.x) # wrong
self.nearest(event.y) # right
更新:我首先没有注意到真正的问题:
Update: I didn't notice the real problem first:
listbox = Listbox(frame)
它不是您子类化的列表框,而是另一个不相关的列表框. 您的列表框(是 make_list)为空,这就是为什么它总是返回-1为最接近的原因.
It's not the same listbox which you subclassed, it's another unrelated listbox. Your listbox (which is make_list) is empty, that's why it always returns -1 for nearest.
也许对框架进行子类化是个好主意(无论如何,比对列表框进行子类化并向其中添加具有另一个列表框的框架更好).然后,您必须在不为空的 real 列表框上绑定事件.
Perhaps subclassing a frame is a good idea (anyway, better than subclassing listbox and adding a frame with another listbox into it). Then you'll have to bind event on that real listbox which is not empty.
查看修正后的工作方式的快速方法是使用event.widget
调用真实列表框的nearest
:
Quick way to see how it will work when fixed is to call nearest
of a real listbox with event.widget
:
self.curIndex = event.widget.nearest(event.y)
这篇关于python tkinter listbox事件绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!