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

Учебное пособие в WXPYPHON

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

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

Я вызвался написать некоторые учебники на общих макетах GUI в wxpython Отказ Следующий пример пришел от Малкольма, один из членов WXPYPHON Группа пользователя Отказ

Пример: простая форма сбора данных, где значок и текст правильно оправданы вдоль вертикальной оси двоеточия.

Значок – Название разделитель Значок – текст: – однострочное управление ввода Значок – текст: – однострочное управление ввода Значок – текст: – однострочное управление ввода Значок – текст: – Многострочный текстовый/список управление, который растягивается вертикально разделитель ОК – отменить

Во-первых, мы создадим WX.Frame, чтобы содержать все виджеты, и мы создадим WX.Panel до «кожи» кадра, чтобы она выглядела нормально на всех платформах.

import wx

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, title='My Form')

        # Add a panel so it looks correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

Следующим шагом является выяснение, как создать значок. Я буду использовать wx.artprovider для растрового изображения, поскольку он предлагает общие кроссплатформенные растровые изображения/значки, и я помещу растровое изображение в виджете wx.cstaticbitmap. Проверьте пример код ниже:

bmp.artprovider.getbitmap (wx.art_information, wx.art_other, (16, 16)) .staticbitmap (self.panel, wx.id_any, bmp)

Давайте пойдем над тем, что здесь происходит. Первый аргумент для GetBitmap – это арт-идентификатор, второй – клиент (например, wx.art_toolbar или wx.art_menu), а третий – это размер значка. Аргументы StaticBitmap в значительной степени самосвязки. Вы можете увидеть как в действии в WXPYPHON DEMO также.

Далее мы поставим весь код вместе и придерживайтесь их в Sizers. Я буду использовать только Boxsizer только для этого примера.

