9 мая, 2011

Python GTK (PyGTK) / Диалоги

Пример диалога Диалоговые окна или просто диалоги являются неотъемлемой частью любого современного GUI приложения. Если в реальной жизни слово «диалог» означает разговор между двумя или более людьми, то в компьютерном приложении диалог является окном, используемым для «общения с программой» и наоборот. Диалоги используются для ввода и изменения данных, настройки приложения и т.д. и т.п. Диалог — это средство коммуникации между пользователем и компьютером.

Диалоги-сообщения (Message dialogs)

Диалоги-сообщения (Message dialogs) — это диалоги, позволяющие программе передавать пользователю сообщения. Сообщения состоят из текста и иллюстраций.

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Урок по Python - Диалоги в PyGTK
#
# В этом примере показаны
# диалоги-сообщения
#
# Автор: Jan Bodnar
# Сайт: zetcode.com
# Последнее изменение: 9 мая 2011 года
# Перевод: Даниил Рыжков (http://daniil-r.ru/)
 
import gtk
 
class PyApp(gtk.Window):
    def __init__(self):
        super(PyApp, self).__init__()
 
        self.set_size_request(250, 100)
        self.set_position(gtk.WIN_POS_CENTER)
        self.connect("destroy", gtk.main_quit)
        self.set_title("Сообщения-диалоги")
 
        table = gtk.Table(2, 2, True);
 
        info = gtk.Button("Информация")
        warn = gtk.Button("Предупреждение")
        ques = gtk.Button("Вопрос")
        erro = gtk.Button("Ошибка")
 
        info.connect("clicked", self.on_info)
        warn.connect("clicked", self.on_warn)
        ques.connect("clicked", self.on_ques)
        erro.connect("clicked", self.on_erro)
 
        table.attach(info, 0, 1, 0, 1)
        table.attach(warn, 1, 2, 0, 1)
        table.attach(ques, 0, 1, 1, 2)
        table.attach(erro, 1, 2, 1, 2)
 
        self.add(table)
        self.show_all()
 
    def on_info(self, widget):
        md = gtk.MessageDialog(self,
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO,
            gtk.BUTTONS_CLOSE, "Загрузка завершена")
        md.run()
        md.destroy()
 
    def on_erro(self, widget):
        md = gtk.MessageDialog(self,
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR,
            gtk.BUTTONS_CLOSE, "Ошибка загрузки файла")
        md.run()
        md.destroy()
 
    def on_ques(self, widget):
        md = gtk.MessageDialog(self,
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION,
            gtk.BUTTONS_CLOSE, "Вы уверены, что хотите выйти?")
        md.run()
        md.destroy()
 
    def on_warn(self, widget):
        md = gtk.MessageDialog(self,
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING,
            gtk.BUTTONS_CLOSE, "Запрещенное действие")
        md.run()
        md.destroy()
 
PyApp()
gtk.main()

В этом примере мы отобразим четыре различных вида сообщений: информационные, предупредительные, вопросительные и сообщения об ошибке.

        info = gtk.Button("Информация")
        warn = gtk.Button("Предупреждение")
        ques = gtk.Button("Вопрос")
        erro = gtk.Button("Ошибка")

У нас есть четыре кнопки, каждая из которых отображает свой вид сообщения.

    def on_info(self, widget):
        md = gtk.MessageDialog(self,
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO,
            gtk.BUTTONS_CLOSE, "Загрузка завершена")
        md.run()
        md.destroy()

MESSAGE_INFO задает тип сообщения (в нашем случае информационный).

BUTTONS_CLOSE задает кнопку, которая будет отображена в диалоге (в нашем случае это будет кнопка «закрыть»).

Последний параметр задает отображаемое сообщение. Программа также должна вызвать функции destroy() или hide()

dialog error dialog question

dialog watning dialog info

Диалог о программе (AboutDialog)

Диалог о программе (AboutDialog) показывает информацию о программе. Он может отображать такую информацию как логотип, название приложения, версию, копирайт, адрес веб-сайта и лицензионную информацию. Также возможно указать список авторов, переводчиков и людей, работавших над документацией и оформлением программы. Иконку батареи можно загрузить от сюда (взято из стандартного набора иконок Ubuntu).

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Урок по Python - Диалоги в PyGTK
#
# В этом примере показан
# диалог о программе
#
# Автор: Jan Bodnar
# Сайт: zetcode.com
# Последнее изменение: 9 мая 2011 года
# Перевод: Даниил Рыжков (http://daniil-r.ru/)
 
import gtk
 
class PyApp(gtk.Window):
    def __init__(self):
        super(PyApp, self).__init__()
        self.set_size_request(300, 150)
        self.set_position(gtk.WIN_POS_CENTER)
        self.connect("destroy", gtk.main_quit)
        self.set_title("About battery")
 
        button = gtk.Button("About")
        button.set_size_request(80, 30)
        button.connect("clicked", self.on_clicked)
 
        fix = gtk.Fixed()
        fix.put(button, 20, 20)
 
        self.add(fix)
        self.show_all()
 
    def on_clicked(self, widget):
        about = gtk.AboutDialog()
        about.set_program_name("Батарейка")
        about.set_version("0.1")
        about.set_copyright("(c) Jan Bodnar")
        about.set_comments("Батарейка — простой инструмент для проверки уровня заряда батареи")
        about.set_website("http://www.zetcode.com")
        about.set_logo(gtk.gdk.pixbuf_new_from_file("battery.svg"))
        about.run()
        about.destroy()
 
