Pull to refresh

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

Python *
Доброго времени суток!

image

Введение


Когда-то я вам уже рассказывал о связке 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 это окно).
Давайте посмотрим на заданные параметры.
  1. Parent — наш первый параметр. В данный момент он указывает на то, что это главное окно нашей программы и оно не наследованно от какого-либо другого.
  2. Id — идентификатор, который представляет собой ничто иное, как порядковый номер окна. Здесь нам не обязательно проставлять номера вручную, достаточно лишь указать wx.ID_ANY, который сам обо всём позаботится.
  3. 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.OnOpen, openItem)
        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.
wxPython on Zetcode.

Продолжение следует!
Tags:
Hubs:
Total votes 65: ↑59 and ↓6 +53
Views 53K
Comments Comments 59