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

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

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

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

Если вы новичок в WxPython, но не новичок в XML, вы можете найти эту статью полезную для вас. Почему? Поскольку WXPYPHON поддерживает XRC, файл файла XML, который описывает GUI в XML, DUH. Фактически, пакет документации WXPYPHON & DEMOS включает в себя редактор только для создания и манипулирования этими файлами, которые называются, Xrced. Эта статья приведет вас в путешествие, чтобы увидеть функции XRCEN и общего использования.

Один запутанный аспект XRCED заключается в том, что он раньше был проектом, отделенным от Wxpython, и его сайт все еще существует здесь Отказ Мне сказали, что старая версия этого веб-сайта очень хорошо работает с помощью читателей экрана по сравнению с новой версией, которая отправляется с демонстрацией демонстрации. Поэтому, если у вас возникают проблемы, вы можете найти эту версию более подходящей. Конечно, старая версия не была обновлена с 2007 года … так что выберите свой яд.

Начиная

Как только у вас установлено демонстрация демонстрации, запустите инструмент под названием Редактор ресурсов XRC Отказ Вы должны увидеть что-то вроде вышеперечисленного. Это два экрана интерфейса с главным экраном слева и экран виджета справа. Чтобы начать, мы должны сделать простое приложение!

Создание нашего первого приложения

Давайте создадим простое приложение для двух кнопок с помощью xrced. Это ничего не сделает, но это покажет вам, как сделать быстрый графический интерфейс. Откройте XRCED и в окне виджета (ниже) Нажмите кнопку WXFRAME.

Вы должны увидеть безымянный WXFrame появляться в правильном приложении как корневой в виде дерева виджета (см. Скриншот в начале раздела). Для этого примера мы собираемся дать кадр имя «мэйнфрейм». Теперь с рамой, выбранной в дереве, добавьте панель под названием «MainPanel». Далее на втором плавающем экране есть ряд кнопок вдоль верхней части. Нажмите четвертую слева, тот, который выглядит как несколько красных прямоугольников, а затем выбирайте Boxsizer One (убедитесь, что объект панели сначала выделен на другом экране).

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



  
    
      
        
          
            
          
        
        
          
            
          
        
        wxHORIZONTAL
      
    
  

Это шокирующее, но XRCED фактически производит простые в чтении XML-кода. Теперь нам просто нужно выяснить, как загрузить XML с wxpython. К счастью, это на самом деле довольно легко. Проверь это:

import wx
from wx import xrc

class MyApp(wx.App):
    def OnInit(self):
        self.res = xrc.XmlResource("twoBtns.xrc")
        
        self.frame = self.res.LoadFrame(None, 'MainFrame')
        
        self.frame.Show()
        return True
        
if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

Чтобы загрузить XML, нам нужно импортировать модуль XRC из WX. Затем мы загружаем XML со следующей строкой: xrc.clresource (“Twobtns.xrc”) Отказ Обратите внимание, что мы должны были пройти во имя (или путь) файла XRC. Вам, вероятно, нужно будет изменить его на то, что вы назвали вашей копией. Затем загрузить рамку, мы называем объект ресурса XML LoadFrame Метод, передача его нет (то есть нет родителей), а имя, которое мы дали кадр в файле XRC. Вот где это действительно легко допустить ошибку. Вы должны ввести имя виджета в код Python точно так же, как вы сделали в файле XRC, или он не будет работать (или он может работать, но не так, как вы ожидаете). Да, имя чувствительно к регистру. Во всяком случае, когда это сделано, вы просто делаете то, что вы обычно делаете в файле WXPYPHON.

Создавая что-то более сложное

Пример в предыдущем разделе – это довольно голые кости. Давайте посмотрим, как мы можем создать часть приложения в XRC и частью его в wxpython. На скриншоте выше, у нас есть ноутбук с двумя страницами и планшета под ним. Ноутбук, рамка и панель все изготавливаются в XRC, в то время как пластинчатая панель просто нормальная WX. Вот XML:

XML? WxVertical WXALL | WXEXPAND 5 XRC Notebook Demo.

