Рубрики
Без рубрики

WXPYPHON: движущиеся предметы в ObjectListView

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Недавно я спрашивал о том, как реализовать перетаскивание предметов в wx.listctrl или в ObjectListView Отказ К сожалению, ни одному контролю не имеет этого встроенного, хотя я нашел Статья На WXPYPHON Wiki продемонстрировал один способ сделать перетаскивание предметов в ListCTRL.

Однако я думал, что реализация некоторых кнопок для перемещения элементов вокруг в виджете объектаListView должна быть довольно прост в реализации. Так вот в этом эта статья будет сосредоточиться на.

Изменение заказа товара

Если у вас не установлено WXPYPHON и ObjectListView, то вы захотите использовать PIP, чтобы установить их:

pip install wxPython objectlistview

Как только это сделано, откройте свой любимый текстовый редактор или IDE и введите следующий код:

import wx
from ObjectListView import ObjectListView, ColumnDefn


class Book(object):
    """
    Model of the Book object
    Contains the following attributes:
    'ISBN', 'Author', 'Manufacturer', 'Title'
    """
    
    def __init__(self, title, author, isbn, mfg):
        self.isbn = isbn
        self.author = author
        self.mfg = mfg
        self.title = title
        
    def __repr__(self):
        return "".format(title=self.title)


class MainPanel(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.current_selection = None
        self.products = [Book("wxPython in Action", "Robin Dunn",
                              "1932394621", "Manning"),
                         Book("Hello World", "Warren and Carter Sande",
                              "1933988495", "Manning"),
                         Book("Core Python Programming", "Wesley Chun",
                             "0132269937", "Prentice Hall"),
                         Book("Python Programming for the Absolute Beginner",
                              "Michael Dawson", "1598631128",
                              "Course Technology"),
                         Book("Learning Python", "Mark Lutz",
                              "0596513984", "O'Reilly")
                         ]
        
        self.dataOlv = ObjectListView(self, wx.ID_ANY, 
                                      style=wx.LC_REPORT|wx.SUNKEN_BORDER)
        self.setBooks()

        # Allow the cell values to be edited when double-clicked
        self.dataOlv.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK

        # create up and down buttons
        up_btn = wx.Button(self, wx.ID_ANY, "Up")
        up_btn.Bind(wx.EVT_BUTTON, self.move_up)
        
        down_btn = wx.Button(self, wx.ID_ANY, "Down")
        down_btn.Bind(wx.EVT_BUTTON, self.move_down)

        # Create some sizers
        mainSizer = wx.BoxSizer(wx.VERTICAL)

        mainSizer.Add(self.dataOlv, 1, wx.ALL|wx.EXPAND, 5)
        mainSizer.Add(up_btn, 0, wx.ALL|wx.CENTER, 5)
        mainSizer.Add(down_btn, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(mainSizer)
        
    def move_up(self, event):
        """
        Move an item up the list
        """        
        self.current_selection = self.dataOlv.GetSelectedObject()
        data = self.dataOlv.GetObjects()
        if self.current_selection:
            index = data.index(self.current_selection)
            if index > 0:
                new_index = index - 1
            else:
                new_index = len(data)-1
            data.insert(new_index, data.pop(index))
            self.products = data
            self.setBooks()
            self.dataOlv.Select(new_index)
    
    def move_down(self, event):
        """
        Move an item down the list
        """
        self.current_selection = self.dataOlv.GetSelectedObject()
        data = self.dataOlv.GetObjects()
        if self.current_selection:
            index = data.index(self.current_selection)
            if index < len(data) - 1:
                new_index = index + 1
            else:
                new_index = 0
            data.insert(new_index, data.pop(index))
            self.products = data
            self.setBooks()
            self.dataOlv.Select(new_index)
    
    def setBooks(self):
        self.dataOlv.SetColumns([
            ColumnDefn("Title", "left", 220, "title"),
            ColumnDefn("Author", "left", 200, "author"),
            ColumnDefn("ISBN", "right", 100, "isbn"),
            ColumnDefn("Mfg", "left", 180, "mfg")
        ])

        self.dataOlv.SetObjects(self.products)


class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, 
                          title="ObjectListView Demo", size=(800,600))
        panel = MainPanel(self)
        self.Show()


if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

Код, который мы заботимся о большинстве в этом примере, являются move_up () и move_down () методы. Каждый из этих методов проверит, есть ли у вас элемент в выбранном виде ObjectListView. Он также будет захватить текущее содержимое виджетов. Если у вас выбран пункт, то он будет схватить этот индекс элемента из виджета ObjectListView данные что мы схватили, когда мы позвонили Getobjects () Отказ Тогда мы можем использовать этот индекс, чтобы определить, следует ли нам увеличиваться (move_down) или уменьшение (move_up) его индекс в зависимости от того, какие из кнопок мы нажимаем.

После того, как мы обновим список с измененными позициями, то мы обновляем Self.Products , что наша класса переменная, которую мы используем в Устройства () Чтобы обновить наш виджет ObjectListView. Наконец мы на самом деле называем Устройства () И мы сбрасываем выбор, поскольку наш оригинальный выбор переместился.

Обертывание

Я подумал, что это был аккуратный маленький проект, который не очень долго собрал. Отмечу, что с этой реализацией есть хотя бы одна проблема, и это то, что она не работает правильно, когда вы выбираете несколько элементов в управлении. Возможно, вы можете исправить это, отключая множественное выделение в виджете вашего объектаListView или путем выяснения логики, чтобы она работала с несколькими выборами. Но я оставлю это по читателю, чтобы выяснить. Получайте удовольствие счастливого кодирования!