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

WXPYPHON: Учебник из волшебника

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

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

В этой статье мы смотрим на виджет WXPYPHON. Нет, это не имеет ничего общего с Дамблдором или Гэндальфом. Вместо этого, именно тот диалог, который вы увидите, когда вы запускаете установщик или установите шаблон. Иногда вы даже увидите их для настройки Mail Merge. Мы охватим два примера в этом руководстве: тот, который довольно прост, а другой – чуть более сложный. Давайте начнем!

Примечание. Код в этой статье был адаптирован из демонстрации WXPYPHON DEMO

Простой волшебник

Когда вам нужно использовать волшебник в WXPYPHON, вы захотите импортировать его в особенности. Вместо того, чтобы просто импортировать WX вам придется сделать это: Импорт wx.wizard Отказ Также обратите внимание, что есть два первичных типа мастера страниц: WizardPageiMple и PywizardPage. Первый самый легкий, поэтому мы будем использовать это в нашем простом примере. Вот код:

import wx
import wx.wizard as wiz

########################################################################
class TitledPage(wiz.WizardPageSimple):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent, title):
        """Constructor"""
        wiz.WizardPageSimple.__init__(self, parent)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)
        
        title = wx.StaticText(self, -1, title)
        title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
        sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
        sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, 5)
        
#----------------------------------------------------------------------
def main():
    """"""
    wizard = wx.wizard.Wizard(None, -1, "Simple Wizard")
    page1 = TitledPage(wizard, "Page 1")
    page2 = TitledPage(wizard, "Page 2")
    page3 = TitledPage(wizard, "Page 3")
    page4 = TitledPage(wizard, "Page 4")
    
    wx.wizard.WizardPageSimple.Chain(page1, page2)
    wx.wizard.WizardPageSimple.Chain(page2, page3)
    wx.wizard.WizardPageSimple.Chain(page3, page4)
    wizard.FitToPage(page1)
    
    wizard.RunWizard(page1)
    
    wizard.Destroy()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    main()
    app.MainLoop()

Это справедливый бит кода. Давайте возьмем часть и посмотрим, сможем ли мы понять это. Во-первых, мы импортируем WX и волшебник, который мы переименовываем «Wiz», чтобы сохранить на клавише. Далее мы создаем Itlededpage класс, который подклассы Мастера Отказ Этот класс будет основой для всех страниц в нашем мастере. Он в основном просто определяет страницу, которая имеет центрированный заголовок в 18 точечном шрифте с линией внизу.

В Главная Функция мы находим настоящее мясо. Здесь мы создаем мастер, используя следующий синтаксис: wx.wizard.wizard (нет, -1, “простой волшебник”) Отказ Это дает мастер родителя None, идентификатор и название. Затем мы создаем четыре страницы, которые являются экземплярами Itlededpage Класс, который мы упоминали ранее. Наконец, мы используем wx.wizard.wizardPageiMple.Chain цепить страницы вместе. Это позволяет нам использовать пару автоматически сгенерированных кнопок на страницу вперед и назад через страницы. Последние пару строк кода будут запустить мастер, а когда выполняется пользователь, уничтожит мастер. Довольно просто, верно? Теперь давайте перейдем к более продвинутому примеру.

Использование PywizardPage.

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

import images
import wx
import wx.wizard as wiz

########################################################################
class TitledPage(wiz.WizardPageSimple):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent, title):
        """Constructor"""
        wiz.WizardPageSimple.__init__(self, parent)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer = sizer
        self.SetSizer(sizer)
        
        title = wx.StaticText(self, -1, title)
        title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
        sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
        sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, 5)

########################################################################
class UseAltBitmapPage(wiz.PyWizardPage):
    
    #----------------------------------------------------------------------
    def __init__(self, parent, title):
        wiz.PyWizardPage.__init__(self, parent)
        self.next = self.prev = None
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        
        title = wx.StaticText(self, label=title)
        title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
        self.sizer.Add(title)
        
        self.sizer.Add(wx.StaticText(self, -1, "This page uses a different bitmap"),
                       0, wx.ALL, 5)
        self.sizer.Layout()

    #----------------------------------------------------------------------
    def SetNext(self, next):
        self.next = next

    #----------------------------------------------------------------------
    def SetPrev(self, prev):
        self.prev = prev

    #----------------------------------------------------------------------
    def GetNext(self):
        return self.next

    #----------------------------------------------------------------------
    def GetPrev(self):
        return self.prev

    #----------------------------------------------------------------------
    def GetBitmap(self):
        # You usually wouldn't need to override this method
        # since you can set a non-default bitmap in the
        # wxWizardPageSimple constructor, but if you need to
        # dynamically change the bitmap based on the
        # contents of the wizard, or need to also change the
        # next/prev order then it can be done by overriding
        # GetBitmap.
        return images.WizTest2.GetBitmap()
    
