Python / Знакомство с wxPython. Часть первая. Первые шаги

в 14:47, , рубрики: Новости, метки: , , , , , ,

Python / Знакомство с wxPython. Часть первая. Первые шаги
Доброго времени суток!
Введение

Когда-то я вам уже рассказывал о связке Ruby/Tk. Сегодня я собираюсь продолжить знакомство с «быстрыми интерфейсами». На этот раз я расскажу вам о wxPython, а писать мы будем на Python.
На самом деле, wxPython является лишь обёрткой для библиотеки wxWidgets, который в свою очередь представляет графический тулкит, который позволяет писать кроссплатформенные приложения.
Что же такое xWidgets
wxWidgets (ранее известная как wxWindows) — это кросс-платформенная библиотека инструментов с открытым исходным кодом для разработки кроссплатформенных на уровне исходного кода приложений, в частности для построения графического интерфейса пользователя (GUI).
Она разработана не только для того, чтобы создавать GUI. Она также имеет набор классов для работы с графическими изображениями, HTML, XML документами, архивами, файловыми системами, процессами, подсистемами печати, мультимедиа, сетями, классы для организации многопоточности, отладки, отправки дампов и множество других инструментов.
Итак, приступим

Что же, начнём. А начнём мы по порядку — напишем Hello, World, чтобы понять базовые принципы построения приложения с помощью wxPython. Вот он, пред вами , государь:
import wx

app = wx.App()
wnd = wx.Frame(None, wx.ID_ANY, "I'm the title")
wnd.Show(True)
app.MainLoop()

Вы можете скачать исходный код.
Сначала давайте запустим приложение и посмотрим, что у нас получилось. Сказано — сделано.
Разбор полётов

Хорошо, теперь пора разобраться в том, что делает данный код. Овсянку, сэр!
import wx

Тут всё более, чем очевидно. Тут мы импортируем пакет для работы с wxPython.
app = wx.App()

Здесь происходит создание экземпляра нашей программы, которая впоследствии и будет запущена.
wnd = wx.Frame(None, wx.ID_ANY, "I'm the title")

Думаю, что здесь нам следует немного остановится и посмотреть на код Собственно, здесь мы создаём экземпляр нашей формы (в терминологии wxWidgets это окно).
Давайте посмотрим на заданные параметры.
Parent — наш первый параметр. В данный момент он указывает на то, что это главное окно нашей программы и оно не наследованно от какого-либо другого.

Id — идентификатор, который представляет собой ничто иное, как порядковый номер окна. Здесь нам не обязательно проставлять номера вручную, достаточно лишь указать wx.ID_ANY, который сам обо всём позаботится.

Title — без комментариев… Это заголовок нашего окна.

wnd.Show(True)

Здесь мы указываем на то, что наше окно должно стать видимым.
app.MainLoop()

И, наконец, запускаем нашу программу. Вот и всё…
Начинаем строить

Предполагается, что вы уже ознакомились с Classes Reference и знаете, какие элементы GUI доступны в wxPython. Я предлагаю нам взять и написать что-либо целостное и рабочее. Хорошо. Давайте с вами напишем миниатюрный текстовый редактор.
Добавляем поле для ввода текста

Как вы знаете, текстовое поле в wxPython представленно классом TextCtrl. По умолчанию, текстовое поле, которое мы создаём является однолинейным, т.е. запись текста будет производиться в одну строку.
Давайте исправим это и добавим атрибут style со значением TE_MULTILINE к объекту TextCtrl. Код нашего первого текстового редактора будет выглядеть так:
import wx

class Window(wx.Frame):

def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title = title, size = (300,250))
self.control = wx.TextCtrl(self, style = wx.TE_MULTILINE)
self.Show(True)

app = wx.App()
wnd = Window(None, "pyNote")
app.MainLoop()

Вы можете скачать исходный код.
Давайте запустим нашу программу и убедимся, что всё работает.Примечание: совсем забыл. Хотел добавить, что я предпологаю, что вы знакомы с ООП в Python, т.к. объяснять, что такое self или class Window(wx.Frame) я не собираюсь.
Официант, меню будьте добры

Как-то суховато выглядит наш с вами редактор, да? Конечно, в нём нету даже меню. Давайте исправим положением и создадим меню. В этом нет ничего сложного.
import wx

