Fisalia
*мошки кяюкают прям за окном, в Годвилле какие-то стрёмные боги допытываются, замужем ли мы...*
Таверна "Луч солнца голубого"
Сообщений 561 страница 580 из 1000
Поделиться5612012-07-01 13:05:51
Поделиться5622012-07-01 13:35:33
Я просто оставлю это здесь.
raven cler 19:02
Начинаем. В отдельном чатике.
Максим Пасечник 19:02
каком?
raven cler 19:02
Здесь, плин.
Максим Пасечник 19:03
ок)
raven cler 19:03
Так... Вводная лекция. От которой проку нет, но без которой никуда. Ненавижу вводные лекции.
raven cler 19:04
Значит, сразу хочу предупредить, первое: сохраняй всё написанное где-нибудь в блокноте у себя, чтобы потом можно было легко найти.
Максим Пасечник 19:05
ок
raven cler 19:07
Второе: если я говорю что-то писать, значит нужно брать и переписывать вручную, а не калцать "Копировать-Вставить". Если потом ты будешь писать что-то чисто для себя(а я надеюсь, что будешь), то делай как хочешь. А тут лучше печатать. Думаю, понятно почему?
Максим Пасечник 19:07
да
raven cler 19:09
Так вот. Начнем с истории программирования как такового или сразу к конкретному языку?
Максим Пасечник 19:10
давай сразу к языку,историю я и сам могу почитать)а как ты считаешь нужным?
raven cler 19:12
Я считаю, что историю надо бы прочитать хотя бы ради базовых понятий, дабы понять остальное. Но начнем с теории конкретного языка, как он работает, для чего предназначен, и всё такое, а если что-то будет непонятно, то можно и более подробно историю рассмотреть.
Максим Пасечник 19:12
ок
raven cler 19:14
Итак, как я уже говорил, будем учить язык под названием Python, так же известный как питон, пайтон и просто змеиный. Так же, когда дойдем до основ веб-разработки(а я искренне надеюсь, что дойдем), можно освоить javascript, хтмл и прочее. Последний вообще раз плюнуть освоить.
raven cler 19:16
Ага. Вот что ещё хотелось бы обозначить. У нас тут, конечно, не школа, поэтому никаких домашних заданий, контрольных и прочей хрени нет. Но каждое следующее занятие я буду задавать по паре вопросов из предыдущего. Думаю, ясно зачем.
Максим Пасечник 19:16
хорошо)
raven cler 19:17
Итак. Первый вопрос, на который стОит ответить, это : Почему Python вообще используюст? Зачем он нужен. Или, грубо говоря, чем он отличается от других языков.
raven cler 19:20
Во-первых, исходный код на нём легко читать. Ибо как говорил создатель языка - программирование есть технический процесс, а не средство самовыражения. Если один Python-программист посмотрит на написанное другим Python-программистом, он сразу всё поймет. Чего не скажешь о том же Perl или чистом С.
raven cler 19:21
Во-вторых, программы на питоне пишутся очень быстро. Обычно от трех до пяти раз быстрее, чем на том же С++. А иногда и больше.
raven cler 19:23
Так же он очень ценен как кроссплатформенный язык. Иными словами, программу, написанную для, скажем, Linux, перенести на Windows очень легко. Код практически всегда будет одним и тем же.
raven cler 19:25
И, наконец, он очень хорошо совместим с другими языками. То есть программа, написанная на питоне запросто может использовать куски кода из библиотек С++, java и многих других языков.
raven cler 19:27
Ну, и, наконец, он банально быстро учится, он удобен, и он востребован. Что тоже немаловажно.
raven cler 19:27
Тут всё понятно?
Максим Пасечник 19:27
да
raven cler 19:28
Но, спрашивается, если змеиный такой офигенный, почему многие программы пишутся на С? И в чем основной недостаток питона, как ты думаешь?
Максим Пасечник 19:29
Не знаю(
raven cler 19:31
Недостаток, грубо говоря, один: программы, которые на нём написаны, работают медленней. Для современный машин это не принципиально, разумеется. И даже для не совсем современных. Но всё равно существуют такие области, в которых скорость является важнее удобства разработки. Например, для написания драйверов.
raven cler 19:33
Но сам язык довольно универсален, и может применяться для большого количества задач.
raven cler 19:33
Даже для программирования математических и иных научных вычислений.
raven cler 19:34
Небольшие игры,органайзеры, проигрыватели - всё это можно писать.
raven cler 19:35
Так... Этот участок рассмотрели? Всё понятно?
Максим Пасечник 19:36
Да.
raven cler 19:36
Короче, подытоживая всё вышесказанное: программы на змеином быстрее пишутся, но медленней работают.
raven cler 19:37
Значит, качаем и устанавливаем.
raven cler 19:38
http://python.org/ftp/python/3.2.3/python-3.2.3.msi - 32-битная версия для Windows. http://python.org/ftp/python/3.2.3/pyth … .amd64.msi - 64.
raven cler 19:38
Думаю, кнопку "далее" нажимать не составит труда. Перекур.
raven cler 19:42
Установил?
Максим Пасечник 19:42
да
raven cler 19:43
Следовательно, рассмотрим что именно ты установил и как именно программы написанные на змеином работают.
raven cler 19:44
Прежде всего, ты установил так называемый интерпритатор.
raven cler 19:45
Грубо говоря, это модуль, который просто выполняет другие программы. Он просто читает программу, и, разумеется, выполняет её инструкции.
raven cler 19:47
Программа на языке Python с точки зрения программиста представляет собой обычный текстовый файл. Например:
raven cler 19:47
print('Hello, world!')
raven cler 19:48
Это полный текст программы Hello, world!, с которой и начинается написание чего-либо на любом языке. Просто ведь!
raven cler 19:49
Файлы программ на питоне имеют расширение *.py Если мы возьмём исходник какой-то программы, и там будут файлы с таким расширением - то это именно ОН.
raven cler 19:50
Саму "Здравствуй, мир!", мы пока запускать не будем, мы сначала разберемся как программы работают.
raven cler 19:51
Теперь как запуск этого самого "Здравствуй, мир!" выглядит с точки зрения непосредственно компьютера.
raven cler 19:53
Как только мы отдаем текст программы(который называется "исходный код) на исполнение, интерпритатор Python одну за одной обрабатывает каждую команду и переводит её в так называемый байт-код.
raven cler 19:54
Такой файл просто будет выполняться быстрее чем исходник, и иметь расширение *.pyc
raven cler 19:56
Потом этот самый файл .pyc будет отдан на исполнение так называемой "Виртуальной машине Python", или просто PVM.
raven cler 19:57
И вот именно она и занимается выполнением самой программы.
raven cler 19:58
Тут может возникнуть вопрос: "А как же *.exe, который программа?".
raven cler 19:58
Для этого существуют специальные упаковщики, которые сделают экзешник из непосредственно файла программы, так же засунув туда саму виртуальную машину.
raven cler 20:00
У этой модели есть ещё один недостаток: даже небольшая программа будет занимать несколько мегабайт. Разумеется, недостаток явно не в месте на диске, несколько мегабайт - это не размер даже для современных флешек.
raven cler 20:01
Но если мы напишем, скажем, небольшой вирус... Типичной домохозяйке обычно трудно поверить, что файл в 50 Кб - это страшный вирус, а не картинка. А вот файл в несколько мегабайт - уже вполне может быть.
raven cler 20:01
Чайник закипел. И собака что-то чудит. Отойду на две минуты.
Максим Пасечник 20:01
ок
raven cler 20:07
Итак.
raven cler 20:08
С теорией, которой сегодня получилось довольно дофига, вроде как потихоньку заканчиваем. Вопросы есть?
Максим Пасечник 20:08
нету
raven cler 20:08
Так-с... Переползаем к практике и к гребаному hello, world!
raven cler 20:09
Ты сейчас под виндой?
Максим Пасечник 20:09
да
raven cler 20:10
Значит, после установки в меню "Пуск - Все программы" у тебя должен появиться пункт "Python 3.2".
raven cler 20:11
Есть такой?
Максим Пасечник 20:11
есть
raven cler 20:11
Запускай оттуда пункт IDLEМаксим Пасечник 20:12
запустил
raven cler 20:13
Сначала посмотрим на некую "пасхалку", то есть вывод так называемого дзена питон. Или такой себе философии языка.
raven cler 20:13
Для этого введи туда просто:
raven cler 20:13import this
Максим Пасечник 20:14
ввел
raven cler 20:14
Получил кучу английского текста? Кстати, инглиш знаешь?
Максим Пасечник 20:15
1)ПОлучил2)Не знаю((((((
raven cler 20:15
Вопщем, переводится вся эта ересь так:
raven cler 20:15Красивое лучше, чем уродливое
Явное лучше, чем неявное
Простое лучше, чем сложное
Сложное лучше, чем запутанное
Плоское лучше, чем вложенное
Разреженное лучше, чем плотное
Читаемость имеет значение
Особые случаи не настолько особые, чтобы нарушать правила
При этом практичность важнее безупречности
Ошибки никогда не должны замалчиваться
Если не замалчиваются явно
Встретив двусмысленность, отбрось искушение угадать
Должен существовать один — и, желательно, только один — очевидный способ сделать это
Хотя он поначалу может быть и не очевиден, если вы не голландец
Сейчас лучше, чем никогда
Хотя никогда зачастую лучше, чем прямо сейчас
Если реализацию сложно объяснить — идея плоха
Если реализацию легко объяснить — идея, возможно, хороша
Пространства имён — отличная штука! Будем делать их побольше!Максим Пасечник 20:16
)
raven cler 20:16
Так. C пасхалкой разобрались.
raven cler 20:18
Так же можно запустить командную строку питона. Или вбить в обычной командной строке C:\Python32\python
получим один результат - запуск интерпретатора.
raven cler 20:19
Позже будет неплохо обзавестись удобным текстовым редактором с подсветкой синтаксиса(я использую vim). Но это уже потом.
raven cler 20:20
Ну, соответственно, вводим туда(хоть в командную строку, хоть в IDLE)print('hello world')
raven cler 20:20
Перепечатываем. Пробелов не ставим.
Максим Пасечник 20:21
написал
raven cler 20:22
Вот и наша первая программа. Не впечатляет, знаю. Но сразу можно отметить, как просто и коротко она выглядит.
raven cler 20:23
На паскале для получения такого же результата понадобилось бы ввестиbegin
Writeln('Hello, World!')
end.raven cler 20:23
На С:#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}raven cler 20:24
На С++ :#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
}raven cler 20:24
И так далее.
raven cler 20:25
Так... Ну, для разнообразия можем заставить интерпритатор что-нибудь посчитать.
raven cler 20:25
Значит, введем:
Максим Пасечник 20:25
давай)
raven cler 20:26print (2+2)
print ('2+2')raven cler 20:27
Как видим, в первой строке мы получаем ответ, во второй - просто текст 2+2.
raven cler 20:27
Для этого и служат одинарные кавычки. Это называется "Экранирование".
Максим Пасечник 20:27
Это уже прикольней)
raven cler 20:28
Дальше ещё прикольней. Вбиваем, например:print(2**8)
raven cler 20:28
И получаем рассчет 2 в восьмой степени.
raven cler 20:29
Так же можно посчитать, скажем, пять в десятой.
raven cler 20:31
Если вобьём
print(2*8)
Или
print(5-3)
То тоже получим рассчет. Можно использовать интерпритатор питон как калькулятор)))raven cler 20:31
Движемся дальше?
Максим Пасечник 20:31
lf)
Максим Пасечник 20:31
да)
raven cler 20:32
А дальше стоит остановить внимание на такой штуке, как комментарии.
raven cler 20:34
Грубо говоря, это текст, который видит человек, но не видит программа. В комментариях мы можем писать всё, что угодно. Хоть нецензурную лексику, хоть ACII рисунки. Служат они прежде всего для того, чтобы когда ты или другой программист открывает программу, в ней можно было быстрее разобраться. Ну, или попросту для удобства программиста.
raven cler 20:35
В питоне коментарий - это строка, написанна после символа #raven cler 20:36
Попробуй ввести что-то вроде#print(5*10)
И посмотри, что произойдет.
Максим Пасечник 20:36
ничего)
Максим Пасечник 20:36
не произошло
raven cler 20:37
Вот именно. Ровным счетом ничего. А текст есть. И человек может его прочитать. Комментарии не играют для программы абсолютно никакой роли.
raven cler 20:39
Так вот. На чем мы ещё не остановили внимание. Ты мог обратить внимание, что выполняется не текст большой программы, а всё делается построчно. Ввёл строчку - получил результат.raven cler 20:39
Это называется "Интерактивный режим".
raven cler 20:40
Разумеется, даже довольно маленькую программу в нём не напишешь.
raven cler 20:40
Но и он может быть полезен.
raven cler 20:41
Например, если ты уже знаешь язык, и находишь в исходном коде какой-то программы непонятную строчку, ты просто вводишь её в интерактивном режиме и смотришь, что она делает.
raven cler 20:43
Так же в интерактивном режиме нельзя причинить вреда своей системе(ну, хотя, если постараться, то можно), что тоже полезно. Например, при тестировании чего-либо.
raven cler 20:45
А вот на многострочных программах мы остановимся чуть позже. Какую-то небольшую базу, я так полагаю, мы сегодня всё-таки разобрали. Заканчиваем?
Максим Пасечник 20:45
а ты как думаешь??
raven cler 20:46
Да, наверное. Почти два часа уже занимаемся.
raven cler 20:46
Хоть и с перекурами
Максим Пасечник 20:46
Ну тогда заканчиваем)
raven cler 20:46
Так, ну, в завершение. Следующее занятие, наверное, стоит провести завтра, так?
Максим Пасечник 20:47
Даааа)
Максим Пасечник 20:48
А во сколько завтра??
raven cler 20:49
Так. Вопщем, готовься отвечать на пару вопросов по этому. Это первое. И второе, заранее хочется сказать, что если тебе просто надоест, никогда не поздно меня послать. Так мы сэкономим время нас обоих. Поскольку программирование явно не даёт умение взламывать систему Пентагона левой пяткой и даже не даёт ошеломительный успех у женщин, имеет смысл заниматься только если самому это нравится.
raven cler 20:50
Всё. Удачи. До завтра тогда.
Максим Пасечник 20:50
Если бы мне это не нравилось,я бы тебя не задрачивал каждый день об учебе)
Максим Пасечник 20:50
Тебе тоже удачи,СПАСИБО ЗА ЛЕКЦИЮ))До завтра.
raven cler 20:51
Ну кто его знает. Как пойдет в процессе. Мало ли. Очень многие просто хотят сходу писать "клёвые игра типа асассинс крид", но не хотят ничему постепенно учиться. Вот. Если хочется самостоятельно чем-то заняться, можешь почитать статью о Python в википедии.
Максим Пасечник 20:52
ок)
raven cler 20:53
Там довольно много изложено, кстати. Но мы это всё в любом случае рассмотрим.
raven cler 20:54
Ладно, всё. Пока. Спасибо за внимание.
Максим Пасечник 20:54
Пока,тебе спасибо за лекцию,до затвра)
Отредактировано Птенчик (2012-07-01 13:43:09)
Поделиться5632012-07-01 13:55:16
Это полный текст программы
Натурно? О___о
А чё такой маленький? XDD - *это было выражение весёлого удивления*
Дочитали до дзена, Фиса упёрто тянет гулять в лес, пока не гадкое солнце, придём (а это вероятно случится уже завтра) - почитаем ))
Отредактировано Noitarebrever (2012-07-01 13:55:43)
Поделиться5642012-07-01 14:29:04
А чё такой маленький?
Потому, что она просто выводит текст"Hello, world!". Там дальше даны примеры этой же программы на трёх языках. Можно ещё дать хардкорный пример на LISP.
Бытует мнение, что первое существо, которое создал Бог говорило только "Здравствуй, мир!" и умирало.
Поделиться5652012-07-01 14:30:07
(eval (cons (quote mapcar)
(cons (cons (quote function)
(cons (quote princ) ()))
(cons (cons (quote quote)
(cons (cons #\H (cons #\e (cons #\l (cons #\l (cons #\o
(cons #\, (cons #\Space
(cons #\w (cons #\o (cons #\r (cons #\l (cons #\d (cons #\!
()))))))))))))) ())) ()))))
Поделиться5662012-07-01 14:44:41
Возникает вопрос: а ты что думала? Что на первом занятии я дам что-нибудь такое:
import gtk, pygtk, os, pango
pygtk.require('2.0')
from Translator import t
from Dialogs import AboutDialog, PreferencesDialog, SavePlaylistDialog
from Playlist import PlaylistFrame
from FileBrowser import FilesFrame
from Model import audioTypes, gtkTrick
from AlbumCover import AlbumImage, Globalversion = '0.3.3'
_ = t.getTranslationFunc()columns = [_('Name'), '#', _('Title'), _('Artist'),
_('Album'), _('Genre'), _('Year'), _('Add')]defaultSettings = {'audiosink': 'autoaudiosink',
'statusicon': 0,
'#': True,
_('Title'): True,
_('Artist'): True,
_('Album'): True,
_('Genre'): True,
_('Year'): True,
'lastplaylist': True,
'foldercache': True,
'scrobbler': False,
'user': '',
'pwdHash': '',
'fakepwd': '',
'view': 0
}class View(gtk.Window):
"""Main GTK+ window"""
formatDict = {'mp3': True, 'wma': True, 'ogg': True, 'flac': True,
'm4a': True, 'mp4': True, 'aac': True, 'wav': True,
'ape': True, 'mpc': True, 'wv': True}
def __init__(self, model, control):
gtk.Window.__init__(self)
self.model = model
self.control = control
self.set_title('CometSound')
self.control.registerView(self)
# Create the toplevel window
self.connect('destroy', lambda w: self.destroy())
self.minwidth = 733 #int(self.get_screen().get_width() / 2.5)
self.minheight = 420 #int(self.get_screen().get_height() / 2.5)
self.previousWidht = 733
self.previousHeight = 420
try:
self.width, self.height, framepos, self.volume = self.control.readWinSize()
except:
self.width = self.minwidth
self.height = self.minheight
framepos = int(self.minwidth * 0.7)
self.volume = 10
self.set_size_request(self.minwidth, self.minheight)
self.resize(self.width, self.height)
self.set_position(gtk.WIN_POS_CENTER)
self.connect('expose-event', self.storeSize)
self.icon = gtk.Image()
self.icon.set_from_file("images/icon.png")
self.pix = self.icon.get_pixbuf().scale_simple(48, 48, gtk.gdk.INTERP_BILINEAR)
self.set_icon(self.pix)
self.tray = None
self.createSlider()
self.createPrimaryToolbar()
self.setStatusIcon()
self.columns = columns
self.filesTree = FilesFrame(self.model, self.control, self.formatDict, self.columns)
self.playlistFrame = PlaylistFrame(self.control)
self.framebox.pack1(self.filesTree)
self.framebox.pack2(self.playlistFrame, False, False)
self.framebox.set_position(framepos)
self.control.createPlaylist()
# Create a progress bar to show during the model creation
self.progressBar = gtk.ProgressBar()
self.progressBar.set_properties('min-horizontal-bar-height', 10)
sbar = gtk.Statusbar()
sbar.set_size_request(0,14)
self.statusbar = sbar
self.vbox.set_spacing(0)
self.vbox.pack_start(self.menubar, False)
self.vbox.pack_start(self.imageToolbar, False)
self.vbox.pack_start(self.hbox, False)
self.vbox.pack_start(self.framebox, True)
self.vbox.pack_start(sbar, False)
self.show_all()
if self.control.settings['scrobbler']:
self.scrobblerButton.show()
else:
self.scrobblerButton.hide()
self.filesTree.setModel(self.model)
self.filesTree.treeview.grab_focus()
if self.model.getAudioFileList()[1] != 'Group':
self.control.refreshTree()
if self.model.playlist != None:
self.control.playStopSelected()
try:
gtkTrick()
self.changeView(None, None, self.control.settings['view'])
except:
pass
def createPrimaryToolbar(self):
"""Builds the toolbar of menus and the section
that shows the track informations"""
self.vbox = gtk.VBox()
self.add(self.vbox)
self.hbox = gtk.HBox()
self.framebox = gtk.HPaned()
# Create a UIManager instance
uimanager = gtk.UIManager()# Add the accelerator group to the toplevel window
accelgroup = uimanager.get_accel_group()
self.add_accel_group(accelgroup)# Create an ActionGroup
actiongroup = gtk.ActionGroup('UIManagerExample')
self.actiongroup = actiongroup
# Create actions
actiongroup.add_actions([('Quit', gtk.STOCK_QUIT, _('_Quit'), None, _('Quit the program'), self.quit),
('Open', gtk.STOCK_OPEN, _('_Open folder...'), None, _('Open media folder'), self.control.openFolder),
('Preferences', gtk.STOCK_PREFERENCES, _('Preferences'), '<Control>P', _('Change settings'), self.openPreferences),
('File', None, _('_File')),
('RadioBand', None, _('Fil_ters')),
('Play/Stop', gtk.STOCK_MEDIA_PLAY, None, None, _('Play selection'), self.control.playStopSelected),
('Previous', gtk.STOCK_MEDIA_PREVIOUS, None, None, _('Previous'), self.control.previousTrack),
('Next', gtk.STOCK_MEDIA_NEXT, None, None, _('Next'), self.control.nextTrack),
('Playlists', None, _('Playlists')),
('PlaylistsFolder', None, _('Open folder...'), None, None, self.openPlaylistFolder),
('View', None, _('_View')),
('Help', None, _('_Help')),
('About', gtk.STOCK_ABOUT, _('About CometSound'), None, _('About CometSound'), self.showAboutDialog)
])
actions = self.control.readPlaylists()
uilist = ''
for act in actions:
actiongroup.add_actions([(act, None, act, None, None, self.control.loadPlaylist)])
uilist = uilist + '<menuitem action="%s"/>' % (act)# Create ToggleActions
list = []
for type in audioTypes:
label = type[1:].capitalize()
actiongroup.add_toggle_actions([(label, None, label, None, None,self.control.toggleFilter, True)], None)
list.append(label)
list.sort()
uitogglelist = ''
for label in list:
uitogglelist = uitogglelist + '<menuitem action="%s"/>' % (label)
try:
viewNum = self.control.settings['view']
a = viewNum + 5
except:
self.control.settings['view'] = 0
viewNum = 0
actiongroup.add_radio_actions([('Tree View', None, _('File View'), None, _('File System visualization'), 0),
('List View', None, _('List View'), None, _('List visualization'), 1),
('Tag View', None, _('Tag View'), None, _('Tag based visualization'), 2),
('Small View', None, _('Small View'), None, _('Small visualization'), 3)], viewNum, self.changeView)# Add the actiongroup to the uimanager
uimanager.insert_action_group(actiongroup, 0)# Add a UI description
uimanager.add_ui_from_string('''<ui>
<menubar name="MenuBar">
<menu action="File">
<menuitem action="Open"/>
<menuitem action="Preferences"/>
<menuitem action="Quit"/>
</menu>
<menu action="View">
<menuitem action="Tree View"/>
<menuitem action="List View"/>
<menuitem action="Tag View"/>
<menuitem action="Small View"/>
<menu action="RadioBand">'''
+ uitogglelist +
'''</menu>
</menu>
<menu action="Playlists">
<menuitem action="PlaylistsFolder"/>'''
+ uilist +
''' </menu>
<menu action="Help">
<menuitem action="About"/>
</menu>
</menubar>
<toolbar name="ImageToolBar">
<toolitem action="Open"/>
</toolbar>
<toolbar name="ToolBar">
<toolitem action="Previous"/>
<toolitem action="Play/Stop"/>
<toolitem action="Next"/>
<separator/>
<separator name="sep1"/>
</toolbar>
</ui>''')
self.actiongroup = actiongroup
self.uimanager = uimanager
# Create a MenuBar
self.menubar = uimanager.get_widget('/MenuBar')
toolbar = uimanager.get_widget('/ToolBar')
imageToolbar = uimanager.get_widget('/ImageToolBar')
#toolbar.set_size_request(170, 50)
# Create an Image to show the album's cover
self.image = AlbumImage()
box = gtk.HBox()
box.pack_start(self.image, True)
box.set_border_width(6)
tv = gtk.ToolItem()
tv.add(box)
imageToolbar.insert(tv, 0)
# Create a Label to show track info
self.label = gtk.Label()
self.label.set_justify(gtk.JUSTIFY_LEFT)
self.label.set_alignment(0, 0)
self.label.set_padding(9, 10)
self.label.set_ellipsize(pango.ELLIPSIZE_END)
#self.label.set_line_wrap(True)
box = gtk.HBox()
box.pack_start(self.label, True)
#box.pack_start(gtk.Label(), False)
tl = gtk.ToolItem()
tl.add(box)
tl.set_expand(True)
imageToolbar.insert(tl, 1)
# Create a button to control player volume
self.volumeButton = gtk.VolumeButton()
self.volumeButton.set_value(self.volume)
self.volumeButton.connect('value-changed', self.control.playerThread.onVolumeChanged)
tv = gtk.ToolItem()
tv.add(self.volumeButton)
imageToolbar.insert(tv, 3)
self.scrobblerButton = gtk.Button()
self.scrobblerButton.set_relief(gtk.RELIEF_NONE)
self.scrobblerButton.unset_flags(gtk.CAN_FOCUS)
sIcon = gtk.Image()
sIcon.set_from_file("images/love.png")
si = sIcon.get_pixbuf().scale_simple(28, 28, gtk.gdk.INTERP_BILINEAR)
sIcon.set_from_pixbuf(si)
self.scrobblerButton.add(sIcon)
self.scrobblerButton.set_tooltip_text(_('Love this track (last.fm)'))
self.scrobblerButton.connect('clicked', self.control.playerThread.love)
tv = gtk.ToolItem()
tv.add(self.scrobblerButton)
imageToolbar.insert(tv, 2)
tl = gtk.ToolItem()
tl.add(self.slider)
tl.set_expand(True)
toolbar.insert(tl, -1)
tl = gtk.ToolItem()
l = gtk.Label()
l.set_size_request(19,0)
tl.add(l)
toolbar.insert(tl, 3)
tl = gtk.ToolItem()
l = gtk.Label()
l.set_size_request(9,0)
tl.add(l)
toolbar.insert(tl, 0)
tl = gtk.ToolItem()
l = gtk.Label()
l.set_size_request(12,0)
tl.add(l)
toolbar.insert(tl, -1)
tl = gtk.ToolItem()
l = gtk.Label()
l.set_size_request(7,0)
tl.add(l)
imageToolbar.insert(tl, -1)
self.imageToolbar = imageToolbar
self.hbox.pack_start(toolbar, True)
def updatePlaylistsMenu(self, newPlaylist):
self.actiongroup.add_actions([(newPlaylist, None, newPlaylist, None, None, self.control.loadPlaylist)])
merge_id = self.uimanager.new_merge_id()
self.uimanager.add_ui(merge_id, 'ui/MenuBar/Playlists', newPlaylist, newPlaylist, gtk.UI_MANAGER_MENUITEM, False)
def changeView(self, radioaction, current, value = None):
self.filesTree.removeTagToolbar()
self.filesTree.treeview.get_column(0).set_title(_('Name'))
if not value:
value = current.get_current_value()
if value == 3:
self.previousWidht = self.width
self.previousHeight = self.height
self.framebox.hide()
self.statusbar.hide()
self.set_size_request(self.minwidth - 100, 200)
self.resize(self.minwidth - 100, 200)
self.set_resizable(False)
elif value == 0:
self.filesTree.setStore(self.filesTree.treeStore)
elif value == 1:
self.filesTree.setStore(self.filesTree.listStore)
elif value == 2:
self.filesTree.createTagView()
if value != 3:
self.filesTree.setCurrentStoreNum(value)
if self.control.settings['view'] == 3:
self.framebox.show()
self.statusbar.show()
self.set_size_request(self.minwidth, self.minheight)
self.resize(self.previousWidht, self.previousHeight)
self.set_resizable(True)
self.control.settings['view'] = value
def createSlider(self):
"""Creates the slider to show the player progress"""
self.adjustment = gtk.Adjustment(0.0, 0.00, 100.0, 0.1, 1.0, 1.0)
hscale = gtk.HScale(self.adjustment)
hscale.set_digits(2)
hscale.set_update_policy(gtk.UPDATE_CONTINUOUS)
hscale.set_value_pos(gtk.POS_RIGHT)
hscale.connect('value-changed', self.control.playerThread.onSliderChange)
hscale.connect('button-press-event', self.control.sliderClickPress)
hscale.connect('button-release-event', self.control.sliderClickRelease)
hscale.connect('format-value', self.control.sliderFormat)
self.slider = hscale
self.slider.set_sensitive(False)
def createButton(self, imageStock, tooltip, func, data = None):
Icon = gtk.Image()
Icon.set_from_stock(imageStock, gtk.ICON_SIZE_SMALL_TOOLBAR)
B = gtk.Button()
B.add(Icon)
B.set_tooltip_text(tooltip)
B.connect("clicked", func, data)
return B
def setStatusIcon(self):
"""Builds the status icon"""
pix = self.pix
try:
mode = self.control.settings['statusicon']
except:
mode = 0
if self.tray != None:
self.tray.set_visible(False)
if mode != 2:
self.tray = gtk.StatusIcon()
pix = pix.scale_simple(20, 20, gtk.gdk.INTERP_BILINEAR)
self.tray.set_from_pixbuf(pix)
self.tray.connect('popup-menu', self.openMenu)
self.tray.connect('activate', self.minimize)
statusMenu = gtk.Menu()
if self.control.settings['statusicon'] == 0:
self.menulabel = gtk.MenuItem(self.label.get_text())
statusMenu.append(self.menulabel)
sep = gtk.SeparatorMenuItem()
sep.show()
statusMenu.append(sep)
statusPlay = gtk.CheckMenuItem(_('Play'))
statusPlay.set_active(self.control.playerThread.playing)
statusPlay.show()
statusMenu.append(statusPlay)
statusPlay.connect('toggled', self.control.playStopSelected)
self.statusPlay = statusPlay
next = gtk.MenuItem(_('Next'))
next.show()
statusMenu.append(next)
next.connect('activate', self.control.nextTrack)
previous = gtk.MenuItem(_('Previous'))
previous.show()
statusMenu.append(previous)
previous.connect('activate', self.control.previousTrack)
quit = gtk.MenuItem(_('Quit'))
quit.show()
statusMenu.append(quit)
quit.connect('activate', self.quit)
self.statusMenu = statusMenu
def openMenu(self, icon, event_button, event_time):
"""Shows the status icon"""
if self.label.get_text() != '\n\n' and self.control.settings['statusicon'] == 0:
self.statusMenu.remove(self.menulabel)
self.menulabel = gtk.MenuItem(self.label.get_text())
self.statusPlay.disconnect_by_func(self.control.playStopSelected)
self.statusPlay.set_active(self.control.playerThread.playing)
self.statusPlay.connect('toggled', self.control.playStopSelected)
self.menulabel.show()
self.statusMenu.prepend(self.menulabel)
self.statusMenu.popup(None, None, gtk.status_icon_position_menu,
event_button, event_time, self.tray)
def minimize(self, obj = None):
if self.get_visible():
self.hide()
else:
self.show()
def openPreferences(self, obj = None):
try:
p = PreferencesDialog(self.columns, self.control, self.control.settings)
except:
self.control.settings = defaultSettings
p = PreferencesDialog(self.columns, self.control, defaultSettings)
def openPlaylistFolder(self, widget, data=None):
"""Opens the folder of the saved playlists"""
cacheDir = os.path.join(os.environ.get('HOME', None), ".CometSound")
dir = os.path.join(cacheDir, 'playlists')
if not os.path.exists(dir):
os.makedirs(dir)
os.system('xdg-open %s' % dir)
def savePlaylistDialog(self, widget, data=None):
d = SavePlaylistDialog(self.control)
def getFormatDict(self):
return self.formatDict
def setButtonPlay(self):
"""Sets the button to "play" during playing"""
self.actiongroup.get_action('Play/Stop').set_stock_id(gtk.STOCK_MEDIA_PLAY)
self.actiongroup.get_action('Play/Stop').set_tooltip(_('Play'))
def setButtonPause(self):
"""Sets the button to "pause" """
self.actiongroup.get_action('Play/Stop').set_stock_id(gtk.STOCK_MEDIA_PAUSE)
self.actiongroup.get_action('Play/Stop').set_tooltip(_('Pause'))
def storeSize(self, widget, event):
all = widget.get_allocation()
self.width, self.height = all.width, all.height
def showAboutDialog(self, o):
ad = AboutDialog(self.icon, version)
def quit(self, obj = None):
self.destroy()
def destroy(self):
"""Handles the program shutdown"""
self.hide()
gtkTrick()
self.control.playerThread.stop()
self.control.playerThread.updater.terminate()
Global.stop = True
self.control.saveCache()
pos = self.framebox.get_position()
volume = self.control.playerThread.getVolume()
if self.control.settings['view'] != 3:
self.control.saveWinSize(self.width, self.height, pos, volume)
else:
self.control.saveWinSize(self.previousWidht, self.previousHeight, pos, volume)
self.control.writeSettings(self.control.settings)
if self.control.playerThread.isAlive():
self.control.playerThread.terminate()
gtk.main_quit()
Много бы вы там поняли?
Поделиться5672012-07-02 14:59:26
Алиер тут единственный, кроме меня поймет фишку с метеоритным дождем х)
Десять минут и до меня дошло)
Сегодня мой мозг необычайно быстр. Я даже сходил, наконец, и заплатил за интернет, спустя десять дней после его отключения за неуплату.
Поделиться5682012-07-02 16:39:17
Текст второй лекции кину чуть позже. Алисы, вы ж учтите, что сложность наростает, аки в какой RPG, и чем позже вы появитесь, тем меньше будет шанс что-то понять.
Поделиться5692012-07-02 17:27:06
Идём мы себе домой. На небе - тучки, на земле - лужи, тени расплылись и рассеился свет, а температура +15-20. Прелесть! Идём себе идём, идём себе идём, подходим к перекрёстку. На второстепенной дороге, вдоль который мы шли, грузовик поворачивает на дорогу, которую нам надо проходить - и стоит: типа, можно бежать. Прямо рядом чуть слева в угол зрения размеренно вплывает голубиное пуховое перо. Недоступив шаг по направлению к дороге, поворачиваюсь и поднимаю упавшее на асфальт перышко - простое голубиное перышко. Простояв у дороги (без светофора и со стёршейся зеброй) минуты полторы, улучаем момент минимума окружающих машин и перебегаем дорогу.
Мысли типа "Это определённо неспроста!". Идём и думаем, как изменился бы ход истории, если бы мы это пёрышко просто проводили бы взглядом; что произошло в той вселенной, которая возникла в тот момент, когда мы подняли перо - в той вселенной, где мы перо не подняли; кто бы попал в аварию, а где случился бы ураган, сколько жертв и каковы убытки... Нафантазировали уйму красивых исходов, историй, диалогов и развязок, в которых всенепременно участвовал Странник, Птенчик (птенчик же!) и наши старшие сёстры. Перо видоизменялось, как и изначальное стечение обстоятельств, и так незаметно мы добрались до дома, приближаясь, вспомнив вопрос изначальный: "А что бы было бы, если бы не?"
Вхожу домой, включаю свет - свет со вспышкой, щелчком и огненными искрами падает на ковёр и гаснет.
И, наконец, мы вспоминаем, какое сегодня число. Точнее, что сегодня именно это число, которое наступило....
Вот и думаем теперь, произошли бы все эти обстоятельства по отдельности, если бы по отдельности **
Сетра, с днём варенья ^ . ^
Поделиться5702012-07-02 17:42:52
FisaliaУправилась XDD
Алиер Мирмарский
Няшка, мы тебя потеряли уже))
Потому, что она просто выводит текст"Hello, world!".
Мы не совсем уж чайник в программировании х) И знаем не глянув дальше (ну, секунд тридцать назад было это "не глянув"), что вот в Си было бы строк 5, в паскале - 3, и не говоря уже про лиспоподобные. Тут - одна фраза. Без вступлений-окончаний и скобок. Что по сравнению с ранее изученным коротко, ясно и без лишних церемоний. Что няшно. Что удивило х)
Много бы вы там поняли?
*выпендрёжа ради пялится в код и пытается извлечь что-то познавательное х))*
Поделиться5712012-07-02 18:05:37
Сетра, с днём варенья ^ . ^
ага, спасибо.
Поделиться5722012-07-02 19:37:27
ясно и без лишних церемоний. Что няшно. Что удивило х)
Поделиться5732012-07-02 20:09:29
Няшка, мы тебя потеряли уже))
Я... немного заработался. И наверное снова пропаду
Поделиться5742012-07-02 23:40:00
Так-с... Сегодня лекции не было. Ребята! Господа! И дамы, разумеется.
Я уже обращался с подобной просьбой в прошлом году. Но сейчас, как я понял, всё даже несколько серьёзней.
Кому не сложно, перейдите по ссылочке, найдите кнопочку "Оргия Праведников - Наша родина СССР", и проголосуйте за эту песенку.
Это действительно очень нужно.
Поделиться5752012-07-03 08:17:37
Птенчик
done.
Поделиться5762012-07-03 09:51:18
SetraDeGrave
Фак. Как тыкнуть тебе плюсик? Не тыкаетсо.
Ладно. Напишем письмо чем-нибудь полезным.
Поделиться5772012-07-03 16:06:49
простите, что долго небыл. Небыло нета). Всем хаи саи!
Надеюсь ничего не пропустил?
Поделиться5782012-07-03 16:08:45
как ваше ничего?
Поделиться5792012-07-03 16:33:27
Пост напишу завтра.
Поделиться5802012-07-03 20:42:46
Тёмный странник
Таверна "Луч солнца голубого"
проголосуй, если не впадлу.