Програмування → Пишемо програми з GUI на PyGTK

PyGTK

Нужен питон-программист…срочно
<#!usr/bin/nah> эм…к сожалению остались только хомяки-дизайнеры

Вирішуючи певні задачі автоматизації та просто спрощення деяких процесів, доволі часто використовуються різного роду скріпти на bash, php, python. Коли скріпт переростає у щось більше ніж 5-10 рядків коду, може виникнути бажання прикрутити до нього GUI (Graphical user interface) — щоб спростити ввід даних і не лякати користувачів голою консолю, якщо пишеш для когось.

Так було і у мене. Спочатку викручувався за допомогою zenity — це інструмент, який дозволяє відображати GTK+ діалогові вікна за допомогою командного рядка (і відповідно з скріптів).  Та з часом цього стає мало, діалоги можна виводити тільки послідовно, а багато речей взагалі неможливо реалізувати.

Тут нас може виручити PyGTK — оболонка на мові програмування Python для бібліотеки GTK+. Вона є вільним програмним забезпеченням, і розповсюджується на умовах ліцензії LGPL.

Python — доволі цікава інтерпретована, об’єктно-орієнтована мова програмування. Вона вважаються досить легкою, але мені після PHP дається трохи важко, та й з документацією на українській чи російській не густо. В процесі свого навчання планую писати такі нотатки, можливо комусь стане в пригоді.

Сьогодні пишемо TimeStamp Converter. Функціонал доволі скромний — перетворення дати в форматі timestamp в зрозумілий нам вигляд і навпаки. Взагалі то для цього є однойменний аддон для Firefox, раніше він відмовлявся працювати з версіями 3 – 3.5, але зараз все уже налагодили. Тому кодимо, як кажуть, jast for fun.

Налаштування робочого середовища

Як завжди, я описую весь процес для Ubuntu. Нам потрібні такі пакети: python, python-gtk2, glade-3.

# sudo aptitude install python python-gtk2 glade-3

Малюємо GUI

Насправді, весь інтерфейс можна описати в коді, але набагато простіше і цікавіше зробити це в glade.

І так, відкриваємо glade і створюємо новий проект в форматі GtkBuilder. Потім в ньому створюємо нове вікно, клацнувши на іконці Вікно панелі Вікна. Якщо ми зараз додамо сюди кнопку, трапиться халепа, вона займе все місце, що нам не підходить. Потрібно розділити робочий простір на частини (примітка: перед тим як створювати інтерфейс в редакторі, краще намалювати собі його на листочку, так значно простіше).

В меню контейнери вибираємо Горизонтальний контейнер й клацаємо на вікні, кількість елементів – 4. В верхній елемент контейнера додаємо Таблицю – 2 рядки і 6 стовпчиків.

Glade GUI - 1

 

Ми додали Таблицю, а не Вертикальний і Горизонтальний контейнери тому, що вона матиме однакову ширину колонок, а це важливо. Додамо Позначки (label) та Поля вводу тексту як на малюнку нижче

Glade GUI - 2

 

Позначкам даємо відповідні імена (поле Позначка), полям вводу тексту вказуємо ширину в символах 5 і даємо назву відповідно до значення (day, month..).

Я тут подумав, якщо так детально описувати кожну дію — буде більше двох сторінок тексту, тому тільки головне. Весь інтерфейс базується на поєднанні Горизонтальних й Вертикальних контейнерів (для краси я додав ще Вирівнювання ). В результаті має вийти така форма 🙂

Glade GUI - 3

Червоним позначено назви елементів, синім — обробник сигналу clicked для кнопок . Його виставляється при виділеній кнопці в закладці Сигнали

Glade GUI - 4

Щоб при закритті вікна (не кнопкою Close, а хрестиком в шапці вікна) програма завершувалася, об’єкту window1 додаємо обробник сигналу destroy — on_cancel.

Ще можна додати діалогове вікно Про програму (Вікна – Діалог “Про програму” ).

Glade GUI - 5

Сигнал response — відповідає за кнопку закрити, призначаємо обробник on_about_close, з полями вікна думаю проблем не буде, все досить зрозуміло.

З GUI все, зберігаємо проект в файл timestamp.glade.

Пишемо код

#!/usr/bin/python
# -*- coding: utf8 -*-
try:
import pygtk
pygtk.require('2.0')
except:
sys.exit(1)
try:
import gtk
import time, datetime
except:
sys.exit(1)

