Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python tkinter在两个列表框之间移动项目时保持名称顺序一致_Python 3.x_Tkinter - Fatal编程技术网

Python 3.x Python tkinter在两个列表框之间移动项目时保持名称顺序一致

Python 3.x Python tkinter在两个列表框之间移动项目时保持名称顺序一致,python-3.x,tkinter,Python 3.x,Tkinter,我有两个列表框,可以使用按钮在它们之间来回移动项目。现在,当移动项目时,它将获取所选项目的索引并将其删除。这个项目然后将被重写在另一个框中,但被插入底部,这不是我真正想要的。当我把字典索引移到另一个框中时,有没有办法让名字的顺序保持一致?例如,将第一个项目“账单”之前的第三个项目“Joanne”从右向左移动框仍将使第一个项目显示在第三个项目的顶部 我曾经尝试过使用一个可以在我的代码中看到的字典,但是我不知道如何使它与tkinter的列表框方法一起工作 from tkinter import *

我有两个列表框,可以使用按钮在它们之间来回移动项目。现在,当移动项目时,它将获取所选项目的索引并将其删除。这个项目然后将被重写在另一个框中,但被插入底部,这不是我真正想要的。当我把字典索引移到另一个框中时,有没有办法让名字的顺序保持一致?例如,将第一个项目“账单”之前的第三个项目“Joanne”从右向左移动框仍将使第一个项目显示在第三个项目的顶部

我曾经尝试过使用一个可以在我的代码中看到的字典,但是我不知道如何使它与tkinter的列表框方法一起工作

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