我希望我的程序以下列方式工作:
感谢This question/answer我设法让他们同时移动
代码如下:
from tkinter import *
class fase3(Frame):
def __init__(self, master):
Frame.__init__(self,master)
self.master=master
self.frame=Frame(self.master)
self.txtm=Label(self, text="example")
self.txtm.grid(row=1, columnspan=5)
self.txt1=Label(self, text="1")
self.txt1.grid(row=2, column=1)
self.txt2=Label(self, text="2")
self.txt2.grid(row=2,column=2)
self.txt3=Label(self, text="3")
self.txt3.grid(row=2,column=3)
self.scrlb=Scrollbar(self,orient="vertical")
self.lista1=Listbox(self,yscrollcommand=self.yscroll1,exportselection=0)
self.lista1.grid(row=3,column=1)
self.lista2=Listbox(self, yscrollcommand=self.yscroll2,exportselection=0)
self.lista2.grid(row=3, column=2)
self.lista3=Listbox(self, yscrollcommand=self.yscroll3,exportselection=0)
self.lista3.grid(row=3, column=3)
#self.scrlb.config(command=self.yview)
#self.scrlb.grid(row=3, column=4,rowspan=1)
#i chose not to place the scrollbar because it involved frames and it makes the code longer
for i in range(3):
self.lista1.insert("end",i)
self.lista2.insert("end","hello")
self.lista2.insert("end","pls")
self.lista2.insert("end","thanks")
self.lista3.insert("end","world")
self.lista3.insert("end","help")
self.lista3.insert("end","alot")
def yscroll1(self, *args):
if self.lista2.yview()!=self.lista1.yview()!=self.lista3.yview():
self.lista2.yview_moveto(args[0])
self.lista3.yview_moveto(args[0])
self.scrlb.set(*args)
def yscroll2(self, *args):
if self.lista1.yview()!=self.lista2.yview()!=self.lista1.yview():
self.lista1.yview_moveto(args[0])
self.lista3.yview_moveto(args[0])
self.scrlb.set(*args)
def yscroll3(self, *args):
if self.lista2.yview()!=self.lista3.yview()!=self.lista1.yview():
self.lista1.yview_moveto(args[0])
self.lista2.yview_moveto(args[0])
self.scrlb.set(*args)
def yview(self, *args):
self.lista1.yview(*args)
self.lista2.yview(*args)
self.lista3.yview(*args)
self.pack()
root = Tk()
marco= Frame(root, padx=100, pady=50)
marco.pack()
lf = fase3(marco)
root.mainloop()
部分问题是,我已经有一个绑定到每个Listbox的函数,当我添加exportselection=0
时,它选择一个值,因此,例如用户可以选择(" 0&#34 ;,"你好","很多"),这对我来说根本就没有意义(插入数据库)
我还没有完成任何过程,但如果它们可以同时移动,那么它们应该可以选择相邻的值。
你应该能够复制粘贴它并在Python上运行它没有问题,我在python 3中做到了。
答案 0 :(得分:1)
您要做的第一件事是绑定到<<ListboxSelect>>
事件,以检测何时在其中一个列表框中选择了一个选项:
def __init__(self, master):
# ...
self.lista1=Listbox(self,yscrollcommand=self.yscroll1,exportselection=0)
self.lista1.bind('<<ListboxSelect>>', self.on_select1)
self.lista1.grid(row=3,column=1)
self.lista2=Listbox(self, yscrollcommand=self.yscroll2,exportselection=0)
self.lista2.bind('<<ListboxSelect>>', self.on_select2)
self.lista2.grid(row=3, column=2)
self.lista3=Listbox(self, yscrollcommand=self.yscroll3,exportselection=0)
self.lista3.bind('<<ListboxSelect>>', self.on_select3)
self.lista3.grid(row=3, column=3)
# ...
选择某个选项后,您需要在其他列表框中选择相应的选项:
def on_select1(self, event):
# Get index of selected option.
index = self.lista1.curselection()[0]
# Select corresponding options in other list-boxes.
self.select_others(index, self.lista2, self.lista3)
def on_select2(self, event):
# Get index of selected option.
index = self.lista2.curselection()[0]
# Select corresponding options in other list-boxes.
self.select_others(index, self.lista1, self.lista3)
def on_select3(self, event):
# Get index of selected option.
index = self.lista3.curselection()[0]
# Select corresponding options in other list-boxes.
self.select_others(index, self.lista1, self.lista2)
def select_others(self, index, *others):
for listbox in others:
# The list-box's selection must be cleared to prevent the previous selection from remaining.
listbox.selection_clear(0, listbox.size() - 1)
listbox.selection_set(index)
最后,self.pack()
课程末尾的face3
放错地方了。
class face3(Frame):
# ...
self.pack()
您应该打包lf
:
root = Tk()
marco = Frame(root, padx=100, pady=50)
marco.pack()
lf = fase3(marco)
lf.pack()
root.mainloop()