import wx

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, title='My Form') 

        # Add a panel so it looks correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        bmp = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (16, 16))
        titleIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        title = wx.StaticText(self.panel, wx.ID_ANY, 'My Title')

        bmp = wx.ArtProvider.GetBitmap(wx.ART_TIP, wx.ART_OTHER, (16, 16))
        inputOneIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        labelOne = wx.StaticText(self.panel, wx.ID_ANY, 'Input 1')
        inputTxtOne = wx.TextCtrl(self.panel, wx.ID_ANY, '')

        inputTwoIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        labelTwo = wx.StaticText(self.panel, wx.ID_ANY, 'Input 2')
        inputTxtTwo = wx.TextCtrl(self.panel, wx.ID_ANY, '')

        inputThreeIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        labelThree = wx.StaticText(self.panel, wx.ID_ANY, 'Input 3')
        inputTxtThree = wx.TextCtrl(self.panel, wx.ID_ANY, '')

        inputFourIco = wx.StaticBitmap(self.panel, wx.ID_ANY, bmp)
        labelFour = wx.StaticText(self.panel, wx.ID_ANY, 'Input 4')
        inputTxtFour = wx.TextCtrl(self.panel, wx.ID_ANY, '')

        okBtn = wx.Button(self.panel, wx.ID_ANY, 'OK')        
        cancelBtn = wx.Button(self.panel, wx.ID_ANY, 'Cancel')
        self.Bind(wx.EVT_BUTTON, self.onOK, okBtn)
        self.Bind(wx.EVT_BUTTON, self.onCancel, cancelBtn)

        topSizer        = wx.BoxSizer(wx.VERTICAL)
        titleSizer      = wx.BoxSizer(wx.HORIZONTAL)
        inputOneSizer   = wx.BoxSizer(wx.HORIZONTAL)
        inputTwoSizer   = wx.BoxSizer(wx.HORIZONTAL)
        inputThreeSizer = wx.BoxSizer(wx.HORIZONTAL)
        inputFourSizer  = wx.BoxSizer(wx.HORIZONTAL)
        btnSizer        = wx.BoxSizer(wx.HORIZONTAL)

        titleSizer.Add(titleIco, 0, wx.ALL, 5)
        titleSizer.Add(title, 0, wx.ALL, 5)
        
        inputOneSizer.Add(inputOneIco, 0, wx.ALL, 5)
        inputOneSizer.Add(labelOne, 0, wx.ALL, 5)

        inputOneSizer.Add(inputTxtOne, 1, wx.ALL|wx.EXPAND, 5)

        inputTwoSizer.Add(inputTwoIco, 0, wx.ALL, 5)
        inputTwoSizer.Add(labelTwo, 0, wx.ALL, 5)
        inputTwoSizer.Add(inputTxtTwo, 1, wx.ALL|wx.EXPAND, 5)
        
        inputThreeSizer.Add(inputThreeIco, 0, wx.ALL, 5)
        inputThreeSizer.Add(labelThree, 0, wx.ALL, 5)
        inputThreeSizer.Add(inputTxtThree, 1, wx.ALL|wx.EXPAND, 5)

        inputFourSizer.Add(inputFourIco, 0, wx.ALL, 5)
        inputFourSizer.Add(labelFour, 0, wx.ALL, 5)
        inputFourSizer.Add(inputTxtFour, 1, wx.ALL|wx.EXPAND, 5)

        btnSizer.Add(okBtn, 0, wx.ALL, 5)
        btnSizer.Add(cancelBtn, 0, wx.ALL, 5)

        topSizer.Add(titleSizer, 0, wx.CENTER)
        topSizer.Add(wx.StaticLine(self.panel), 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(inputOneSizer, 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(inputTwoSizer, 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(inputThreeSizer, 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(inputFourSizer, 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(wx.StaticLine(self.panel), 0, wx.ALL|wx.EXPAND, 5)
        topSizer.Add(btnSizer, 0, wx.ALL|wx.CENTER, 5)

        self.panel.SetSizer(topSizer)
        topSizer.Fit(self)
        

    def onOK(self, event):
        # Do something
        print 'onOK handler'
        
    def onCancel(self, event):
        self.closeProgram()

    def closeProgram(self):
        self.Close()


# Run the program
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

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

Итак, как эти сизеры работают в любом случае? Давайте взглянем. Вот основной стиль:

mysizer.add (окно, пропорция, флаг (ы), граница, userdata)

Первый аргумент может быть окном/виджетом, Sizer или размер. Второе – это пропорция, которая позволяет разработчику указать, насколько элемент растягивается, когда родительское окно изменяется. Третий – флаг или серия флагов, которые контролируют выравнивание, границу и изменение размера. Четвертый аргумент является границей, который является количеством пикселей белого пространства вокруг виджета, который был добавлен. Последний – UserData, который я никогда не пользуюсь. Однако, согласно книге «WXPYPHON в действии», он используется для передачи дополнительных данных в Sizer для его алгоритма.

Три битовых флага, которые я использую, являются wx.all, wx.expand и wx.center: wx.all используется для поставок x количества пикселей со всех сторон виджета; WX.EXPAND сообщает Sizer позволить виджету расширяться или растянуть, когда родитель растягивается; WX.Center будет центрировать виджет горизонтально и вертикально в виде виджета.

Как видите, я создал отдельный Boxsizer для любого набора двух или более виджетов, которые необходимы, чтобы быть выровненным рядом друг с другом горизонтально. Я также создал один главный Boxsizer, который был ориентирован по вертикали, чтобы я мог «стекать» другие сизеры в нем. Я также застрял в двух виджетах WX.Staticline в качестве сепараторов в соответствующих местах.

Наконец, я подключаю панель к Topsizer с помощью метода SATSIZER (). Я также решил использовать метод Fit Sizer (), чтобы сообщить Sizer рассчитать размер на основе окна (то есть кадра). Вы также можете настроить его, установив минимальный размер для содержащего виджета, используя метод setminsize ().

Теперь вы узнали основы настройки формы с помощью BoxSizer.

Скачать: Учебник WXPYTHONSIZER

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