Каждый человек как начинающий программист или как обычный пользователь перед собой должен сделать выбор, на каком оборудовании ему работать. Очевидно, что чем лучше оно будет, тем комфортнее, продуктивнее процесс.
Например, есть большая разница, если сравнить работу на Pentium 2 и на другом 4-х ядерном ПК. Понятное дело, что пентиум второй при использовании современных программ будет очень часто зависать и вообще никак не потянет загрузку оконной оболочки калькулятора. Я уже молчу о вычислении 2+2 🙂
ПК, которые имеют 4-х ядерный процессор более работоспособны и для разработки приложений профессионалы используют именно такой тип оборудования, или мощнее.
Но это не всё. Также важную роль играет и программное обеспечение, которое установлено. Самым главным является ОС. (операционная система)
Лично я пробовал шесть ОС, из них долгое время отработал на трёх. Среди них Ubuntu (и её другие модификации как XUbuntu, KUbuntu…), OpenSuse, LinuxMint, Windows (xp и 7), AltLinux (вот это вот не посоветовал бы), ну и конечно же MacOS.
Из всего перечисленного в работе побывал Windows, Ubuntu (стандартная, gnome), в данный момент практикую MacOs и буду дальше работать только с ним, надеюсь.
Для разработки, как вы уже поняли, MacOs будет самым лучшим вариантом. Из опыта скажу, что это система неубиваема, выдерживает очень сильные нагрузки, никаких глюков и подвисаний. То есть система действительно стоит тех денег, которые хочет за неё получить разработчик.
На втором месте я бы поставил Ubuntu. Данная система хороша, отлично подходит для тех, у кого нету средств для покупки Apple ПК. Данная система бесплатная и в ней есть очень много также бесплатных продуктов, среди которых есть инструменты для разработки под различные языки программирования.
Ну и на самом дне конечно же виндовс. При том любой. Хоть ХР, хоть седьмой — разница есть, разве что в дизайне, а так это «макаронное решето» для вирусов. А вирусы настолько малы, что их в микроскоп не всегда видно… Поэтому можно сделать вывод, что наличие данного решета как то бесполезно. Что с ним, что без него — одинаково. Иди и ломай.
Вера в Касперского
Народ в общей массе, установив данный не бесплатный продукт становится полностью уверен, что никакие вредоносные программы больше не смогут попасть в систему. Но свойственно это ламерам, как правило. Если вам не известна система работы антивирусника, то расскажу вкратце:
Есть вирус, его поймала «лаборатория Касперского» (звучит эффектно), которая занимается изучением вируса (возможно декомпиляция и тд). Затем из программного кода вируса, который увидели, делают выводы, алгоритм ликвидации вируса а также всей его проделанной работы, насколько это возможно. Затем вирус добавляется в базу данных касперского. Только после этой процедуры наш любимый Антивирусник умеет удалять вирус той версии, которая попадала в лабораторию. Следовательно, если вирус не был в лаборатории, то он не будет пойман!
Каждый день какие нибудь школьники сделают сотнями эти вирусы и сомневаюсь в том, что все они проходят через лабораторию. Только лишь особо старые могут там появиться. И причина возможности работы вредоносных программ — файловая система виндовса. То есть на линуксе и на MacOS не возможно то, что возможно для вирусов на Windows.
Там ещё много интересного, но боюсь, что этого достаточно, чтобы не работать с виндовсом.
Лично я, практикуя MacOs устанавливаю виртуальный виндовс, через который запускаю какие либо программы, аналог которых нету в других ОС. Соблюдая правило «не ходить в интернет через виндовс на те сайты, где над
Платье крючком в технике Брюгского кружева

