<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF109%3APython</id>
		<title>LXF109:Python - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF109%3APython"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF109:Python&amp;action=history"/>
		<updated>2026-05-13T23:36:41Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF109:Python&amp;diff=8649&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF109:Python&amp;diff=8649&amp;oldid=prev"/>
				<updated>2009-09-02T09:31:47Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''Hardcore Linux''' Проверь себя на крутом проекте для продвинутых пользователей &lt;br /&gt;
&lt;br /&gt;
==''Python'': Создаем GUI для ''Festival''==&lt;br /&gt;
&lt;br /&gt;
: ''Python'' и ''Qt'' идеальны для быстрой разработки приложений. '''Грэм Моррисон''' докажет это, используя новейшие технологии KDE и примерно 60 строк кода.&lt;br /&gt;
&lt;br /&gt;
В прошлом месяце мы связали ''Python'' и синтезатор речи ''Festival'' для создания читалки RSS, озвучивавшей слова из RSS-ленты. Если вы прошли тот урок полностью, то уже знаете, что ''Festival'' – синтезатор достойный, но образцом дружелюбия к пользователю не является. Даже простейшие задачи, вроде печати слов и их последующего чтения,&lt;br /&gt;
требуют множества аргументов и загадочного формата командной стро-&lt;br /&gt;
ки. Нет, это не выход. Для ''Festival'' явно нужны простейший графический&lt;br /&gt;
интерфейс с полем для печати слов и большая кнопка «'''ЧИТАТЬ'''». Именно&lt;br /&gt;
его мы и создадим на данном уроке.&lt;br /&gt;
&lt;br /&gt;
===''Python'' и ''Qt''===&lt;br /&gt;
&lt;br /&gt;
Чтобы облегчить себе жизнь, воспользуемся тем же средством быстрой разработки, что и в прошлом месяце – ''Python''. Несмотря на свою скриптовую природу, ''Python'' отлично подходит и для создания приложений с графическим интерфейсом. В нем не нужно беспокоиться о всякой ерунде типа объектов, типов и инициализации, тормозящей&lt;br /&gt;
разработку графических интерфейсов в других языках. Программы на&lt;br /&gt;
''Python'' эффективны и легко модифицируются, и запускать их можно&lt;br /&gt;
немедленно. Полностью работоспособные приложения могут уложиться в несколько строк кода – эквивалентам на ''C'' или ''C++'' потребуется во много раз больше. Однако по умолчанию ''Python'' не предусматривает средств для создания графических интерфейсов. Как и в случае RSS-читалки из прошлого месяца, нужная функциональность обеспечивается добавочными модулями; по части GUI их имеется несколько. Совместно с ''Python'' обычно используются два кросс-платформенных&lt;br /&gt;
инструментария – ''wxWidgets'' и ''GTK'', оба могут быть внедрены в ваш&lt;br /&gt;
собственный ''Python''-скрипт импортированием модулей ''WXPython'' и&lt;br /&gt;
''PyGTK'' в его начале. Но мы-то возьмем ''PyQt'', другой популярный GUI-&lt;br /&gt;
модуль; как следует из названия, он позволяет применять ''Qt'' внутри&lt;br /&gt;
скриптов ''Python''. Тот же инструментарий использован для рабочего&lt;br /&gt;
стола KDE, и его API битком набит возможностями, от вывода 3D-графики до проигрывания музыки. Месяц назад мы делали обзор последнего релиза ''Qt (4.4)'', а команда разработчиков ''PyQt'' уже успела интегрировать эти новшества в последний релиз ''PyQt''. Итак, программисты на ''Python'' получили преимущества нового ''Qt'', включая виджет браузера&lt;br /&gt;
''WebKit''.&lt;br /&gt;
&lt;br /&gt;
Это очень важно для нашего проекта, потому что мы воспользуемся одной из новых возможностей, чтобы заставить ''Festival'' заговорить. Имя ее – ''Phonon'', это мультимедиа-инструментарий KDE4, здорово&lt;br /&gt;
облегчающий работу с мультимедиа-потоками. С самим KDE мы иметь&lt;br /&gt;
дела не будем. ''Phonon'' портирован обратно в ''Qt'', и его функциональность можно применять, обойдясь без разработки полновесного KDE-приложения. До ''Phonon'' не существовало стандарта кросс-платформенного (или даже кросс-интерфейсного) метода работы с аудио- и&lt;br /&gt;
видео-потоками. Это раздражало и делало работу программиста гораздо сложнее, чем надо бы. С ''Phonon'' вам, например, больше не требуется использовать ''DirectMedia'' в Windows, ''QuickTime'' в OS X и ''GStreamer''&lt;br /&gt;
в Linux: он выступает как посредник для этих технологий. Вы пишете&lt;br /&gt;
код для проигрывания, а ''Qt'' выполняет за вас остальную работу, конвертируя ваш запрос в мультимедиа-инструментарий выбранной вами платформы. Та же философия принята и внутри ''Python'', и поэтому мы&lt;br /&gt;
выбрали ''PyQt'' для нашего проекта.&lt;br /&gt;
&lt;br /&gt;
===Приложим руки к ушам===&lt;br /&gt;
&lt;br /&gt;
''Phonon'' так важен для нашего графического интерфейса синтезатора речи, потому что нам нужно контролировать вывод звука самим.&lt;br /&gt;
''Festival'' включает собственную возможность проигрывания, но она&lt;br /&gt;
намертво завязана с древней Open Sound System (OSS). А значит,&lt;br /&gt;
нельзя поделить аудиокарту с другими приложениями, что приводит&lt;br /&gt;
к сбоям работы во многих современных дистрибутивах Linux. Чтобы&lt;br /&gt;
обойти это ограничение, будем записывать вывод от ''Festival'' в звуковой файл, благо что это не так трудно сделать. Наше приложение будет затем воспроизводить его, для чего мы задействуем ''Phonon''.&lt;br /&gt;
&lt;br /&gt;
У этого решения есть два плюса. Во-первых, оно не имеет ограничений, присущих OSS, и с радостью делит аудиокарту с другими приложениями. Во-вторых, пользователь получает возможность перерыва,&lt;br /&gt;
останова и перемотки синтезируемой речи. Этого трудно достичь без&lt;br /&gt;
использования аудиофайла, так как синтез лучше не прерывать на пол-пути. Вывод звука займет лишь доли секунд, затем аудиофайл может быть загружен и проигран. Но все это будет наша Часть 2.&lt;br /&gt;
&lt;br /&gt;
===Часть 1 Создаем графический интерфейс===&lt;br /&gt;
&lt;br /&gt;
Для данной работы важно предусмотреть следующее. Очевидно, понадобятся установленные и работающие ''Python'' и ''Festival'' – см. урок [[LXF108:Да услышьте же RSS!|прошлого месяца]], если у вас возникнут сложности с ними. Еще нам&lt;br /&gt;
необходим ''SIP'' (модуль, создающий привязки ''C'' и ''C++'' с ''Qt'') для ''Python'',&lt;br /&gt;
также как и ''GStreamer'', если они не установлены, а дополнительно – ''Qt 4.4'' и ''PyQt 4.4''. Вы, наверное, уже сможете добавить двоичные пакеты&lt;br /&gt;
для обоих через менеджер пакетов вашего дистрибутива, но во время написания статьи нам пришлось компилировать и устанавливать&lt;br /&gt;
и ''Qt 4.4'', и PyQt 4.4 вручную из исходных кодов, что заняло несколько&lt;br /&gt;
часов. Также вам необходимо убедиться в наличии небольшой утилиты&lt;br /&gt;
командной строки ''pyuic4''; она либо скачивается с исходными кодами&lt;br /&gt;
''PyQt'', либо имеется в отдельном пакете (''pyqt-dev-tools'' для пользователей Debian и Ubuntu).&lt;br /&gt;
&lt;br /&gt;
Итак, приступим к программированию. ''PyQt'' имеет доступ ко всему&lt;br /&gt;
API ''Qt'', поэтому мы можем использовать ''Qt Designer'' для разработки&lt;br /&gt;
пользовательского интерфейса нашего приложения, и создадим в нем&lt;br /&gt;
основное окно нашей программы. Возможно, куда проще сделать это&lt;br /&gt;
вручную, но если вы захотите расширить программу, добавив новые&lt;br /&gt;
возможности и элементы интерфейса, ''Designer'' сделает этот процесс&lt;br /&gt;
интуитивнее.&lt;br /&gt;
&lt;br /&gt;
Если вы установили ''Qt'' из исходных кодов, убедитесь, что переменная окружения '''QTDIR''' указывает на новое место размещения ''Qt 4''.&lt;br /&gt;
Запустите ''Designer'' из командной строки или меню «'''Разработка'''» на&lt;br /&gt;
рабочем столе. Проследуйте через все три этапа (далее) для добавления нужных приложению графических элементов, затем сохраните&lt;br /&gt;
результат в файл в директории проекта. Соглашение требует начинать&lt;br /&gt;
имя файла с '''ui_''', так что определить, где хранится интерфейс пользователя, нетрудно. Файлы ''Designer'' используют XML для описания схемы только что спроектированного приложения, и теперь нам нужно&lt;br /&gt;
сконвертировать его в рабочий код ''Python'' для построения интерфейса. Инструмент для этого преобразования называется ''pyuic4''. Наберите ''pyuic4 ui_fooey.ui &amp;gt; ui_fooey.py'' для создания кода ''Python'' (заменив&lt;br /&gt;
'''fooey''' на имя вашего скрипта)..&lt;br /&gt;
&lt;br /&gt;
Обычно ''pyuic4'' генерирует самостоятельный код, не требующий&lt;br /&gt;
доработки. Но из-за использования ''Phonon'', слишком нового для ''Qt Designer'', нужно отредактировать несколько строк в файле '''ui_filename.py''' вручную. Откройте его в вашем любимом текстовом редакторе и&lt;br /&gt;
просто наберите '''from PyQt4.phonon import Phonon''' в отдельной строке,&lt;br /&gt;
сразу под первой из строк '''from''' в начале файла. Так обеспечивается&lt;br /&gt;
импорт ''Phonon'' из ''PyQt'', и можно использовать его функции совместно с графическим интерфейсом. Поискав ниже, замените три строки, начинающиеся на '''self.progressBar''', на следующие две, и поправьте&lt;br /&gt;
строку '''self.horizontalLayout''', чтобы использовать '''self.seekSlider''':&lt;br /&gt;
&lt;br /&gt;
 self.seekSlider = Phonon.SeekSlider(self.frame)&lt;br /&gt;
 self.seekSlider.setObjectName(“progressBar”)&lt;br /&gt;
 self.horizontalLayout.addWidget(self.seekSlider)&lt;br /&gt;
&lt;br /&gt;
Здесь мы заменили виджет индикатора выполнения на виджет&lt;br /&gt;
''Phonon'', что позволит пользователю передвигать и видеть позицию&lt;br /&gt;
текущего воспроизведения при прослушивании музыкального файла.&lt;br /&gt;
Если бы ''Designer'' поддерживал этот виджет напрямую, данный шаг был&lt;br /&gt;
бы не нужен: мы бы просто перетащили виджет с панели инструментов. Это также означает, что если вы измените компоновку интерфейса&lt;br /&gt;
(в ''Designer'') и снова запустите ''pyuic4'', вам придется осуществить все&lt;br /&gt;
изменения вновь, так как ''pyuic4'' автоматически перезапишет файл при&lt;br /&gt;
генерации кода ''Python''.&lt;br /&gt;
&lt;br /&gt;
Вот и весь код, необходимый графическому интерфейсу. Следующий&lt;br /&gt;
шаг – написание скрипта для использования объектов созданного GUI и&lt;br /&gt;
добавления «разговорной» функциональности ''Festival''.&lt;br /&gt;
&lt;br /&gt;
====Шаг за шагом: Создаем графический интерфейс====&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF109_77_1.jpg|Шаг 1]]&lt;br /&gt;
&lt;br /&gt;
'''1  Основное окно'''&lt;br /&gt;
&lt;br /&gt;
Выберите шаблон '''Main Window''' в стартовом мастере ''Designer''. Перетащите на него с панели инструментов контейнер-рамку и перенесите в нее два виджета '''PushButton: TextEdit''' и '''ProgressBar'''.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF109_77_2.jpg|Шаг 2]]&lt;br /&gt;
&lt;br /&gt;
'''2   Размещение'''&lt;br /&gt;
&lt;br /&gt;
Два раза кликните на кнопки для изменения надписей. Мы используем их для воспроизведения/паузы&lt;br /&gt;
и остановки. Выберите индикатор выполнения и два виджета кнопок, а затем нажмите '''Ctrl+1'''&lt;br /&gt;
и выровняйте их горизонтально.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF109_77_3.jpg|Шаг 3]]&lt;br /&gt;
&lt;br /&gt;
'''3  Компоновка'''&lt;br /&gt;
&lt;br /&gt;
Можете поиграть с компоновкой виджетов, разместив их так, как вам нравится. Удовлетворившись&lt;br /&gt;
результатом, нажмите '''Ctrl+5''' для общего выравнивания по внутренней сетке и сохраните файл&lt;br /&gt;
в директории вашего проекта.&lt;br /&gt;
&lt;br /&gt;
===Часть 2 Логика кода===&lt;br /&gt;
&lt;br /&gt;
{{Врезка | Заголовок=Скорая помощь | Содержание= Не вводите весь&lt;br /&gt;
код за одну сессию. Попробуйте набирать по куску кода, затем запускать для проверки скрипт, чтобы убедиться в его работоспособности. Это упростит отладку.| Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Создайте для остатка нашего скрипта новый текстовый файл. Первым&lt;br /&gt;
делом опишем модули, планируемые к применению. В начале файла&lt;br /&gt;
добавьте следующие четыре строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 import sys, os, time, tempfile&lt;br /&gt;
 from PyQt4 import QtCore, QtGui&lt;br /&gt;
 from PyQt4.phonon import Phonon&lt;br /&gt;
 from ui_fooey import Ui_MainWindow&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая добавляет основную функциональность ''Python''. Модуль&lt;br /&gt;
'''sys''' мы использовали на прошлом уроке, модуль '''os''' обеспечивает&lt;br /&gt;
работу с файлами и путями, '''time''' понадобится нам позже для добавления небольшой задержки, чтобы мы могли дождаться создания&lt;br /&gt;
аудио-файла, а при помощи '''tempfile''' ''Python'' автоматически генерирует&lt;br /&gt;
правильные пути временных файлов в системе. Ниже этой строки мы&lt;br /&gt;
импортируем основные функции ''Qt'' из ''PyQt4'', а еще ниже – импортируем ''Phonon''. Последняя строка импортирует класс GUI, автоматически созданный ''pyuic4'' из нашего файла ''Designer''. Здесь '''ui_fooey''' – имя&lt;br /&gt;
нашего файла, а '''Ui_MainWindow''' – имя класса внутри файла.&lt;br /&gt;
&lt;br /&gt;
Если вы пока не имели дела с именами классов, то их можно представить как обобщение функций, используемое в объектно-ориентированном программировании. Это комбинация данных и функций, их обрабатывающих, сведенная в единую самодостаточную сущность, или «класс». Импорт класса в скрипт ''Python'' обеспечит нам доступ к компоновке интерфейса и уже созданным нами виджетам, а также к данным, хранящимся в этих элементах. Мы получим все это, создав новый&lt;br /&gt;
класс в нашем коде. Под строками импорта добавьте следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 class StartQT4(QtGui.QMainWindow):&lt;br /&gt;
 def __init__(self, parent=None):&lt;br /&gt;
  QtGui.QWidget.__init__(self, parent)&lt;br /&gt;
  self.ui = Ui_MainWindow()&lt;br /&gt;
  self.ui.setupUi(self)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сперва мы создаем новый класс с именем '''StartQt4''' и он описывается как тип '''QMainWindow''' – его же мы создали и в ''Designer''. Это родительский тип окна для всех приложений ''Qt'', и это означает нашу&lt;br /&gt;
возможность управлять окном нашего приложения так же, как и в других программах. Как альтернативу, ''Qt'' включает виджеты диалогов и окон, но они не часто используются в самостоятельных приложениях.&lt;br /&gt;
Команда создания следует за описанием функции с именем '''__init__'''&lt;br /&gt;
без указания класса.&lt;br /&gt;
&lt;br /&gt;
Как и другие функции ''Python'' с похожим названием, она запускается при инициализации объекта и содержит все подпрограммы настройки, которые понадобятся нам для добавления функциональности в&lt;br /&gt;
ранее созданные виджеты. Далее мы говорим этому новому окну, что&lt;br /&gt;
интерфейс пользователя управляется из класса основного окна ('''self.ui = Ui_MainWindow'''), а затем просим ''Qt'' выполнить компоновку графического интерфейса. Теперь передйем к виджетам в основном окне.&lt;br /&gt;
Под кодом, приведенным выше, и на таком же уровне отступов добавьте следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 self.audioOutput = Phonon.AudioOutput(Phonon.&lt;br /&gt;
 MusicCategory, self)&lt;br /&gt;
  self.metaInformationResolver = Phonon.MediaObject(self)&lt;br /&gt;
  self.mediaObject = Phonon.MediaObject(self)&lt;br /&gt;
  self.ui.seekSlider.setMediaObject(self.mediaObject)&lt;br /&gt;
  Phonon.createPath(self.mediaObject, self.audioOutput)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данный участок кода содержит конфигурацию ''Phonon'' и настройки нашего приложения. ''Phonon'' использует несколько соединений для&lt;br /&gt;
подключения источников, которые мы хотим проиграть, с устройством, на котором мы хотим их проигрывать. Этого достигают первые&lt;br /&gt;
несколько строк вышеприведенного кода, создавая путь к аудиовыходу через '''audioOutput''' и метаданные, необходимые ''Phonon'' для распознавания вида проигрываемого содержимого. Мы связали все это с индикатором проигрывания в графическом интерфейсе и соединили объекты друг с другом. На данном этапе при запуске программы&lt;br /&gt;
''Phonon'' уже находится в стадии готовности к воспроизведению и ждет&lt;br /&gt;
сигнала к началу работы. Чтобы сделать что-то интересное, добавьте&lt;br /&gt;
следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 self.connect(self.ui.pushButton2, QtCore.SIGNAL(‘pressed()’),&lt;br /&gt;
 self.mediaObject, QtCore.SLOT(‘stop()’))&lt;br /&gt;
 self.connect(self.ui.pushButton1, QtCore.SIGNAL(‘pressed()’),&lt;br /&gt;
 self.playPause)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тех, кто не привык к ''Qt'' (как, впрочем, и искушенных программистов), эти строки озадачат: здесь применен механизм слотов и сигналов ''Qt''. Сигналы и слоты действуют как указания для управления&lt;br /&gt;
событиями внутри приложения, прокладывая причинно-следственную&lt;br /&gt;
связь между различными функциями и объектами программы. Эти&lt;br /&gt;
связи возникают, когда пользователь нажимает на иконку '''Сохранить Файл''' или кликает правой кнопкой мыши на виджет '''TextEdit''', и многие события уже имеют соединения по умолчанию. Так, ползунок ''Playback''&lt;br /&gt;
автоматически обновляет свое положение в зависимости от места&lt;br /&gt;
проигрывания аудио-файла, а виджет основного окна '''Resize''' автоматически информирует механизм компоновки о необходимости пере&lt;br /&gt;
рисовки дисплея. В верхней строке мы велим приложению вызвать&lt;br /&gt;
функцию '''Phonon stop() (слот)''', когда кнопка '''pushButton2''' будет нажата&lt;br /&gt;
'''[pressed()] (сигнал)'''. Следующая строка вызывает похожую функцию,&lt;br /&gt;
только в этом случае мы соединяем сигнал кнопки '''pushButton1''' со слотом – функцией '''playPause'''. Ее-то мы сейчас и напишем.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 def playPause(self):&lt;br /&gt;
     if self.mediaObject.state() == Phonon.PlayingState:&lt;br /&gt;
      self.mediaObject.pause()&lt;br /&gt;
    elif self.mediaObject.state() == Phonon.PausedState:&lt;br /&gt;
     self.mediaObject.play()&lt;br /&gt;
    else:&lt;br /&gt;
     os.popen(‘echo “’ + str(self.ui.textEdit.toPlainText()) + ‘” | festival_client --ttw &amp;gt; ‘ + tmpfile, “r”)&lt;br /&gt;
     time.sleep(0.2)&lt;br /&gt;
     self.mediaObject.setCurrentSource(Phonon.MediaSource(str(tmpfile)))&lt;br /&gt;
     self.mediaObject.play()&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Отступы в '''def''' нужны такие же, как в '''__init__''', где мы начали класс&lt;br /&gt;
'''StartQt4'''. Это наша реализация слота '''playPause''', и данный код запустится, когда пользователь нажмет на кнопку '''Play/Pause''', поэтому мы сперва проверяем состояние проигрывания внутри кода. Если воспроизведение уже идет, мы ставим его на паузу командой '''self.mediaObject.pause''';&lt;br /&gt;
если же оно приостановлено, мы возобновляем его. При обнаружении&lt;br /&gt;
состояния, отличного от этих, мы подразумеваем, что проигрывание&lt;br /&gt;
было остановлено, а слова в текстовом редакторе – изменены. Тогда&lt;br /&gt;
мы запускаем в командной строке '''festival_client''', передаем содержимое текстового поля ('''self.ui.textEdit.toPlainText''') и перенаправляем вывод звукового потока во временный файл. Для этого мы используем&lt;br /&gt;
команду ''Python os.popen''. Она берет строку внутри кавычек как аргумент и запускает команду от имени приложения. На время выполнения команды программа останавливается, но нужно подождать несколько секунд для обновления файловой системы, что обеспечивается строкой '''time.sleep(0.2)'''. Затем мы используем этот WAV-файл как&lt;br /&gt;
источник для объекта проигрывания ''Phonon'' и немедленно начинаем&lt;br /&gt;
воспроизведение.&lt;br /&gt;
&lt;br /&gt;
Осталось сделать только одну вещь: прибрать за собой (э, откуда&lt;br /&gt;
тут этот временный файл?) и написать функцию''' main''' приложения – ту,&lt;br /&gt;
что запускается первой при его старте.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
  if __name__ == “__main__”:&lt;br /&gt;
   app = QtGui.QApplication(sys.argv)&lt;br /&gt;
   app.setApplicationName(“Speech Synth”)&lt;br /&gt;
   tmpfile = tempfile.mktemp(suffix=’.wav’)&lt;br /&gt;
   os.popen(‘touch ‘ + tmpfile)&lt;br /&gt;
   myapp = StartQT4()&lt;br /&gt;
   myapp.show()&lt;br /&gt;
   try:&lt;br /&gt;
    sys.exit(app.exec_())&lt;br /&gt;
   except SystemExit:&lt;br /&gt;
    pass&lt;br /&gt;
   os.remove(tmpfile)&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
    &lt;br /&gt;
Первая строка данного кода не должна иметь отступа. Это главная подпрограмма, которая выполнится при запуске нашего скрипта,&lt;br /&gt;
эквивалент ‘'''int main()'''’ в ''C'' и ''C++''. В ней мы генерируем интерфейс из&lt;br /&gt;
ранее созданного объекта и даем ему имя приложения. Далее мы переходим к созданию временного файла для сохранения «сырых» аудио-&lt;br /&gt;
данных вывода ''Festival''. В Linux это обычно директория '''/tmp''' в вашем&lt;br /&gt;
корневом разделе, и мы используем ранее импортированный модуль&lt;br /&gt;
'''tempfile''', чтобы автоматически назначить корректный путь к временной&lt;br /&gt;
директории для файла, который нам необходимо создать. Мы также&lt;br /&gt;
снабжаем файл расширением '''.wav''', чтобы ''Phonon'' знал, какой вид данных он проигрывает. Затем мы запускаем в командной строке '''touch'''&lt;br /&gt;
для создания пустого файла, который ''Phonon'' будет использовать&lt;br /&gt;
как источник для воспроизведения. Наконец, запускаем приложение&lt;br /&gt;
и показываем графический интерфейс. Приложение теперь зациклено; оно ожидает, когда пользователь закроет его с помощью кнопки в&lt;br /&gt;
заголовке окна. Когда это произойдет, мы отловим событие в операторе '''try''' и дадим скрипту ''Python'' удалить временный файл перед выходом из программы.&lt;br /&gt;
&lt;br /&gt;
Сохраните этот файл и запустите ''Festival'' в режиме сервера:&lt;br /&gt;
''‘festival --server’''. Теперь выполните скрипт, набрав python '''fooey.py'''.&lt;br /&gt;
Вам будет предоставлен графический интерфейс на ''Qt'' с полем для&lt;br /&gt;
ввода текста. Нажатие на '''Play''' пошлет текст в ''Festival'', а файл результата – назад в ''Phonon'', который затем его проиграет. Вы можете ставить на паузу и перематывать файл вперед и назад, используя ползунок. Если у вас кризис идей – что бы такое еще добавить? – гляньте на наш список задач; а кто внесет в программу какие-нибудь грандиозные дополнения, сообщите нам. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
===Список задач===&lt;br /&gt;
* Кэшировать вывод речи, чтобы одинаковый текст не требовал повторного преобразования, когда пользователь нажимает '''stop/play'''.&lt;br /&gt;
* Существует проблема безопасности в использовании '''tempfile''' (он может быть подделан). Решение – использовать '''tempfile.mktemp'''&lt;br /&gt;
* Перехватывать вывод с ''Festival'' напрямую и использовать его как исходные данные для проигрывания.&lt;br /&gt;
* Добавить в интерфейс чтение и запись файлов.&lt;br /&gt;
* Обеспечить больший контроль над ''Festival'', включая возможность изменять голос диктора.&lt;br /&gt;
* Использовать ''Phonon'' для добавления эффектов в аудиовывод, например, реверберации, задержки и сдвига тона.&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>