#----------------------------------------------------------------------
def main():
    """"""
    wizard = wiz.Wizard(None, -1, "Dynamic Wizard", 
                        images.WizTest1.GetBitmap())
    page1 = TitledPage(wizard, "Page 1")
    page2 = TitledPage(wizard, "Page 2")
    page3 = TitledPage(wizard, "Page 3")
    page4 = UseAltBitmapPage(wizard, "Page 4")
    page5 = TitledPage(wizard, "Page 5")
        
    wizard.FitToPage(page1)
    page5.sizer.Add(wx.StaticText(page5, -1, "\nThis is the last page."))
    
    # Set the initial order of the pages
    page1.SetNext(page2)
    page2.SetPrev(page1)
    page2.SetNext(page3)
    page3.SetPrev(page2)
    page3.SetNext(page4)
    page4.SetPrev(page3)
    page4.SetNext(page5)
    page5.SetPrev(page4)

    wizard.GetPageAreaSizer().Add(page1)
    wizard.RunWizard(page1)
    wizard.Destroy()
    
#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    main()
    app.MainLoop()

Этот код запускается так же, как и предыдущий код. В этом примере мы также импортируем Изображения Модуль, который содержит пару PEEMBedDedImage Объекты, которые мы будем использовать, чтобы продемонстрировать, как добавить растровые карты на нашу страницу Wizard. В любом случае, первый класс точно такой же, как предыдущий. Далее мы создаем Usealttbitmappage класс, который является подклассом PywizardPage Отказ Мы должны переопределить несколько методов, чтобы сделать его правильно, но они довольно неясно. Эта страница будет просто использована для изменения растрового изображения одной страницы.

В Главная Функция, мы создаем волшебник немного по-другому, чем ранее:

wizard = wiz.Wizard(None, -1, "Dynamic Wizard", images.WizTest1.GetBitmap())

Как видите, этот метод позволяет нам добавлять растровое изображение, которое появится вдоль левой стороны страниц мастера. Во всяком случае, после этого мы создаем пять страниц с четырьмя из них, будучи экземплярами Itlededpage и один из них есть экземпляр Usealttbitmappage Отказ Мы подходим мастер на страницу один, а затем мы видим что-то странное:

page5.sizer.Add(wx.StaticText(page5, -1, "\nThis is the last page."))

Что это делает? Ну, это глупый способ добавить виджет на страницу. Чтобы пользователь узнал, что они достигли последней страницы, мы добавляем Statictext Экземпляр к нему, что явно говорят, что они достигли конца. Следующие несколько строк настроили заказ страниц, используя Setnext и Сетприев Отказ Хотя эти методы дают вам больше гранулируемого контроля за порядком страниц, они не так удобны, как WizardPageiMple.Chain метод. Последние несколько строк кода такие же, как предыдущий пример.

Совет бонуса: как решить кнопки мастера

Создавая эту статью, кто-то на самом деле спрашивает, как изменить ярлыки кнопки мастера на официальном Список рассылки wxpython Отказ Таким образом, для полноты, мы возьмем решение Robin Dunn и покажем, как изменить как предыдущие, так и на этикетки следующей кнопки.

prev_btn = self.FindWindowById(wx.ID_BACKWARD)
prev_btn.SetLabel("Foo")
next_btn = self.FindWindowById(wx.ID_FORWARD) 
next_btn.SetLabel("Bar")

Обертывание

Теперь вы знаете, как создать два типа волшебников, которые включены в WxPython. Вы также узнали веселый взлом, чтобы изменить этикетки кнопок в мастере. Дайте мне знать, если вы думаете, что что-то забыл, и я буду обновлять сообщение или написать последующее наблюдение.

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

Исходный код

  • wxWizards.zip
  • wxwizards.tar.tar.tar.tar.