Стильное и эффектное платье связано крючком, в технике Брюгского кружева. Особый шарм ему придает яркий алый цвет и кокетливый бант из атласной ленты.
Автор: Ангелина
Дата публикации: 2012-06-05T22:55:00.001+03:00
Печь-камин для дачи
Главная особенность печей-каминов для дачи Л. Смирновой и С. Экономова — их необычная конструкция. Топка камина с дымовой камерой находится непосредственно над топкой печи. Основанием каминной топки является чугунная кухонная плита со съемными кругами. В случае необходимости топка камина может использоваться как варочная камера.
Топочная дверка находится под камином с задней стороны и выходит в другое помещение. Дымовые газы печи проходят по боковым каналам, а затем попадают в насадную трубу камина, расположенную над дымовой камерой.
wxPython in Action. Глава 9. Возможность выбора. Диалоги. (часть 1)
В этой главе рассказывается о том, как:
- создавать модальные диалоговые окна и окна с сообщениями
- использовать стандартные диалоги
- создавать помощников
- показывать советы при запуске
- создавать и использовать валидаторы
9.1 Работа с модальными диалогами
9.1.1 Как создать модальный диалог
import wx
class SubclassDialog(wx.Dialog):
def __init__(self): #инициируем диалог
wx.Dialog.__init__(self, None, -1, 'Dialog Subclass',size=(300, 100))
okButton = wx.Button(self, wx.ID_OK, "OK", pos=(15, 15))
okButton.SetDefault()
cancelButton = wx.Button(self, wx.ID_CANCEL, "Cancel",pos=(115, 15))
if __name__ == '__main__':
app = wx.PySimpleApp()
dialog = SubclassDialog()
result = dialog.ShowModal() #показываем модальный диалог
if result == wx.ID_OK:
print "OK"
else:
print "Cancel"
dialog.Destroy()
- когда нажимается wx.Button с ID равным wx.ID_OK, диалог закрывается и в точку вызова ShowModal() возвращается значение wx.ID_OK
- аналогично действует нажатие на кнопку со значением wx.ID_CANCEL, возвращающая соответствующее значение
после чего приложению остаётся лишь корректно обработать значения кнопок.
9.1.2 Как вывести пользователю сообщение?
Листинг 9.2
import wx
if __name__ == "__main__":
app = wx.PySimpleApp()
# с использованием классов
dlg = wx.MessageDialog(None, "Is this explanation OK?",
'A Message Box',wx.YES_NO | wx.ICON_QUESTION)
retCode = dlg.ShowModal()
if (retCode == wx.ID_YES):
print "yes"
else:
print "no"
dlg.Destroy()
# с использованием функции
retCode = wx.MessageBox("Is this way easier?", "Via Function",
wx.YES_NO | wx.ICON_QUESTION)
Используем класс wx.MessageDialog
| Стиль | Описание |
|---|---|
| wx.CANCEL | Добавляет кнопку «отменить» с идентификатором wx.ID_CANCEL |
| wx.NO_DEFAULT | Если установлен флаг wx.YES_NO, то кнопкой по умолчанию будет «нет» |
| wx.OK | Добавляет кнопку «да» с идентификатором wx.ID_OK |
| wx.YES_DEFAULT | Если установлен флаг wx.YES_NO, то кнопкой по умолчанию будет «да». Такая настройка применяется по умолчанию |
| wx.YES_NO | Добавляет кнопки «да» и «нет» со значениями wx.ID_OK и wx.ID_NO соответственно |
Вторая группа флагов отвечает за знак, который будет отображён рядом с текстом:
| Стиль | Описание |
|---|---|
| wx.ICON_ERROR | Знак ошибки |
| wx.ICON_EXCLAMATION | Восклицательный знак |
| wx.ICON_HAND | То же, что и wx.ICON_ERROR |
| wx.ICON_INFORMATION | Знак информационного сообщения (буква i) |
| wx.ICON_QUESTION | Вопросительный знак |
Использование функции wx.MessageBox()
В этом примере message,caption и style имеют те же значения, что и в конструкторе класса и Вы можете использовать те же самые флаги стиля. Как Вы увидите дальше в этой главе, многие из предустановленных диалогов имеют схожие функции для их быстрого вызова. Пока Вы планируете использовать диалог всего один раз, можете спокойно выбирать любой из этих двух способов. Но если Вы хотите сохранить диалог в памяти для дальнейшего использования — лучше создать собственный экземпляр. Однако для таких простых диалогов, как наш, экономии времени Вы, конечно, не достигните.
й текст (например, лицензию) Вы можете использовать доступный только для Python класс wx.lib.dialogs.ScrolledMessageDialog, использующий такой конструктор:
wx.lib.dialogs.ScrolledMessageDialog(parent, msg, caption, pos=wx.wxDefaultPosition, size=(500,300))
Этот класс не использует встроенные диалоги, а конструирует свой из доступных виджетов. Он отображает только кнопку «ОК» и не принимает флагов стиля.
9.1.3 Как получить короткий текст от пользователя?
Листинг9.3
import wx
if __name__ == "__main__":
app = wx.PySimpleApp()
dialog = wx.TextEntryDialog(None,
"What kind of text would you like to enter?",
"Text Entry", "Default Value", style=wx.OK|wx.CANCEL)
if dialog.ShowModal() == wx.ID_OK:
print "You entered: %s" % dialog.GetValue()
dialog.Destroy()
- wx.GetTextFromUser()
- wx.GetPasswordFromUser()
- wx.GetNumberFromUser()
wx.GetTextFromUser(message, caption=»Input text», default_value=»», parent=None)
Все значения в этом примере идентичны конструктору класса. Если пользователь нажимает «ок», то функция возвращает введёный текст, иначе Вы получите пустую строку.
Для получения пароля надо использовать функцию wx.GetPasswordFromUser():
wx.GetPasswordFromUser(message, caption=»Input text», default_value=»», parent=None)
И тут с аргументами у Вас не должно возникнуть проблем. Вводимый текст, как понятно, заменяется звёздочками. Возвращаемые значения аналогичны предыдущей фу
wxPython in Action. Глава 9. Возможность выбора. Диалоги. (часть 2)
9.2 Использование стандартных диалогов
9.2.1 Диалог выбора файла
Листинг 9.6
import wx
import os
if __name__ == "__main__":
app = wx.PySimpleApp()
wildcard = "Python source (*.py)|*.py|"
"Compiled Python (*.pyc)|*.pyc|"
"All files (*.*)|*.*"
dialog = wx.FileDialog(None, "Choose a file", os.getcwd(),
"", wildcard, wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
wx.FileDialog(parent, message=»Choose a file», defaultDir=»», defaultFile=»», wildcard=»*.*», style=0, pos=wx.DefaultPosition)
message содержит заголовок диалога, defaultDir указывает на каталог, который будет отображён при открытии диалога. Если он не указан или установлен на несуществующий каталог, то будет показано содержимое рабочего каталога. defaultFile содержит название файла и обычно используется при сохранении файлов. wildcart устанавливает фильтры файлов, доступных для выбора, причём в нем можно использовать шаблоны * и ?. В аргументе может содержаться как один шаблон, например *.py, так и набор шаблонов в таком формате: <описание> | <шаблон> | <описание> | <шаблон>, как в листинге выше:
«Python source (*.py)|*.py|Compiled Python (*.pyc)|*.pyc| All files (*.*)|*.*»
Если Вы используете набор шаблонов, то они будут доступны через выпадающий список, как на рисунке 9.6. И ещё, нет никакой гарантии, что аргумент pos будет учитываться конкретной ОС.
Выбор файла
Диалог, используемый для открытия файла может содержать ещё два флага стиля, а именно wx.HIDE_READONLY, не позволяющий открыть файл в режиме «только для чтения», и wx.MULTIPLE, который позвол
яет выбрать несколько файлов в одной директории.
Для диалога сохранения есть один полезный флаг — wx.OVERWRITE_PROMT, который требует подтверждения от пользователя при его попытке перезаписать уже существующий файл.
Другие типы диалога могут использовать флаг wx.CHANGE_DIR. При его наличии выбор файла изменяет директорию по умолчанию для этого диалога на директорию, содержащую этот файл. Так что в следующий раз открытый диалог уже будет находиться в той директории и для этого Вам не надо сохранять где-либо её название.
В отличие от других диалогов, рассмотренных выше, все эти свойства доступны для чтения и записи при помощи соответствующих методов. Это касается свойств directory, filename, style, message и wildcard, для который существуют соответствующие Get- и Set- методы.
После того, как пользователь закрыл диалог и Вы убедились, что он сделал это кнопкой «ОК», Вы можете получить выбранный им файл с помощью метода GetPath(), возвращающего полное имя и путь к файлу в виде строки. Если Вы использовали флаг wx.MULTIPLE, то Вам потребуется метод GetPaths(), который вернёт Вам список из строк. Если же по какой-то причине Вам надо знать, какой фильтр при этом использовался, то метод GetFilterIndex() вернёт Вам индекс этого фильтра. Для программного изменения выбранного фильтра используйте метод SetFilterIndex().
Кроме того, Вы можете использовать следующую функцию вместо создания экземпляра класса:
wx.FileSelector(message, default_path=»», default_filename=»», default_extension=»», wildcard=»*.*'', flags=0, parent=None, x=-1, y=-1)
Назначение почти всех аргументов понятно из названия, кроме flags — обычно он называется style и default_extension, указывающий на расширение, которое будет добавлено к имени файла при его сохранении. Если пользователь нажимает на «ОК», Вы получите путь к файлу, иначе Вам достанется лишь пустая строка.
Выбор папки
Вызов этого диалога несколько проще, чем диалога для выбора файла, как видно из листинга 9.7:
Листинг 9.7
import wx
if __name__ == "__main__":
app = wx.PySimpleApp()
dialog = wx.DirDialog(None, "Choose a directory:",
style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
wx.DirDialog(parent, message=»Choose a directory», defaultPath=»», style=0, pos = wx.DefaultPosition, size = wx.DefaultSize, name=»wxDirCtrl»)
Поскольку message отображается в самом диалоге, Вам нет необходимости (да по всей видимости и возможности — прим. переводчика) в изменении заголовка диалога. defaultPath указывает выбор по умолчанию, пустая строка в данном случае будет означать корень файловой системы. pos и size игнорируются в Windows, а name игнорируется во всех ОС. Флаг стиля wx.DD_NEW_DIR_BUTTON добавляет кнопку создания новой папки, причём он может не работать в старых версиях Winows.
Свойства path, message и style имеют стандартный методы получения и установки. После закрытия диалога можно получит выбранное значение методом GetPath(). Кроме того, вызвать диалог можно и с помощью функции:
wx.DirSelector(message=wx.DirSelectorPromptStr, default_path=»», style=0, pos=wxDefaultPosition, parent=None)
Аргументы аналогичны конструктору класса. Функция возвращает путь к папке в виде строки или пустую строку, если была нажата кнопка отмены.
9.2.2 Диалог выбора шрифта
wxPython in Action. Глава 9. Возможность выбора. Диалоги. (часть 3)
9.3 Создание мастеров
import wx
import wx.wizard
# создаём простую страницу
class TitledPage(wx.wizard.WizardPageSimple):
def __init__(self, parent, title):
wx.wizard.WizardPageSimple.__init__(self, parent)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.sizer)
titleText = wx.StaticText(self, -1, title)
titleText.SetFont(
wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
self.sizer.Add(titleText, 0,
wx.ALIGN_CENTRE | wx.ALL, 5)
self.sizer.Add(wx.StaticLine(self, -1), 0,
wx.EXPAND | wx.ALL, 5)
if __name__ == "__main__":
app = wx.PySimpleApp()
# создаём экземпляр мастера
wizard = wx.wizard.Wizard(None, -1, "Simple Wizard")
# создаём страницы мастера
page1 = TitledPage(wizard, "Page 1")
page2 = TitledPage(wizard, "Page 2")
page3 = TitledPage(wizard, "Page 3")
page4 = TitledPage(wizard, "Page 4")
page1.sizer.Add(wx.StaticText(page1, -1,
"Testing the wizard"))
page4.sizer.Add(wx.StaticText(page4, -1,
"This is the last page."))
# задаём последовательность страниц
wx.wizard.WizardPageSimple_Chain(page1, page2)
wx.wizard.WizardPageSimple_Chain(page2, page3)
wx.wizard.WizardPageSimple_Chain(page3, page4)
# задаём размер мастера
wizard.FitToPage(page1)
# запускаем мастера
if wizard.RunWizard(page1):
print "Success"
- Для наполнения мастера мы создаём страницы, которые содержат только фиксированный текст. Вы, скорее всего, захотите добавить сюда ещё какие-то элементы, например, для получения данных от пользователя.
- Функция wx.wizard.WizardPageSimple_Chain() является более простым способом построения последовательности, чем вызов методов SetNext() и SetPrev() страниц, переданных ей в качестве аргументов.
- Вызов FitToSize() устанавливает размер мастера на основании страницы, переданной ему в качестве аргумента, и всех страниц, доступных от неё по цепочке. Поэтому, вызывайте этот метод лишь после того, как установите последовательность страниц.
- Аргументом метода wizard.RunWizard() служит страница, с которой начинается запуск мастера. Причём мастер сам понимает, что надо завершиться, когда он доходит до страницы, для которой не установлена следующая страница. Значение True возвращается только если пользователь прошёл все страницы и нажал в конце «Завершить».
Создание экземпляра wx.wizard.Wizard — первый шаг в использовании мастера. Конструктор класса выглядит так:
wx.wizard.Wizard(parent, id=-1, title=wx.EmptyString, bitmap=wx.NullBitmap, pos=wx.DefaultPosition)
В нашем примере parent, id, title и pos имеют тот же смысл, что и в конструкторе wx.Panel. Если передан аргумент bitmap, то он будет отображаться на каждой странице. Из доступных флагов стиля есть только wx.WIZARD_EX_HELPBUTTON, который отображает кнопку помощи. Это флаг расширенного стиля и его надо устанавливать используя двухступенчатый механизм, описанный в главе 8.
Обычно, для установки размера Вы будете использовать FitToSize(), как в нашем примере, но ничто не мешает Вам задать размер самому с помощью метода SetPageSize(), передав ему в качестве аргумента кортеж или экземпляр wx.Size. Для получения текущего размера используется метод GetPageSize(). В любом случае размер будет использоваться лишь для той части мастера, которая предназначена для отображения страниц, сам мастер будет большего размера (например, из-за кнопок «далее» и «назад» — прим. переводчика).
Контролировать работу мастера можно с помощью его же методов: метод GetCurrentPage() возвращает отображаемую страницу, если же мастер ещё не запущен он вернёт None. Определить, имеет ли текущая стра
ница следующую или предыдущую можно с помощью методов HasNextPage() и HasPrevPage(). Для запуска мастера используется метод RunWizard(), как видно из нашего листинга.
Мастер продуцирует командные события, которые Вы сами можете перехватывать и обрабатывать; они перечислены в таблице ниже. Каждое из этих событий относится к классу wx.wizard.WizardEvent, для которого доступно два метода. GetPage() вернёт нам страницу, на которой было создано событие, а GetDirection() вернёт True, если пользователь движется вперёд по мастеру, и False в другом случае.
| Событие | Описание |
|---|---|
| EVT_WIZARD_CANCEL | Создаётся, когда пользователь нажимает кнопку «отмена». Это событие может быть отменено с помощью метода Veto(). В таком случае диалог не завершит работу. |
| EVT_WIZARD_FINISHED | Создаётся, когда пользователь нажимает кнопку «готово» в конце мастера. |
| EVT_WIZARD_HELP | Создаётся, когда пользователь нажимает кнопку справки |
| EVT_WIZARD_PAGE_CHANGED | Создаётся после смены страницы для постобработки |
| EVT_WIZARD_PAGE_CHANGING | Создаётся когда пользователь нажал на кнопку изменения страницы, но страница ещё не изменилась. Это событие так же может быть отменено с помощью Veto(), например, если пользователь заполнил не все поля. |
wx.wizard.WizardPageSimple(parent=None, prev=None, next=None)
Опять же, если Вы не хотите задавать их при создании — используйте методы SetPrev() и SetNext(). Если же и с этим у Вас возникают проблемы — Вам поможет функция wx.wizard.WizardPageSimple_Chain(), которая устанавливает взаимосвязь между двумя страницами.
Более сложная версия страниц мастера, wx.wizard.WizardPage, немногим отличается от рассмотренного нами. Но вместо того, чтобы явно устанавливать последовательность страниц, она предоставляет методы, позволяющие определить более сложную логику следования по мастеру. Конструктор класса выглядит так:
wx.WizardPage(parent, bitmap=wx.NullBitmap, resource=None)
Заданный аргумент bitmap переопределяет свой аналог в конструкторе мастера. resource позволяет загрузить страницу из ресурсов wxPython. Для реализации логики следования переопределите методы GetPrev() и GetNext(), чтобы они возвращали то, что надо делать дальше. Обычно это используется в случаях, когда последовательность страниц определяется ответами пользователя.
9.4 Отображение подсказок при запуске
Листинг 9.12
import wx
if __name__ == "__main__":
app = wx.PySimpleApp()
provider = wx.CreateFileTipProvider("tips.txt", 0)
wx.ShowTip(None, provider, True)
wx.CreateFileTipProvider(filename, currentTip)
filename — имя файла, содержащего эти советы. currentTip — индекс отображаемого совета (нумерация идёт с 0). Приложение само должно хранить эту информацию между запусками.
Файл с советами — это простой текстовый файл, где каждый совет занимает ровно одну строчку. Пустые линии пропускаются, так же как и линии, начинающиеся с #. Вот пример содержания такого файла:
Создавать советы очень легко.
Feel the force, Luke.
Поставщик советов (tip provider) является экземпляром класса wx.PyTipProvider. Если Вам нужно больше функциональности, Вы можете определить свой подкласс класса wx.TipProvider и переопределить его метод GetTip().
За отображение советов ответственна функция wx.ShowTip(). wx.ShowTip(parent, tipProvider, showAtStartup)
parent — родительское окно, при наличии, а tipProvider — это то, что мы создали на предыдущем шаге. showAtStartup отвечает за то, стоит ли галочка в чекбоксе «показывать при старте», но при этом она не следит, отказался ли пользователь от них — это Вы должны проверить сами. Функция возвращает значение этого чекбокса, так что Вы можете использовать его при следующем запуске вашего приложения, если, конечно, сохраните это значение.
Автор: Ishayahu Lastov











