Как перемещать элементы вверх или вниз по списку в Tkinter, не теряя их выбора? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть приведенный ниже код, который создает простой список и позволяет пользователям выбирать элемент и перемещать его вверх или вниз по списку, тем самым реорганизуя список.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что каждый разнажмите «двигаться вверх» или «двигаться вниз», действие выполняется правильно, но курсор больше не остается выбранным.Мне нужно повторно выбрать элемент, чтобы снова выполнить функцию.

Я попытался настроить exportselection = False при настройке списка, но это не сработало.

import tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.wm_title("Animals")
        self._frame = None

class AnimalPage(tk.Frame):
    def __init__(self, master, controller):
        tk.Frame.__init__(self, master)
        self.master = master
        self.controller = controller
        self.config(relief='sunken', borderwidth=2)
        self.pack(fill = "both", expand = False)
        tk.Label(self, text="This is the Animal Configuration Page").pack()

        self.animalList = ['Cat', 'Dog', 'Bear', 'Dolphin', 'Kangaroo']
        self.animalString = tk.StringVar(value=self.animalList)
        self.animalBox = tk.Listbox(self, listvariable=self.animalString,
                                height=25, width=50, borderwidth=2)
        self.animalBox.pack()

        moveUpButton = tk.Button(self, text="Move Up", command=lambda: self.moveup())
        moveUpButton.pack()
        moveDownButton = tk.Button(self, text="Move Down", command=lambda: self.movedown())
        moveDownButton.pack()

    def moveup(self, *args):
        try:
            self.idxs = self.animalBox.curselection()
            if not self.idxs:
                return
            for pos in self.idxs:
                if pos==0:
                    continue
                text=self.animalBox.get(pos)
                self.animalBox.delete(pos)
                self.animalBox.insert(pos-1, text)
                self.animalList.pop(pos)
                self.animalList.insert(pos-1, text)
        except:
            pass

    def movedown(self, *args):
        try:
            self.idxs = self.animalBox.curselection()
            if not self.idxs:
                return
            for pos in self.idxs:
                if pos==0:
                    continue
                text=self.animalBox.get(pos)
                self.animalBox.delete(pos)
                self.animalBox.insert(pos+1, text)
                self.animalList.pop(pos)
                self.animalList.insert(pos+1, text)
        except:
            pass

if __name__ == "__main__":
    app = SampleApp()
    newFrame = AnimalPage(app, app)
    app.geometry("1200x700")
    app.mainloop()

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Чтобы выбор оставался выбранным, вы должны выбрать правильный код в коде, поскольку он находится в новом месте.К счастью, select_set (i) этого блока делает это.вы бы сделали это следующим образом:

def moveup(self, *args):
    try:
        self.idxs = self.animalBox.curselection()
        if not self.idxs:
            return
        for pos in self.idxs:
            if pos==0:
                continue
            text=self.animalBox.get(pos)
            self.animalBox.delete(pos)
            self.animalBox.insert(pos-1, text)
            self.animalList.pop(pos)
            self.animalList.insert(pos-1, text)
        self.animalBox.select_set(pos-1)
    except:
        pass
0 голосов
/ 11 октября 2018

Исправленный код для перенесено :

def movedown(self, *args):
    try:
        self.idxs = self.animalBox.curselection()
        if not self.idxs:
            return
        for pos in self.idxs:
            # Are we at the bottom of the list?
            if pos == len(self.animalList)-1: 
                continue
            text=self.animalBox.get(pos)
            self.animalBox.delete(pos)
            self.animalBox.insert(pos+1, text)
            self.animalList.pop(pos)
            self.animalList.insert(pos+1, text)
            self.animalBox.selection_set(pos + 1)
    except:
        pass
0 голосов
/ 11 октября 2018

Просто используйте selection_set , чтобы сохранить выбранный элемент, например:

 def moveup(self, *args):
    try:
        self.idxs = self.animalBox.curselection()
        if not self.idxs:
            return
        for pos in self.idxs:
            if pos==0:
                continue
            text=self.animalBox.get(pos)
            self.animalBox.delete(pos)
            self.animalBox.insert(pos-1, text)
            self.animalList.pop(pos)
            self.animalList.insert(pos-1, text)
            self.animalBox.selection_set(pos-1)
    except:
        pass

И аналогично для Moveown .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...