Разберем создание интерфейса на pygtk на примере самого примитивного калькулятора. Много картинок, немного кода.
gtkbuilder наиболее прогрессивный формат описания gtk интерфейса в xml,
если вы ранее использовали libglade, вы можете сконфертировать .glade файл в новый формат командой libglade-convert
Всё это может работать под windows, вам нужно установить pygtk и все нужные библиотеки; в дальнейшем, вы сможете упаковывать всё с помощью py2exe.
Запускаем glade-3
Создаем окно, помещаем в него таблицу
В верхнюю левую ячейку вставляем Entry, в packing выставляем right
attachment-4, чтобы растянуть её на 4 колонки
В general выставляем Editable: No
Для window1 в signals вводим в key-press-event «key_press»;
в destroy — «quit»(чтобы при закрытии окна, мы выходили из программы)
key_press и quit это название методов в нашем коде, которые будут
вызываться при совершении определенных действий, в данном случае — нажатию кнопки и закрытии окна.
Добавляем кнопочки
Остальные мы сгенерируем в коде.
Для всех кнопок, кроме "=" и сброса выставляем signals/clicked «put_text»
Для "=" — «calculate», для сброса — «reset»
Выставляем common/accelerators для кнопочек, чтобы clicked у нас вызывался
при нажатии соотв. клавиш, для "=" это будет "=" и Return, для сброса не
выставляем ничего(мы хотим Escape и сделаем это в коде)
Сохраняем в файл demo.ui
Пишем код
Если возникают вопросы — запускаем «devhelp» и читаем документацию
Обратите внимание на EntryDescriptor — это питоновский дескриптор, который
позволяет нам гораздо удобнее работать со значениями в gtk.Entry
Остальное должно быть понятно из комментариев
Примечание: калькулятор работает с целыми числами и целочисленным делением,
т.е. 5/2 = 2:) Это статья про создание интерфейса, всё остальное я сделал
максимально просто, чтобы не отвлекало.
demo.py
demo.ui
Запускаем python demo.py:
Если тема интересна, в следующей статье я думаю описать создание браузера на базе pygtk и pywebkitgtk, для которого можно писать расширения на python в т.ч. в интерактивной консоли(ipython); интеграцией python и javascript.
gtkbuilder наиболее прогрессивный формат описания gtk интерфейса в xml,
если вы ранее использовали libglade, вы можете сконфертировать .glade файл в новый формат командой libglade-convert
Всё это может работать под windows, вам нужно установить pygtk и все нужные библиотеки; в дальнейшем, вы сможете упаковывать всё с помощью py2exe.
Запускаем glade-3
Создаем окно, помещаем в него таблицу
В верхнюю левую ячейку вставляем Entry, в packing выставляем right
attachment-4, чтобы растянуть её на 4 колонки
В general выставляем Editable: No
Для window1 в signals вводим в key-press-event «key_press»;
в destroy — «quit»(чтобы при закрытии окна, мы выходили из программы)
key_press и quit это название методов в нашем коде, которые будут
вызываться при совершении определенных действий, в данном случае — нажатию кнопки и закрытии окна.
Добавляем кнопочки
Остальные мы сгенерируем в коде.
Для всех кнопок, кроме "=" и сброса выставляем signals/clicked «put_text»
Для "=" — «calculate», для сброса — «reset»
Выставляем common/accelerators для кнопочек, чтобы clicked у нас вызывался
при нажатии соотв. клавиш, для "=" это будет "=" и Return, для сброса не
выставляем ничего(мы хотим Escape и сделаем это в коде)
Сохраняем в файл demo.ui
Пишем код
Если возникают вопросы — запускаем «devhelp» и читаем документацию
Обратите внимание на EntryDescriptor — это питоновский дескриптор, который
позволяет нам гораздо удобнее работать со значениями в gtk.Entry
Остальное должно быть понятно из комментариев
Примечание: калькулятор работает с целыми числами и целочисленным делением,
т.е. 5/2 = 2:) Это статья про создание интерфейса, всё остальное я сделал
максимально просто, чтобы не отвлекало.
#!/usr/bin/env python # coding: utf-8 # vim: ai ts=4 sts=4 et sw=4 import gtk import os class EntryDescriptor(object): def __init__(self, object_name): self.object_name = object_name def __get__(self, obj, cls): return obj.get_object(self.object_name).get_text() def __set__(self, obj, value): obj.get_object(self.object_name).set_text(value) class Calculator(gtk.Builder): def __init__(self): super(Calculator, self).__init__() # загружаем demo.ui self.add_from_file(os.path.join(os.path.dirname(__file__),'demo.ui')) # подключаем обработчики сигналов, описанные в demo.ui к объекту self self.connect_signals(self) # создаем группу горячих клавишь, для клавиш с цифрами и подключаем её к окну agroup = gtk.AccelGroup() self.window1.add_accel_group(agroup) # создаем кнопочки, вешаем на них горячии клавиши и помещаем их в table1 for i in xrange(10): btn = gtk.Button(str(i)) btn.connect('clicked', self.put_text) btn.add_accelerator('clicked', agroup, ord(str(i)), 0, 0) y, x = i / 3, i % 3 self.table1.attach(btn, x, x+1, y+1, y+2) # показываем окно и все виджеты на нем self.window1.show_all() def __getattr__(self, attr): # удобней писать self.window1, чем self.get_object('window1') obj = self.get_object(attr) if not obj: raise AttributeError('object %r has no attribute %r' % (self,attr)) setattr(self, attr, obj) return obj # питоновский дескриптор, который позволяет нам гораздо удобнее работать со значениями в gtk.Entry expr = EntryDescriptor('entry1') def calculate(self, widget=None): if not self.expr: return try: self.expr = str(eval(self.expr)) except Exception, e: # мы можем заделить на ноль и т.п. print e def reset(self, widget): self.expr = '' def quit(self, widget): gtk.main_quit() def put_text(self, widget): text = widget.get_label() expr = self.expr if not expr[-1:].isdigit() and not text.isdigit(): # чтобы нельзя было написать 8/*2 и т.п. return self.expr += text def key_press(self, widget, event): # получаем название кнопки из её кода key = gtk.gdk.keyval_name(event.keyval) if key == 'BackSpace': if self.expr: self.expr = self.expr[:-1] elif key == 'Escape': self.reset(None) if __name__ == '__main__': calculator = Calculator() gtk.main()
demo.py
demo.ui
Запускаем python demo.py:
Если тема интересна, в следующей статье я думаю описать создание браузера на базе pygtk и pywebkitgtk, для которого можно писать расширения на python в т.ч. в интерактивной консоли(ipython); интеграцией python и javascript.