Теперь давайте добавим панельБуттон:

import wx
from wx import xrc
import wx.lib.platebtn as platebtn

class MyApp(wx.App):
    def OnInit(self):
        self.res = xrc.XmlResource("notebook2.xrc")
        
        frame = self.res.LoadFrame(None, 'DemoFrame')
        panel = xrc.XRCCTRL(frame, "DemoPanel")
        notebook = xrc.XRCCTRL(panel, "DemoNotebook")
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        btn = platebtn.PlateButton(panel, label="Test", 
                                   style=platebtn.PB_STYLE_DEFAULT)
        btn.Bind(wx.EVT_BUTTON, self.onButton)
        sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
        sizer.Add(btn)
        panel.SetSizer(sizer)
        
        frame.Show()
        return True
    
    #----------------------------------------------------------------------
    def onButton(self, event):
        """"""
        print "You pressed the button!"
        
if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

Как видите, это было так же просто, как и создать приложение на простом Wxpython. Если бы был WX.Button, определенный в XRC, мы сделаем то же самое, что мы сделали для панели, чтобы создать ее ручку. Как только у нас была ручка, мы могли бы связать события к кнопке, как обычно.

Использование xrced для генерации кода Python

Приложение XRCED включает генератор кода Python, который мы можем подкласс для нашего собственного кода. Для начала мы будем использовать первый простой пример в этой статье, а затем расширим этот пример и покажу вам, как связать события. В xrced загрузите первый пример, а затем перейдите в файл, генерируйте Python. Примите значения по умолчанию и нажмите на Генерировать модуль кнопка. Теперь у вас должен быть какой-то автоматический код, который выглядит так:

# This file was automatically generated by pywxrc.
# -*- coding: UTF-8 -*-

import wx
import wx.xrc as xrc

__res = None

def get_resources():
    """ This function provides access to the XML resources in this module."""
    global __res
    if __res == None:
        __init_resources()
    return __res




class xrcMainFrame(wx.Frame):
#!XRCED:begin-block:xrcMainFrame.PreCreate
    def PreCreate(self, pre):
        """ This function is called during the class's initialization.
        
        Override it for custom setup before the window is created usually to
        set additional window styles using SetWindowStyle() and SetExtraStyle().
        """
        pass
        
#!XRCED:end-block:xrcMainFrame.PreCreate

    def __init__(self, parent):
        # Two stage creation (see http://wiki.wxpython.org/index.cgi/TwoStageCreation)
        pre = wx.PreFrame()
        self.PreCreate(pre)
        get_resources().LoadOnFrame(pre, parent, "MainFrame")
        self.PostCreate(pre)

        # Define variables for the controls, bind event handlers





# ------------------------ Resource data ----------------------

def __init_resources():
    global __res
    __res = xrc.EmptyXmlResource()

    __res.Load('twoBtns.xrc')

Это немного уродливая, но если вы можете прочитать нормальный wxpython, то вы сможете понять это. Теперь давайте создадим подкласс этого кода. Основная причина, по которой мы хотим сделать это, так что мы можем изменить файл XRC, а последующий сгенерированный код, и наш подкласс может в основном просто оставаться прежним. Это помогает нам отделить модель (XML) с вида (код WXPYPHON). Во всяком случае, вот простой пример:

# twoBtns_xrc_subclass.py

import twoBtns_xrc
import wx

