Python. Пишем PageRankChecker
Вопрос на засыпку: что объединяет все мои предыдущие статьи по программированию, за исключением того что они посвящены питону? Правильно: все разобранные примеры написаны для консоли. Попробую разнообразить тематику статей – разберем написание программы с графическим интерфейсом. В качестве примера напишем определитель PR (PageRank) сайтов, а то на меня постоянно просят ввести символы с картинки (на определитель PR вообще продают за 5$).
Для питона существует большое количество кроссплатформенных графических библиотек. Основные из них: Tkinter – поставляется вместе с python, wxPython – расширение для wxWidgets (возможно, займет место Tkinter в следующих версия python), PyQt – обертка популярной библиотеки Qt, и другие (PyGtk, PyFLTK, FXpy, PyOpenGL).
Для простоты усвоения материала рассмотрим написание программы, которая по адресу сайта будет выводить его PageRank. За основу возьмем библиотеку wxPython, как наиболее перспективную (скачать можно по адресу http://www.wxpython.org/download.php#stable ). В качестве IDE буду использовать BoaConstructor (скачивать по адресу http://boa-constructor.sourceforge.net/Download.html ).
Итак, запускаем свежеустановленный BoaConstructor и наблюдаем на экране 3 рабочих окна: основное окно с компонентами, инспектор объектов и редактор. Затем создадим новое графическое приложение – на вкладке основного окна «New» находим wx.App и кликаем по нему.

В окне редактора появятся сразу два новых файла: файл приложения App1.py и файл окна Frame1. После сохранения их в отдельный каталог, приложение можно запустить, нажав на желтый треугольник.

Появится пустая форма с заголовком Frame1. Убедившись что все работает как надо, вернемся к проектированию элементов формы и запустим Frame Designer.

Появится пустая форма, на которую можно размещать элементы управления из главного окна. В нашем случае нам понадобятся: с панели Basic Controls – 2-а StaticText и 1 TextCtrl; с панели Buttons – 2-е кнопки Button; и для красоты с той же панели Basic Controls один компонент StaticBitmap. Для создания событий нажатия кнопок дважды щелкнем на каждой из них. Закроем форму, так как проектирование интерфейса уже закончено. Код фрейма заметно изменился.
#Boa:Frame:Frame1 import wx def create(parent): return Frame1(parent) [wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1STATICBITMAP1, wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, wxID_FRAME1TEXTCTRL1, ] = [wx.NewId() for _init_ctrls in range(7)] class Frame1(wx.Frame): def _init_ctrls(self, prnt): # generated method, don't edit wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt, pos=wx.Point(275, 213), size=wx.Size(853, 467), style=wx.DEFAULT_FRAME_STYLE, title='Frame1') self.SetClientSize(wx.Size(853, 467)) self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1, label='staticText1', name='staticText1', parent=self, pos=wx.Point(128, 24), size=wx.Size(75, 17), style=0) self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2, label='staticText2', name='staticText2', parent=self, pos=wx.Point(312, 56), size=wx.Size(75, 17), style=0) self.textCtrl1 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL1, name='textCtrl1', parent=self, pos=wx.Point(232, 24), size=wx.Size(80, 27), style=0, value='textCtrl1') self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='button1', name='button1', parent=self, pos=wx.Point(144, 112), size=wx.Size(85, 29), style=0) self.button1.Bind(wx.EVT_BUTTON, self.OnButton1Button, id=wxID_FRAME1BUTTON1) self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label='button2', name='button2', parent=self, pos=wx.Point(288, 112), size=wx.Size(85, 29), style=0) self.button2.Bind(wx.EVT_BUTTON, self.OnButton2Button, id=wxID_FRAME1BUTTON2) self.staticBitmap1 = wx.StaticBitmap(bitmap=wx.NullBitmap, id=wxID_FRAME1STATICBITMAP1, name='staticBitmap1', parent=self, pos=wx.Point(48, 208), size=wx.Size(16, 16), style=0) def __init__(self, parent): self._init_ctrls(parent) def OnButton1Button(self, event): event.Skip() def OnButton2Button(self, event): event.Skip()
Глядя на него, несложно догадаться где нужно подправить, чтобы получить нужные надписи на элементах управления. А нужны нам следующие надписи: в заголовке формы – «CheckPR», на кнопках – «Clear» и «Check», статические надписи – одна пустая (для вывода результатов), а на другой – «URL», ну и, конечно, содержимое поля ввода TextCtrl1 пустое. Для того что бы на форме появилась картинка, нужно поместить эту картинку в папку с файлами программы, в описании StaticBitmap1 заменить bitmap=wx.NullBitmap на bitmap=wx.Bitmap(«Имя картинки.jpg») и, конечно, изменить размеры компонента под размеры картинки.
Поместим в каталог программы модуль (назовем его gpr.py), в который поместим функционал для определения PageRank (можно взять из материалов статьи про злобоскрипт) и подключим его в начале Frame1.py: import gpr.
Осталось задать реакцию в Frame1.py на нажатия кнопок.
def OnButton1Button(self, event): # очищаем поле ввода URL self.textCtrl1.SetValue('') def OnButton2Button(self, event): # записываем содержимое поля ввода URL в переменную url url = self.textCtrl1.GetValue() # с помощ подключенной библиотеки определяем PageRank pr = gpr.get_pagerank(url) # выводим полученный результат на компонент staticText2 self.staticText2.SetLabel(pr)
Результаты работы программы:

Исходный код можно прилагается. Жду отзывов и пожеланий.
P.S. Пример легко можно улучшить: например, сделать возможным определение PR сразу для нескольких сайтов; прикрутить определение ТиЦ и т.д.
Written by: Toly
WWW: http://toly-blog.ru
Исходник прилагается:
| Вложение | Размер |
|---|---|
| CheckPR_source.zip | 6.93 КБ |
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 1796 просмотров



Комментарии
3 комментария(ев)Дата: ПТ, 11/02/2011 - 01:48
Очень полезно и познавательно. Больше тут мне нечего добавить. Как только появится время - обязательно попробую.
Дата: СР, 05/10/2011 - 19:55
Как запустить BoaConstructor??? (На Win7)
Дата: СР, 05/10/2011 - 20:45
Разобрался, качаем BoaConstructor для Windows 7 от сюда ]]>BoaConstructor]]>, и забываем о проблемах.