class Window(wx.Frame):

def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title = title, size = (300,250))
self.control = wx.TextCtrl(self, style = wx.TE_MULTILINE) # создаём текстовое поле
self.Show(True)

menu = wx.Menu() # создаём экземпляр меню
menu.Append(wx.ID_ABOUT,"About","Push the button to get an information about this application") # добавляем подпункты к меню
menu.Append(wx.ID_EXIT,"Exit","Push the button to leave this application") # а как ещё?
bar = wx.MenuBar() # создаём рабочую область для меню
bar.Append(menu,"File") # добавляем пункт меню
self.SetMenuBar(bar) # указываем, что это меню надо показать в нашей форме
app = wx.App()
wnd = Window(None, "pyNote")
app.MainLoop()

Вы можете скачать исходный код.
А вот и наш редактор с меню:
Обработка событий

Но что это? Мы нажимаем «Exit», а программа не завершается. Что же, пора перейти к достаточно важному этапу — научить программу обрабатывать события. Добиться этого можно несколькими способами. Например, вот так:
def __init__(self, parent, title):
self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)

Данное выражение означает, что если мы кликнем пункт «About», то наша программа вызовет функцию OnAbout.
Хорошо, давайте объявим эту функцию. Выглядеть она будет так:
def OnAbout(self, e):
dlg = wx.MessageDialog(self, "This is a mini editor keeping your text","About pyNote", wx.OK) # создаём всплывашку
dlg.ShowModal() # показываем окошко

Вот и всё. Теперь, когда мы ткнём в «About», увидим вот такое сообщение:
Полный код приводить не стану, а скажу лишь, что…
Вы можете скачать исходный код.
Монолог? Нет, диалог!

Не будем забывать, что мы пишем какой-никакой текстовый редактор. Поэтому нам нужно организовать процесс открытия/закрытия файлов. На помощь приходит Чип и Дейл FileDialog. Для начала нам необходимо создать пункт «Open» в меню, по которму будет вызван диалог открытия файла (функция OnOpen).
Теперь нам нужно создать экземпляр FileDialog с некоторыми параметрами. Сейчас всё увидите:
import wx
import os

class Window(wx.Frame):

def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title = title, size = (300,250))
self.control = wx.TextCtrl(self, style = wx.TE_MULTILINE)
self.Show(True)

menu = wx.Menu()
openItem = menu.Append(wx.ID_ANY, "Open", "Push the button to open the file")
aboutItem = menu.Append(wx.ID_ABOUT,"About","Push the button to get an information about this application")
exitItem = menu.Append(wx.ID_EXIT,"Exit","Push the button to leave this application")
bar = wx.MenuBar()
bar.Append(menu,"File")
self.SetMenuBar(bar)
self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)
self.Bind(wx.EVT_MENU, self.OnExit, exitItem)

def OnAbout(self, e):
aboutDlg = wx.MessageDialog(self, "This is a mini editor keeping your text","About pyNote", wx.OK)
aboutDlg.ShowModal()

def OnOpen(self, e):
self.dirname = " "
openDlg = wx.FileDialog(self, "Choose a file to open", self.dirname, " ", "*.*", wx.OPEN) # создаём диалог
if openDlg.ShowModal() == wx.ID_OK: # при выборе файла
self.filename = openDlg.GetFilename() # ловим название файла
self.dirname = openDlg.GetDirectory() # и папку, в которой он находится
f = open(os.path.join(self.dirname,self.filename), "r") # открываем файл
self.control.SetValue(f.read()) # отображаем в текстовом поле
f.close()
wnd.SetTitle(self.filename + " - pyNote") # меняем заголовок окна

app = wx.App()
wnd = Window(None, "pyNote")
app.MainLoop()

Вы можете скачать исходный код.
Вот и всё. Давайте запустим наше творение. И, внимание… Барабанная дробь… Нажимаем на «Open» и видим…
И открываем файл…
Заключение

Вот и всё на данный момент. Сегодня мы познакомились с великолепным тулкитом под названием wxPython, который позволяет писать великолепные приложения с минимальными затратами сил.
Что почитать
wxWidgets — Википедия.Getting Started — wxPyWiki.Официальный сайт wxPython.
Продолжение следует!

Поделиться

* - обязательные к заполнению поля