[英]Python / Tkinter listbox troubles
我在这里发布了一个问题,并建议我重组代码。 现在已经足够不同了,以至于我觉得有理由提出一个新问题。
无论如何,我试图将拖放功能添加到列表框中,但是我认为一个好的第一步是首先使事件绑定起作用。 当前,当我单击列表时,单击列表框时出现以下错误。 出现列表框窗口,但是当我单击它时会发生错误。
"AttributeError: make_list instance has no attribute 'nearest'.
另外,当我在build_listbox方法中打印列表框时,将打印以下十进制.40720520L。 这不应该打印列表框中的值吗? 毕竟,使用相同的方法。 列表框创建不正确吗?
from Tkinter import *
import Tkinter
class make_list:
def move_mouse(self, event):
self.curIndex = event.nearest(event.y)
print self.curIndex
def click_button(self, event):
w= event.widget
self.curIndex = int(w.curselection()[0])
#print self.curIndex
value = w.get(self.curIndex)
print value
def build_main_window(self):
self.build_listbox()
def build_listbox(self):
listbox = Listbox()
listbox.bind('<<ListboxSelect>>', self.click_button)
listbox.bind('<B1-Motion>', self.move_mouse)
for item in ["one", "two", "three", "four"]:
listbox.insert(END, item)
listbox.insert(END, "a list entry")
listbox.pack()
print listbox
return
if __name__ == '__main__':
start = make_list()
start.build_main_window()
mainloop()
在Tkinter小部件上进行print
时所获得的值与用户无关,它只是为您创建的Tcl
变量的名称。
现在,由于您的代码显然正在运行(通过快速浏览问题中的注释),我建议以其他方式进行拖放功能。 例如,如果我们有一个与Listbox
的值相关联的值的Listbox
,那么如果我们可以更新此列表然后反映在Listbox
显示上,那么执行该任务会容易得多,对吗? 太糟糕了,我们在Python中没有这样的东西,但是现在考虑以下代码:
import Tkinter
def list_click(event):
w = event.widget
index = w.nearest(event.y)
w._selection = index
def list_motion(event):
w = event.widget
if w._selection is None:
return
index = w.curselection()[0]
w._var.swap(index, w._selection)
w._selection = index
def list_clear(event):
event.widget._selection = None
root = Tkinter.Tk()
v = ListVar(values=('one', 'two', 'three', 'four'))
v.append('a list entry')
listbox = Tkinter.Listbox(listvar=v)
listbox.pack()
listbox._selection = None
listbox._var = v
listbox.bind('<1>', list_click)
listbox.bind('<B1-Motion>', list_motion)
listbox.bind('<ButtonRelease-1>', list_clear)
root.mainloop()
此代码以下列方式工作:在列表框中单击鼠标时,它将最近的项目标记为“选定”;当您移动鼠标时,它将交换项目并更新选择;当您释放鼠标按钮时,它将清除选择。 那么缺少的是这个ListVar
东西。 这里是:
class ListVar(Tkinter.Variable):
def __init__(self, master=None, name=None, **kwargs):
Tkinter.Variable.__init__(self, master, kwargs.get('values'), name)
def set(self, values):
self._tk.call('set', self._name, values)
def set_index(self, index, value):
self._tk.call('lset', self._name, index, value)
def get_index(self, index):
return self._tk.eval('lindex $%s %d' % (self._name, index))
def get(self, start=None, end=None):
if start is None and end is None:
res = self._tk.eval('lrange $%s 0 end' % self._name)
elif end is None:
res = self._tk.eval('lrange $%s %d end' % (self._name, start))
else:
res = self._tk.eval('lrange $%s %d %d' % (self._name, start, end))
return self._tk.splitlist(res)
def swap(self, a, b):
if a != b:
tmp = self.get_index(a)
self.set_index(a, self.get_index(b))
self.set_index(b, tmp)
def append(self, value):
self._tk.eval('lappend %s {%s}' % (self._name, value))
这很粗糙,如果传递诸如“ hello {”之类的值,则将失败。这可以通过许多方式进行改进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.