Python 如何将鼠标滚轮绑定到tk inter\u列表框?
我有一个multilistbox界面,但当我使用鼠标滚轮(向上或向下)时,列会独立移动 如何同时移动所有列 (希望你能帮助我,我是初学者,我已经在这方面工作了几个星期) 这是我的代码:Python 如何将鼠标滚轮绑定到tk inter\u列表框?,python,tkinter,mouseevent,mousewheel,python-3.4,Python,Tkinter,Mouseevent,Mousewheel,Python 3.4,我有一个multilistbox界面,但当我使用鼠标滚轮(向上或向下)时,列会独立移动 如何同时移动所有列 (希望你能帮助我,我是初学者,我已经在这方面工作了几个星期) 这是我的代码: from tkinter import * class MultiListbox(Frame): def __init__(self, master, lists): Frame.__init__(self, master) self.lists = []
from tkinter import *
class MultiListbox(Frame):
def __init__(self, master, lists):
Frame.__init__(self, master)
self.lists = []
for l,w in lists:
frame = Frame(self); frame.pack(side=LEFT, expand=YES, fill=BOTH)
Label(frame, text=l, borderwidth=1, relief=RAISED).pack(fill=X)
lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0,
relief=FLAT, exportselection=FALSE)
lb.pack(expand=YES, fill=BOTH)
self.lists.append(lb)
lb.bind('<B1-Motion>', lambda e, s=self: s._select(e.y))
lb.bind("<MouseWheel>")
lb.bind('<Button-1>', lambda e, s=self: s._select(e.y))
lb.bind('<Leave>', lambda e: 'break')
lb.bind('<B2-Motion>', lambda e, s=self: s._b2motion(e.x, e.y))
lb.bind('<Button-2>', lambda e, s=self: s._button2(e.x, e.y))
frame = Frame(self); frame.pack(side=LEFT, fill=Y)
Label(frame, borderwidth=1, relief=RAISED).pack(fill=X)
sb = Scrollbar(frame, orient=VERTICAL, command=self._scroll)
sb.pack(expand=YES, fill=Y)
def _select(self, y):
row = self.lists[0].nearest(y)
self.selection_clear(0, END)
self.selection_set(row)
return 'break'
def _button2(self, x, y):
for l in self.lists: l.scan_mark(x, y)
return 'break'
def _b2motion(self, x, y):
for l in self.lists: l.scan_dragto(x, y)
return 'break'''
def _scroll(self, *args):
for l in self.lists:
l.yview(*args)
def curselection(self):
return self.lists[0].curselection()
def delete(self, first, last=None):
for l in self.lists:
l.delete(first, last)
def get(self, first, last=None):
result = []
for l in self.lists:
result.append(l.get(first,last))
if last: return map(None, *result)
return result
def index(self, index):
self.lists[0].index(index)
def insert(self, index, *elements):
for e in elements:
i = 0
for l in self.lists:
l.insert(index, e[i])
i = i + 1
def size(self):
return self.lists[0].size()
def see(self, index):
for l in self.lists:
l.see(index)
def selection_anchor(self, index):
for l in self.lists:
l.selection_anchor(index)
def selection_clear(self, first, last=None):
for l in self.lists:
l.selection_clear(first, last)
def selection_includes(self, index):
return self.lists[0].selection_includes(index)
def selection_set(self, first, last=None):
for l in self.lists:
l.selection_set(first, last)
if __name__ == '__main__':
tk = Tk()
Label(tk, text='MultiListbox').pack()
mlb = MultiListbox(tk, (('Clave', 20), ('Descripcion', 20), ('Existencia', 20)))
lineas = len(open("productos-doc1.txt").readlines())
totalLineas=(int(lineas))
try:
x = 0
while 0 != totalLineas:
abrir = open("productos-doc1.txt","r+")#ABRE EL ARCHIVO
leer = abrir.readlines()
renglon = leer[x]
splitRenglon = renglon.split("'")
clave = splitRenglon[0]
descripcion = splitRenglon[1]
existencia = splitRenglon[3]
mlb.insert(END, (clave, descripcion, existencia))
mlb.pack(expand=YES,fill=BOTH)
x = x+1
except IndexError:
mlb.insert(END,"FINISH" )
tk.mainloop()
从tkinter导入*
类MultiListbox(框架):
定义初始化(自、主、列表):
帧。\uuuu初始化(自,主)
self.lists=[]
对于列表中的l、w:
帧=帧(自身);frame.pack(侧面=左侧,展开=是,填充=两者)
标签(框架,文本=l,边框宽度=1,浮雕=凸起)。包装(填充=X)
lb=列表框(边框,宽度=w,边框宽度=0,选择边框宽度=0,
浮雕=平坦,导出选择=假)
lb.pack(扩展=是,填充=两者)
self.lists.append(lb)
lb.bind(“”,λe,s=self:s.(选择(e.y))
lb.bind(“”)
lb.bind(“”,λe,s=self:s.(选择(e.y))
lb.bind('',lambda e:'断裂')
lb.bind(“”,λe,s=自:s.b2;运动(e.x,e.y))
lb.bind(“”,λe,s=自身:s._按钮2(e.x,e.y))
帧=帧(自身);框架包装(侧面=左侧,填充=Y)
标签(边框,边框宽度=1,浮雕=凸起)。包装(填充=X)
sb=滚动条(框架,方向=垂直,命令=自滚动)
sb.打包(扩展=是,填充=Y)
def_选择(自,y):
行=自身。列表[0]。最近的(y)
自选择\u清除(0,结束)
自选择集(行)
返回“中断”
def_按钮2(自身、x、y):
对于self.list中的l:l.scan_标记(x,y)
返回“中断”
def_b2运动(自、x、y):
对于self.list中的l:l.scan_dragto(x,y)
返回“break”
def_滚动(自,*args):
对于self.List中的l:
l、 yview(*args)
选举(自选):
返回self.lists[0].curselection()
def delete(自我、第一、最后=无):
对于self.List中的l:
l、 删除(第一个,最后一个)
def get(自我、第一、最后=无):
结果=[]
对于self.List中的l:
result.append(l.get(first,last))
如果最后:返回映射(无,*结果)
返回结果
def索引(自我,索引):
self.lists[0]。索引(index)
def插入(自、索引、*元素):
对于元素中的e:
i=0
对于self.List中的l:
l、 插入(索引,e[i])
i=i+1
def大小(自身):
返回self.lists[0].size()
def见(自我,索引):
对于self.List中的l:
l、 见(索引)
def选择_锚(自身,索引):
对于self.List中的l:
l、 选择锚(索引)
def选择_清除(自身、第一个、最后一个=无):
对于self.List中的l:
l、 选择\u清除(第一个、最后一个)
def选择_包括(自身、索引):
返回self.lists[0]。选择内容包括(索引)
def选择_设置(自身、第一个、最后一个=无):
对于self.List中的l:
l、 选择集(第一个、最后一个)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
tk=tk()
标签(tk,text='MultiListbox').pack()
mlb=多列表框(tk,('Clave',20),('description',20),('Existencia',20)))
lineas=len(打开(“productos-doc1.txt”).readlines())
总计=整数(线性)
尝试:
x=0
而0!=总计:
abrir=open(“productos-doc1.txt”,“r+”)#ABRE EL ARCHIVO
leer=abrir.readlines()
伦格隆=里尔[x]
splitRenglon=renglon.split(“”)
clave=splitRenglon[0]
description=splitRenglon[1]
existencia=splitRenglon[3]
mlb.插页(结束,(类别、描述、存在))
mlb.pack(扩展=是,填充=两者)
x=x+1
除索引器外:
mlb.插入件(结束,“饰面”)
tk.mainloop()
只需查看代码,因为我无法在没有文本文件的情况下运行它,您似乎没有为列表的xscrollcommand
选项分配任何功能,该选项指定滚动列表时要执行的操作。我想如果没有它,你的滚动条将无法正常工作。您可以按如下方式添加选项:
sb = Scrollbar(frame, orient=VERTICAL, command=self._scroll)
[l.config(yscrollcommand=sb.set) for l in self.lists]
但是,我不确定这是你问题的原因 加油!它工作了,我的卷轴以前不动,但现在动了。现在的问题是:我有3列在那里,当把鼠标放在每个人身上时,它们都独立移动,我使用鼠标滚轮。我想用鼠标滚轮移动所有的列。注意:当我按下滚动键时,所有的动作都在一起。对不起,我的英语不好,再次谢谢你!