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

WXPYPHON: Использование ObjectListView вместо listctrl

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

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

WXPYPHON LISTCTRL – очень удобный виджет. К сожалению, это может быть боль в использовании. Это открытие вызвало Филипп Пайпер , Миссионер Мозамбике , чтобы написать ObjectListView , обертка для wx.listctrl. ObjectListView фактически добавляет функциональность, поскольку она использует объекты для создания своих строк и, таким образом, он делает получение информации из нескольких столбцов намного проще. Г-н Пайпер также добавил множество других удобств, которые облегчают добавление пользовательских редакторов, чередуя цвет строк, автоматически сортирует строки, и многое, многое другое! Эта статья поможет вам узнать некоторые основы использования ObjectListView, чтобы вы сможете использовать его в ваших будущих проектах. Это не должно быть исчерпывающим взглядом на контроль, так как он на самом деле очень хорошо Документировано Отказ

Следует отметить, что ObjectListView не является заменой для управления стандартным управлением списками. Настройка довольно разная. Кроме того, это сторонняя библиотека, которая не включена в Wxpython, поэтому вам нужно Скачать Это. Теперь, когда все отказ от ответственности выходят в путь, давайте посмотрим на простой пример:

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
       
    
########################################################################
class MainPanel(wx.Panel):
    #----------------------------------------------------------------------
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.products = [Book("wxPython in Action", "Robin Dunn",
                              "1932394621", "Manning"),
                         Book("Hello World", "Warren and Carter Sande",
                              "1933988495", "Manning")
                         ]

        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 an update button
        updateBtn = wx.Button(self, wx.ID_ANY, "Update OLV")
        updateBtn.Bind(wx.EVT_BUTTON, self.updateControl)

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

        mainSizer.Add(self.dataOlv, 1, wx.ALL|wx.EXPAND, 5)
        mainSizer.Add(updateBtn, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(mainSizer)
        
    #----------------------------------------------------------------------
    def updateControl(self, event):
        """
        
        """
        print "updating..."
        product_dict = [{"title":"Core Python Programming", "author":"Wesley Chun",
                         "isbn":"0132269937", "mfg":"Prentice Hall"},
                        {"title":"Python Programming for the Absolute Beginner",
                         "author":"Michael Dawson", "isbn":"1598631128",
                         "mfg":"Course Technology"},
                        {"title":"Learning Python", "author":"Mark Lutz",
                         "isbn":"0596513984", "mfg":"O'Reilly"}
                        ]
        data = self.products + product_dict
        self.dataOlv.SetObjects(data)
        
    #----------------------------------------------------------------------
    def setBooks(self, data=None):
        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)
        
########################################################################
class GenApp(wx.App):
    
    #----------------------------------------------------------------------
    def __init__(self, redirect=False, filename=None):
        wx.App.__init__(self, redirect, filename)
        
    #----------------------------------------------------------------------
    def OnInit(self):
        # create frame here
        frame = MainFrame()
        frame.Show()
        return True
    
#----------------------------------------------------------------------
def main():
    """
    Run the demo
    """
    app = GenApp()
    app.MainLoop()

if __name__ == "__main__":
    main()

Если вы запустите этот код, вы должны заканчивать что-то вроде этого:

Теперь давайте посмотрим, что все это делает. Во-первых, я создаю универсальную «книгу» класса с некоторыми свойствами: ISBN, автор, MFG и заголовок. Мы будем использовать этот класс для создания строк в ObjectListView. Далее мы создаем стандартную панель и поместите объектListView и на кнопку виджет на нем. Вы также заметите, что есть короткий список объектов «Книга». ObjectListView устанавливается в режим отчета с флагом стиля LC_Report. У него тоже есть другие режимы, но я не буду охватить тех. Режим отчета выглядит наиболее похоже на режим деталей в Windows Explorer.

Следующая часть немного странная:

self.dataOlv.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK

Этот код говорит нашему виджету, чтобы разрешить редактирование всех клеток в строке (кроме первого), дважды щелкнув их. Я не знаю, почему это было разработано так, как будто выглядит все, что вам нужно сделать, это один клик. Даже Документация говорит, что один клик должен быть достаточно. Может быть, это ограничение окон. Во всяком случае, для редактирования первой ячейки любой строки просто выберите его и нажмите F2.

Последние несколько строк в методе инициализации просто помещают виджеты в Sizers. Следующий кусок интересного кода находится в UpdateControl Метод, где мы фактически обновляем содержимое нашего объектаListView. Я показываю два разных способа сделать обновление здесь. Во-первых, просто использовать список продуктов объектов книги и вызовите метод SetObjects ObjectListView со списком, переданным. Второй способ – использовать словарь. Ключи словаря должны соответствовать имени значения COLOPDEFN (которое посмотрим в SetBooks Method). Словары значений могут быть все, что вы хотите. В моем примере я фактически сочетает в себе список предметов книги и список словарей и вызовов SetObjects на результате.

В Устройства Метод, мы определяем столбцы объектаListView. Это делается путем передачи списка Columndefn объектов в метод SetColumns ObjectListViews. У Columndefn есть много параметров, но мы только собираемся покрывать первые четыре. Аргумент один является заголовка для колонны; Аргумент два – это выравнивание для столбца в целом; аргумент три – ширина колонны; и аргумент четыре – это имя значения. Это имя должно совпадать с ключами в методе словаря, упомянутого выше, либо свойствам класса, который вы используете (в этом случае, мой класс книги). В противном случае некоторые данные не появятся в виджете.

Если вы хотите узнать о доступе к некоторым данным объекта строки, затем добавьте другую кнопку в это приложение и свяжите его к следующей функции:

def getRowInfo(self, event):
    """"""
    rowObj = self.dataOlv.GetSelectedObject()
    print rowObj.author
    print rowObj.title

Теперь вы можете выбрать строку и использовать метод getSelected ObjectListView, чтобы получить объект строки. После того, как у вас есть, вы можете получить доступ к свойствам объекта, например, автор и название, и все, что вы еще определили. Это намного проще, чем listctrl, где вы должны получить столбец и строку, чтобы найти информацию для каждого элемента.

Это охватывает основы использования объектаListCTRL. Обязательно скачайте источник, так как у него есть куча интересных демонстраций, включая то, что позволяет пользователю редактировать некоторые ячейки с помощью владельца нарисованного Combobox! Я буду писать еще одну статью в ближайшее время, что использует ObjectListView. Он покажет вам, как сохранить и восстановить данные и создать забавное приложение!

Этот код был протестирован с помощью Windows Vista, WxPython 2.8.10.1 (Unicode) и Python 2.5.

Дальнейшее чтение

Загрузки

  • olvDemo.zip
  • ovdemo.tar.