Python tkinter, сохраняющий порядок имен при перемещении элементов по двум спискам - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть два списка, которые могут перемещать элементы назад и вперед между ними с помощью кнопок. Прямо сейчас, при перемещении элементов, он взял бы индекс выбранного элемента и удалил его. Затем этот элемент будет переписан в другом поле, но вставлен внизу, а это не то, что я действительно хочу. Можно ли как-то сохранить порядок имен, используя индекс словаря при переносе его в другое поле? Например, сдвиг 3-го элемента «Joanne» до 1-го элемента «Bill» справа налево будет по-прежнему отображать 1-й элемент поверх 3-го элемента.

Я пытался использовать словарь, который можно увидеть в моем коде, но я не смог понять, как заставить его работать с помощью выбора tkinter (один из методов списка 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()

1 Ответ

1 голос
/ 10 апреля 2020

На самом деле вам не нужно dictvar, достаточно просто использовать names. Чтобы сохранить порядок, аналогичный names при вставке в список, вам необходимо найти позицию вставки целевого списка.

Ниже приведен модифицированный код, основанный на вашем:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...