Python 3.x Python tkinter在两个列表框之间移动项目时保持名称顺序一致
我有两个列表框,可以使用按钮在它们之间来回移动项目。现在,当移动项目时,它将获取所选项目的索引并将其删除。这个项目然后将被重写在另一个框中,但被插入底部,这不是我真正想要的。当我把字典索引移到另一个框中时,有没有办法让名字的顺序保持一致?例如,将第一个项目“账单”之前的第三个项目“Joanne”从右向左移动框仍将使第一个项目显示在第三个项目的顶部 我曾经尝试过使用一个可以在我的代码中看到的字典,但是我不知道如何使它与tkinter的列表框方法一起工作Python 3.x Python tkinter在两个列表框之间移动项目时保持名称顺序一致,python-3.x,tkinter,Python 3.x,Tkinter,我有两个列表框,可以使用按钮在它们之间来回移动项目。现在,当移动项目时,它将获取所选项目的索引并将其删除。这个项目然后将被重写在另一个框中,但被插入底部,这不是我真正想要的。当我把字典索引移到另一个框中时,有没有办法让名字的顺序保持一致?例如,将第一个项目“账单”之前的第三个项目“Joanne”从右向左移动框仍将使第一个项目显示在第三个项目的顶部 我曾经尝试过使用一个可以在我的代码中看到的字典,但是我不知道如何使它与tkinter的列表框方法一起工作 from tkinter import *
from tkinter import *
#Buttons to shift items in the listbox
def shift_right():
index = left_box.curselection()
for x in index [::-1]:
d = left_box.get(x)
right_box.insert(END,d)
left_box.delete(x)
def shift_right_all():
left_box.delete(0, END)
right_box.delete(0, END)
for x in dictvar:
right_box.insert(END, dictvar[x])
def shift_left():
index = right_box.curselection()
for x in index [::-1]:
d = right_box.get(x)
left_box.insert(END,d)
right_box.delete(x)
def shift_left_all():
left_box.delete(0, END)
right_box.delete(0, END)
for x in dictvar:
left_box.insert(END, dictvar[x])
root = Tk()
root.geometry('330x200')
names = ['Bill', 'Jack', 'Joanne', 'Ann', 'Dave', 'Jane']
dictvar = { i : names[i] for i in range(0, len(names))}
left_box = Listbox(root, activestyle = 'none', highlightthickness = 0)
left_box.place(x=5, y=5)
right_button = Button(root, text=' > ', command = shift_right)
right_button.place(x=148, y=5)
right_all_button = Button(root, text='>>', command = shift_right_all)
right_all_button.place(x=148, y=55)
left_button = Button(root, text=' < ', command = shift_left)
left_button.place(x=148, y=105)
left_all_button = Button(root, text='<<', command = shift_left_all)
left_all_button.place(x=148, y=155)
right_box = Listbox(root, activestyle = 'none', highlightthickness = 0)
for x in dictvar:
right_box.insert(END, dictvar[x])
right_box.place(x=200, y=5)
root.mainloop()
实际上,您不需要dictvar,只需使用名称就足够了。为了在插入listbox时保持与名称相同的顺序,您需要找到目标listbox的插入位置 以下是基于您的修改后的代码:
from tkinter import *
# insert name into listbox
def insert_into(listbox, name):
# get the index of name in names
idx = names.index(name)
# loop through listbox to find the insert position
insert_idx = END
for i in range(listbox.size()):
if names.index(listbox.get(i)) > idx:
insert_idx = i
break
listbox.insert(insert_idx, name)
#Buttons to shift items in the listbox
def shift_right():
index = left_box.curselection()
for x in index [::-1]:
d = left_box.get(x)
insert_into(right_box, d)
left_box.delete(x)
def shift_right_all():
left_box.delete(0, END)
right_box.delete(0, END)
right_box.insert(END, *names)
def shift_left():
index = right_box.curselection()
for x in index [::-1]:
d = right_box.get(x)
insert_into(left_box, d)
right_box.delete(x)
def shift_left_all():
left_box.delete(0, END)
right_box.delete(0, END)
left_box.insert(END, *names)
root = Tk()
root.geometry('330x200')
names = ['Bill', 'Jack', 'Joanne', 'Ann', 'Dave', 'Jane']
left_box = Listbox(root, activestyle = 'none', highlightthickness = 0)
left_box.place(x=5, y=5)
right_button = Button(root, text=' > ', command = shift_right)
right_button.place(x=148, y=5)
right_all_button = Button(root, text='>>', command = shift_right_all)
right_all_button.place(x=148, y=55)
left_button = Button(root, text=' < ', command = shift_left)
left_button.place(x=148, y=105)
left_all_button = Button(root, text='<<', command = shift_left_all)
left_all_button.place(x=148, y=155)
right_box = Listbox(root, activestyle = 'none', highlightthickness = 0)
right_box.insert(END, *names)
right_box.place(x=200, y=5)
root.mainloop()
使用insert方法可以在列表框中的任意位置插入项。这能解决你的问题吗?谢谢,它很有魅力。然而,我对python和代码本身还不熟悉,所以我不能真正理解“insert_into”函数是如何工作的,介意详细解释一下吗?提前谢谢你!for循环是在目标列表中查找名称,其索引中的名称大于要插入的名称。如果找到,只需在找到的名称之前插入名称,否则请在列表框的末尾插入/非常感谢您的帮助并及时回复:D