########################################################################
class XrcFrameSubClass(twoBtns_xrc.xrcMainFrame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        twoBtns_xrc.xrcMainFrame.__init__(self, parent=None)
        self.Show()
        
if __name__ == "__main__":
    app = wx.App(False)
    frame = XrcFrameSubClass()
    app.MainLoop()

Обратите внимание, что мы импортируем модуль «TWOBTNS_XRC», который аналогичен тому, что я позвонил XRCFile. XRCED добавляет часть «_XRC» на имя файла Python. Как только мы импортируем, мы можем получить доступ к объекту кадра XRC и подклассьте его. Этот пример довольно скучно, так что давайте добавим некоторые события. Восстановите файл XRC в xrced и выберите одну из кнопок. Последняя вкладка слева должна быть помечена Код Отказ Выберите этот и поставьте галочку рядом с событием EVT_BUTTON. Сделайте то же самое для другой кнопки. Сохраните файл, а затем восстановите файл Python. У вас должно быть что-то подобное:

# This file was automatically generated by pywxrc.
# -*- coding: UTF-8 -*-

import wx
import wx.xrc as xrc

__res = None

def get_resources():
    """ This function provides access to the XML resources in this module."""
    global __res
    if __res == None:
        __init_resources()
    return __res




class xrcMainFrame(wx.Frame):
#!XRCED:begin-block:xrcMainFrame.PreCreate
    def PreCreate(self, pre):
        """ This function is called during the class's initialization.
        
        Override it for custom setup before the window is created usually to
        set additional window styles using SetWindowStyle() and SetExtraStyle().
        """
        pass
        
#!XRCED:end-block:xrcMainFrame.PreCreate

    def __init__(self, parent):
        # Two stage creation (see http://wiki.wxpython.org/index.cgi/TwoStageCreation)
        pre = wx.PreFrame()
        self.PreCreate(pre)
        get_resources().LoadOnFrame(pre, parent, "MainFrame")
        self.PostCreate(pre)

        # Define variables for the controls, bind event handlers

        self.Bind(wx.EVT_BUTTON, self.OnButton_okBtn, id=xrc.XRCID('okBtn'))
        self.Bind(wx.EVT_BUTTON, self.OnButton_cancelBtn, id=xrc.XRCID('cancelBtn'))

#!XRCED:begin-block:xrcMainFrame.OnButton_okBtn
    def OnButton_okBtn(self, evt):
        # Replace with event handler code
        print "OnButton_okBtn()"
#!XRCED:end-block:xrcMainFrame.OnButton_okBtn        

#!XRCED:begin-block:xrcMainFrame.OnButton_cancelBtn
    def OnButton_cancelBtn(self, evt):
        # Replace with event handler code
        print "OnButton_cancelBtn()"
#!XRCED:end-block:xrcMainFrame.OnButton_cancelBtn        




# ------------------------ Resource data ----------------------

def __init_resources():
    global __res
    __res = xrc.EmptyXmlResource()

    __res.Load('twoBtns_v2.xrc')

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

# twoBtns_xrc_subclass_v2.py

from twoBtns_xrc_v2 import xrcMainFrame
import wx

########################################################################
class XrcFrameSubClass(xrcMainFrame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        xrcMainFrame.__init__(self, parent=None)
        self.Show()
        
    #----------------------------------------------------------------------
    def OnButton_okBtn(self, event):
        """"""
        print "You pressed the OK button!"
        
    #----------------------------------------------------------------------
    def OnButton_cancelBtn(self, event):
        """"""
        print "You pressed the Cancel button!"
        
if __name__ == "__main__":
    app = wx.App(False)
    frame = XrcFrameSubClass()
    app.MainLoop()

Теперь мы можем переопределить события кнопки. Это означает, что все кнопки создания и связывание событий выполняются для нас автоматически XRCED. Все, что нам нужно сделать, это подкласс сгенерированного кода Python и плоти из обработчиков событий. Возможно, вы заметили, что параметр также есть опция «GetText Strings». Вы можете использовать это для создания функции, которая вернет все этикетки в свой код. Почему вы хотите это сделать? Ну, вам легко переводить этикетки на другие языки. Увидеть wxpython Страница Wiki по интернационализации для дополнительной информации.

Обертывание

Это охватывает основы использования приложения XRECED. Надеюсь, вы достаточно знаете достаточно сейчас, чтобы использовать его с умом и сможете создать некоторые по-настоящему удивительному коду, используя эти ярлыки. Если вам нужна помощь, обязательно проверьте ссылки в следующем разделе, отправьте сообщение по электронной почте WXPYPHON MATINGING или попробуйте Bugging Peail WX на канале IRC.

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