Оголошуємо кодування та завантажуємо необхідні модулі, якщо ж це не вдається — завершуємо роботу.

class Converter(object):
	# Конструктор класу
	def __init__(self):
		self.wTree = gtk.Builder()
		# Завантажуємо наш файл інтерфейсу
		self.wTree.add_from_file("timestamp.glade")
		self.wTree.connect_signals(self)
		self.window1 = self.wTree.get_object("window1")
		# Відображаємо основне вікно
self.window1.show()
# Присвоюємо значенням класу відповідні поля
self.day = self.wTree.get_object("day")
self.month = self.wTree.get_object("month")
self.year = self.wTree.get_object("year")
self.hour = self.wTree.get_object("hour")
self.minutes = self.wTree.get_object("minutes")
self.seconds = self.wTree.get_object("seconds")
self.timestamp = self.wTree.get_object("timestamp")
self.date_label = self.wTree.get_object("date_label")

# Генеруємо timestamp
unixtime = int(time.time())
self.timestamp.set_text(str(unixtime))

# Генеруємо поточну дату
now = datetime.datetime.now()
self.day.set_text(str(now.day))
self.month.set_text(str(now.month))
self.year.set_text(str(now.year))
self.hour.set_text(str(now.hour))
self.minutes.set_text(str(now.minute))
self.seconds.set_text(str(now.second))

# Воточна дата в мітці date_label
self.date_label.set_text(now.strftime("%Y-%m-%d %H:%M:%S"))

# Завантажуємо діалогове вікно про програму
self.aboutdialog1 = self.wTree.get_object("aboutdialog1")
# Обробник події delete-event
self.aboutdialog1.connect("delete-event", self.on_about_close)

def on_cancel(self,widget,data=None):
# Обробник виходу з програми
gtk.main_quit()

Ми оголосили наш основний клас Converter і його конструктор — в якому підключили файл з GUI, призначили поля змінним та завантажили значення по замовчуванню. Також оголосили метод on_cancel — вихід з програми.

Зверніть увагу на обробник події delete-event, він повинен повертати значення true, інакше при наступному виклику, діалогове вікно відобразиться маленьким і без елементів, та згенерується помилка “./timestamp.py:97: GtkWarning: gtk_widget_show: assertion `GTK_IS_WIDGET (widget)’ failed self.aboutdialog1.show()”.

	def on_timestamp(self,widget):
		# Конвертує дату в timestamp
		try:
			unixtime = datetime.datetime.strptime(self.day.get_text()+'-'+self.month.get_text()+'-'+self.year.get_text()+' '+self.hour.get_text()+'-'+self.minutes.get_text()+'-'+self.seconds.get_text(), '%d-%m-%Y %H-%M-%S')
			self.timestamp.set_text(unixtime.strftime("%s"))
			self.date_label.set_text(unixtime.strftime("%Y-%m-%d %H:%M:%S"))
		except:
self.timestamp.set_text('Error')
def on_date(self,widget):
# Конвертує timestamp в дату
try:
now = datetime.datetime.fromtimestamp(int(self.timestamp.get_text()))
self.day.set_text(str(now.day))
self.month.set_text(str(now.month))
self.year.set_text(str(now.year))
self.hour.set_text(str(now.hour))
self.minutes.set_text(str(now.minute))
self.seconds.set_text(str(now.second))

self.date_label.set_text(now.strftime("%Y-%m-%d %H:%M:%S"))
except:
self.day.set_text('err')
self.month.set_text('err')
self.year.set_text('err')
self.hour.set_text('err')
self.minutes.set_text('err')
self.seconds.set_text('err')

Два методи, що безпосередньо займаються конвертацією й присвоюють результат полям.

	def on_about(self,widget):
		# Показує діалогове вікно про програму
self.aboutdialog1.show()
def on_about_close(self,widget, *args):
# Знищує діалогове вікно про програму
# повинна повертути true!
self.aboutdialog1.hide()
return True

Показують і приховують вікно Про програму.

if __name__ == "__main__":
	app = Converter()
	gtk.main()

Безпосередньо запуск.

Ось і все, наш кросплатформенний (має працювати і в Windows) TimeStamp Converter завершено. Архів з кодом можна завантажити нижче.

TimeStamp Converter Linux TimeStamp Converter Windows

timestamp_converter_0.1.tar.gz (3,2 Кб)

Теги: , , , ,
03.10.2009 18:25 Автор: Strange_V Хіти: 1457

Коментарів 9

Напишіть відгук