PyApp()
gtk.main()

Пример показывает некоторые возможности диалога о программе.

about = gtk.AboutDialog()

Мы создали диалог о программе (AboutDialog)…

about.set_program_name("Battery")
about.set_version("0.1")
about.set_copyright("(c) Jan Bodnar")

Задали название, версию и автора программы…

about.set_logo(gtk.gdk.pixbuf_new_from_file("battery.png"))

И, наконец, создали логотип

about error

Диалог выбора шрифта (FontSelectionDialog)

Диалог выбора шрифта (FontSelectionDialog) обычно используется в различных текстовых редакторах.

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Урок по Python - Диалоги в PyGTK
#
# В этом примере показан
# диалог выбора шрифта
#
# Автор: Jan Bodnar
# Сайт: zetcode.com
# Последнее изменение: 9 мая 2011 года
# Перевод: Даниил Рыжков (http://daniil-r.ru/)
 
import gtk
import pango
 
class PyApp(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.set_size_request(330, 150)
        self.set_position(gtk.WIN_POS_CENTER)
        self.connect("destroy", gtk.main_quit)
        self.set_title("Диалог выбора шрифта")
 
        self.label = gtk.Label("Единственная победа в любви — это бегство")
        button = gtk.Button("Выберите шрифт")
        button.connect("clicked", self.on_clicked)
 
        fix = gtk.Fixed()
        fix.put(button, 100, 30)
        fix.put(self.label, 7, 90)
        self.add(fix)
 
        self.show_all()
 
    def on_clicked(self, widget):
        fdia = gtk.FontSelectionDialog("Выберите шрифт")
        response = fdia.run()
 
        if response == gtk.RESPONSE_OK:
            font_desc = pango.FontDescription(fdia.get_font_name())
            if font_desc:
                self.label.modify_font(font_desc)
 
        fdia.destroy()
 
PyApp()
gtk.main()

В этом примере мы создали кнопку и надпись. По нажатию на кнопку появляется диалог выбора шрифта (FontSelectionDialog).

fdia = gtk.FontSelectionDialog("Выберите шрифт")

Мы создали диалог выбора шрифта

if response == gtk.RESPONSE_OK:
    font_desc = pango.FontDescription(fdia.get_font_name())
    if font_desc:
        self.label.modify_font(font_desc)

При нажатии на кнопку «ОК», шрифт надписи смениться на тот, который был выбран в диалоге выбора шрифта.

fontchoose

Диалог выбора цвета (ColorSelectionDialog)

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Урок по Python - Диалоги в PyGTK
#
# В этом примере показан
# диалог выбора цвета
#
# Автор: Jan Bodnar
# Сайт: zetcode.com
# Последнее изменение: 9 мая 2011 года
# Перевод: Даниил Рыжков (http://daniil-r.ru/)
 
import gtk
 
class PyApp(gtk.Window):
    def __init__(self):
        super(PyApp, self).__init__()
 
        self.set_size_request(327, 150)
        self.set_position(gtk.WIN_POS_CENTER)
        self.connect("destroy", gtk.main_quit)
        self.set_title("Color Selection Dialog")
 
        self.label = gtk.Label("Единственная победа в любви — это бегство")
        button = gtk.Button("Выберите цвет")
        button.connect("clicked", self.on_clicked)
 
        fix = gtk.Fixed()
        fix.put(button, 100, 30)
        fix.put(self.label, 7, 90)
        self.add(fix)
 
        self.show_all()
 
    def on_clicked(self, widget):
        cdia = gtk.ColorSelectionDialog("Выберите цвет")
        response = cdia.run()
 
        if response == gtk.RESPONSE_OK:
            colorsel = cdia.colorsel
            color = colorsel.get_current_color()
            self.label.modify_fg(gtk.STATE_NORMAL, color)
 
        cdia.destroy()
 
PyApp()
gtk.main()

Этот пример очень похож на предыдущий. На этот раз мы изменим цвет надписи.

cdia = gtk.ColorSelectionDialog("Выберите цвет")

Мы создаем диалог выбора цвета.

        if response == gtk.RESPONSE_OK:
            colorsel = cdia.colorsel
            color = colorsel.get_current_color()
            self.label.modify_fg(gtk.STATE_NORMAL, color)

Когда пользователь нажимает ОК, цвет надписи меняется.

colorchoose

Перевод с небольшими изменениями опубликован с разрешения автора. Автор статьи: Jan Bodnar, перевод: Даниил Рыжков. Оригинальная статья на сайте автора: http://zetcode.com/tutorials/pygtktutorial/dialogs/